2013-01-24 10 views
5

私は、cronジョブとして実行され、定期的にGoogleショッピングAPI経由で商品リストを更新するPHPスクリプトの作業を開始しています。GSC_ClientとoAuth2へのアクセス

私はGSC Client library for PHPをダウンロードし、トークンを取得するまでにはGoogle Shopping API documentationを処理しようとしています。しかし、URLを生成した後にトークンを実際に要求する方法に関して、ドキュメントのどこかに足りない一歩があるように感じます。

ここでは、これまでに私のコードです:

require ("./lib/shoppingclient/GShoppingContent.php"); 

const G_MERCHANT_ID  = '**********'; 
const G_CLIENT_ID  = '**********'; 
const G_CLIENT_SECRET = '**********'; 

$obj_client = new GSC_Client (G_MERCHANT_ID); 

// Obtain an OAuth2 token to access the API with 
$obj_token = new GSC_OAuth2Token (G_CLIENT_ID, G_CLIENT_SECRET, USER_AGENT); 

$str_url = $obj_token -> generateAuthorizeUrl ('urn:ietf:wg:oauth:2.0:oob'); 
echo ($str_url . PHP_EOL); 

/* @var $obj_response _GSC_Response */ 
$obj_response = $obj_token -> makeAuthenticatedRequest (curl_init ($str_url)); 
echo ($obj_response); 

私はコマンドラインから上記を実行すると、私が手:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=blah-blah-blah-etc-etc-etc ...

<HTML> 
<HEAD> 
<TITLE>Unauthorized</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Unauthorized</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 

Fatal error: Uncaught exception 'GSC_TokenError' with message 'invalid_request' in /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php on line 624 

GSC_TokenError: invalid_request in /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php on line 624 

Call Stack: 
    0.0002  321888 1. {main}() /var/samba/GoogleShoppingTest/logintest.php:0 
    0.0065 1446196 2. GSC_OAuth2Token->makeAuthenticatedRequest() /var/samba/GoogleShoppingTest/logintest.php:19 
    0.2797 1446684 3. GSC_OAuth2Token->refresh() /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php:722 
    0.3992 1448152 4. GSC_OAuth2Token::raiseFromJson() /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php:565 

私は」かなり確かにCURLオブジェクトを初期化する必要はないはずですが、どうやって取得するのか分かりません生成されたURLを解析して実際の応答に変換します。

generateAuthorizeUrl()で生成されたURLにアクセスすると、許可を求めるボタンが表示されたページが表示されます。私がそれをすると、私が知る限り、有効なトークンを持ったページが得られます。

しかし、これは明らかにユーザーにボタンをクリックして許可を与えてもらうことを頼むことができないので、明らかに私はどこかのトラックから外れています。

GSC_Clientを完全自動スクリプトでOAuthと連携させることができた人はいますか?もしそうなら、私はここで間違って何をしていますか?

UPDATE:このアプリケーションでは、APIタイプを「インストール済みアプリケーション」として設定しました。これは、このアプリケーションの正しいAPIタイプと思われます。これは、スクリプトに共有秘密情報を提供し、https://localhostまたはurn:ietf:wg:oauth:2.0:oobをURLとして使用することを意味します。

UPDATE 2:GSCクライアントのサポートライブラリがサーバー間シナリオをサポートしているとは思いません。私が秘密鍵の認証方法を使用したい場合、さらなる研究ではGoogle APIs client libraryが必要であることが示されています。

これは私がこれまでに書くことができたコードです:

require ("./lib/google/oauthclient/Google_Client.php"); 
require ("./lib/google/shoppingclient/GShoppingContent.php"); 

const G_MERCHANT_ID  = '********'; 
const G_CLIENT_ID  = '********'; 
const G_CLIENT_EMAIL = '********'; 
const G_CLIENT_KEY_PATH = '/path/to/the/privatekey.p12'; 
const G_CLIENT_KEY_PW = 'notasecret'; 

$obj_client_auth = new Google_Client(); 
$obj_client_auth -> setApplicationName ('test'); 
$obj_client_auth -> setClientId (G_CLIENT_ID); 
$obj_client_auth -> setAssertionCredentials (new Google_AssertionCredentials (
     G_CLIENT_EMAIL, 
     array (OAUTH_SCOPE), 
     file_get_contents (G_CLIENT_KEY_PATH), 
     G_CLIENT_KEY_PW)); 

$obj_client_auth -> getAuth() -> refreshTokenWithAssertion(); 

// Get a token 
$obj_token = json_decode ($obj_client_auth -> getAccessToken()); 
print_r ($obj_token); 

私は上記のコードを実行すると、私はお返しに、以下に似た何かを得る:

stdClass Object 
(
    [access_token] => ya29.AHES6ZRJohl2AfbQCKbFxNlagSqLGcjHwiylqASX1ygmwg 
    [expires_in] => 3600 
    [created] => 1359123809 
) 

私は推測していますこれは有効なアクセストークン応答です。

しかし、GSC_Clientライブラリで返されたトークンを使用する方法はまだわかりません。私はこれらの両方のライブラリがGoogleから始まったことを知っていますが、私は、彼らがお互いに何かをしていることはほとんどない別のチームによって開発されたという印象を得ています。 。誰かがここで何をすべきかを知っていれば、あなたが持っているかもしれないアドバイスに感謝します。

UPDATE 3

私は実際にGoogleからのデータをプルするのOAuthライブラリを使用するために管理してきましたが、それは、ショッピングの検索APIからです。ショッピングのためにContent APIを使用して商品リストを操作する必要があります。 contribディレクトリでさえ、そのためのoAuthライブラリを提供するクラスは存在しないようです。

FYI、ここでは検索APIリクエスト(マイナス定数)を行うコードです:

$obj_client_auth = new Google_Client(); 
$obj_client_auth -> setApplicationName ('test'); 
$obj_client_auth -> setClientId (G_CLIENT_ID); 
$obj_client_auth -> setAssertionCredentials (new Google_AssertionCredentials (
     G_CLIENT_EMAIL, 
     array (
      //'https://www.googleapis.com/auth/structuredcontent', 
      'https://www.googleapis.com/auth/shoppingapi' 
      ), 
     file_get_contents (G_CLIENT_KEY_PATH), 
     G_CLIENT_KEY_PW)); 

$obj_client_api = new Google_ShoppingService ($obj_client_auth); 

$arr_results = $obj_client_api -> products -> listProducts ('public', array (
    'country' => 'GB', 
    'q'   => '"mp3 player" | ipod', 
    'rankBy' => 'relevancy' 
)); 

print_r ($arr_results); 
+0

あなたは壊れているものを共有していただけますか?ストラクチャードコンテンツスコープに対して承認されたアクセストークンを取得したら、GET/POSTリクエストとともに製品APIに渡すことができます。あなたは正確なエラーを共有してください。 –

+0

google_clientライブラリから取得したトークンをGSC_Contentライブラリに挿入する方法がないように見えることが「壊れている」ということです。彼らは明らかにお互いに互換性がありません。 – GordonM

答えて

1

GSC_clientライブラリがきつくするGoogle_Clientライブラリの独自ののOAuth2の実装に結合されているかのように見えます大幅なリファクタリング作業なしで簡単に統合できます。また、GSC_ClientのOAuth2の実装は、クライアントの秘密のコンセプトと密接に結びついており、Google_Clientの実装を置き換えて置き換える実装を記述するための同意ページにリダイレクトすることもできません。

幸いにも、私たちは社内で開発されたGoogleのAPIとのインタフェースのためのコードベースを持ち、認証システムと密接に結びついていません。ちょっとした作業で、Google_Clientをラップした新しい認証モジュールを追加することができました。

しかし、GoogleのGSC_ClientをGoogle_Clientと連携させる方法についての回答はないようですが、まだ私はより良い答えを探しています。

0

これはちょっと古い質問ですが、Googleが価格と在庫状況を更新するために使用していた古いAPIを殺しただけなので、同様の要件がありました。

以下のコードは私にはうまくいきます。サーバー・サーバー認証を使用しているため、ユーザー入力は必要ありません。 google apiコンソールにログオンして新しいサービスアカウントを設定するか、既存のサービスアカウントを使用する場合は既存のアカウントを使用する必要があります。さらに、サービスコードのメールアドレスをGoogle Merchant Centerに追加する必要があります標準ユーザー - だけでなく、それが必要とされる場合、私はわからないが、私はそれをやったし、それがサイドノートでは:-)

作品 - 私たちはMPNを使用して検索古いAPIを使用して、新しいAP

require_once realpath(dirname(__FILE__) . '/src/Google/autoload.php'); 
require_once realpath(dirname(__FILE__) . '/src/Google/Service/ShoppingContent.php'); 


$merchantId = '<<MY_MERCHANT_ID>>'; 
$client_id = '<<MY_GOOGLE_API_SERVICE_ACCOUNT_ID>>'; 
$client_email = <<MY_GOOGLE_API_SERVICE_ACCOUNT_EMAIL>>'; 
$scopes = array('https://www.googleapis.com/auth/content'); 
$private_key = file_get_contents('<<MY_GOOGLE_API_SERVICE_ACCOUNT_P12_FILE>>'); 
$credentials = new Google_Auth_AssertionCredentials(
    $client_email, 
    $scopes, 
    $private_key 
); 

$client = new Google_Client(); 
$client->setAssertionCredentials($credentials); 
$client->setScopes($scopes); 
$client->setAccessType("offline"); 

if ($client->getAuth()->isAccessTokenExpired()) $client->getAuth()->refreshTokenWithAssertion(); 
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
    $client->setAccessToken($_SESSION['access_token']); 
} else { 
    $authUrl = $client->createAuthUrl(); 
} 

$service = new Google_Service_ShoppingContent($client); 

//Example to get sku information 
$ret = getsku($client, $service, $merchantId, 'DC35DS'); 
echo "<pre>"; print_r($ret); echo "</pre>"; 

//Example to set price and availability 
$ret = update_Price_Availability($client, $service, $merchantId, $itemid, $price, $availability); 
echo "<pre>"; print_r($ret); echo "</pre>"; 


function update_Price_Availability($client, $service, $merchantId, $itemid, $newprice = null, $availability = null) { 
    $inventory = new Google_Service_ShoppingContent_InventorySetRequest(); 
    $price = new Google_Service_ShoppingContent_Price(); 
    $ctrl = 0; 
    if ($newprice !== null) { 
     $price->setValue($newprice); 
     $price->setCurrency('GBP'); 
     $inventory->setPrice($price); 
     $ctrl = 1; 
    } 
    if ($availability !== null) { 
     $inventory->setAvailability($availability); 
     $ctrl = 1; 
    } 
    if ($ctrl == 0) { 
     return array('Errors'=>array('Nothing to do')); 
    } 
    try { 
     $return = $service->inventory->set($merchantId, 'online', 'online:en:GB:'.$itemid, $inventory); 
    } catch (Google_Service_Exception $e) { 
     return array('Errors'=>$e->geterrors(),'Message'=>$e->getmessage()); 
    } 
    return getsku($client, $service, $merchantId, $itemid); 
} 

function getsku($client, $service, $merchantId, $itemid) { 
    try { 
     $product = $service->products->get($merchantId, 'online:en:GB:'.$itemid); 
    } catch (Google_Service_Exception $e) { 
     $product = array('Errors'=>$e->geterrors(),'Message'=>$e->getmessage()); 
    } 
    return $product; 
} 
関連する問題