2013-01-24 14 views
5

मैं एक PHP स्क्रिप्ट पर काम शुरू कर रहा हूं जो क्रॉन नौकरी के रूप में चलाएगा और समय-समय पर Google शॉपिंग एपीआई के माध्यम से उत्पाद प्रविष्टियों को अपडेट करेगा।GSC_Client और oAuth2 एक्सेस

मैंने GSC Client library for PHP डाउनलोड किया है और एक टोकन प्राप्त करने के लिए Google Shopping API documentation के माध्यम से काम करने की कोशिश कर रहा हूं। हालांकि ऐसा लगता है कि यूआरएल उत्पन्न करने के बाद वास्तव में टोकन का अनुरोध करने के तरीके के बारे में दस्तावेज़ों में कहीं भी एक कदम गायब है।

यहाँ मेरी कोड अब तक है: जब मैं कमांडलाइन से ऊपर चलाने

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 ऑब्जेक्ट को प्रारंभ करना आवश्यक नहीं होना चाहिए, लेकिन मैं यह नहीं समझ सकता कि मैं कैसे प्राप्त करता हूं पार्स के लिए वास्तविक प्रतिक्रिया के लिए जेनरेट यूआरएल।

यदि मैं generAuthorizeUrl() द्वारा उत्पन्न यूआरएल पर जाता हूं तो मुझे एक बटन मिलता है जिसमें मुझे अनुमति देने के लिए कहा जाता है। अगर मैं ऐसा करता हूं, तो मुझे एक ऐसा पृष्ठ मिलता है जिस पर एक टोकन है जहां तक ​​मैं कह सकता हूं वैध है।

हालांकि, यह एक क्रॉन स्क्रिप्ट के लिए है जो स्पष्ट रूप से उपयोगकर्ता को एक बटन क्लिक करने के लिए कहने में सक्षम नहीं होगा और पुष्टि करेगा कि वे अनुमति देना चाहते हैं, इसलिए जाहिर है कि मैं कहीं से बाहर जा रहा हूं।

क्या कोई भी पूरी तरह से स्वचालित स्क्रिप्ट में OAuth के साथ काम करने के लिए GSC_Client प्राप्त करने में कामयाब रहा है? यदि हां, तो मैं यहाँ क्या गलत कर रहा हूँ?

अद्यतन: इस एप्लिकेशन के लिए, मैंने एपीआई प्रकार को "इंस्टॉल किया गया एप्लिकेशन" के रूप में कॉन्फ़िगर किया है, जो इस एप्लिकेशन के लिए सही एपीआई प्रकार प्रतीत होता है। इसका मतलब है कि मैं साझा रहस्य के साथ स्क्रिप्ट प्रदान करता हूं और यूआरएल के रूप में https://localhost या urn:ietf:wg:oauth:2.0:oob का उपयोग करता हूं।

अद्यतन 2: मुझे नहीं लगता कि जीएससी क्लाइंट के समर्थन पुस्तकालय सर्वर-से-सर्वर परिदृश्यों का समर्थन करते हैं। आगे के शोध से संकेत मिलता है कि अगर मुझे प्रमाणीकरण की निजी कुंजी विधि का उपयोग करना है तो मुझे Google APIs client library की आवश्यकता है।

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

मेरा अनुमान है कि:

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); 

जब मैं ऊपर कोड को चलाने मैं कुछ मिलता-जुलता बदले में निम्नलिखित मिल:

इस कोड को मैं अब तक लिखने के लिए प्रबंधित किया है है यह एक वैध पहुंच टोकन प्रतिक्रिया है।

हालांकि, मुझे पता नहीं चला है कि अभी तक GSC_Client लाइब्रेरी के साथ लौटे टोकन का उपयोग कैसे करें। जबकि मैं Google से उत्पन्न इन दोनों पुस्तकालयों को जानता हूं, मुझे अलग-अलग इंप्रेशन मिल रहा है कि वे अलग-अलग टीमों द्वारा विकसित किए गए थे, जिनके पास थोड़ा, अगर कुछ भी था, एक दूसरे के साथ काम करना था, और अंत परिणाम यह है कि ये पुस्तकालय पार-संगत नहीं हैं । अगर कोई जानता है कि यहां क्या करना है, तो मैं आपकी सलाह की सराहना करता हूं।

अद्यतन 3

मैं oAuth पुस्तकालय का उपयोग करने के लिए वास्तव में Google से डेटा खींचने के लिए प्रबंधित किया है, लेकिन यह खरीदारी के लिए खोज API से है। मुझे खरीदारी के लिए सामग्री एपीआई के साथ उत्पाद प्रविष्टियों में हेरफेर करना होगा। ऐसा करने के लिए ओथ लाइब्रेरी के साथ प्रदान की गई कक्षा नहीं दिखाई देती है, यहां तक ​​कि contrib निर्देशिका में भी!

FYI करें, यहाँ कोड है कि खोज एपीआई अनुरोध (ऋण स्थिरांक) करता है:

$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

क्या आप जो भी तोड़ रहे हैं उसे साझा कर सकते हैं। एक बार जब आपके पास संरचित सामग्री स्कोप के लिए अधिकृत पहुंच टोकन हो, तो उसे उत्पाद API में GET/POST अनुरोध के साथ पारित किया जा सकता है। क्या आप सही त्रुटि साझा कर सकते हैं। –

+0

"ब्रेकिंग" क्या है कि google_client लाइब्रेरी से GSC_Content लाइब्रेरी में प्राप्त टोकन को इंजेक्ट करने का कोई तरीका नहीं प्रतीत होता है। वे एक-दूसरे के साथ स्पष्ट रूप से संगत नहीं हैं। – GordonM

उत्तर

1

ऐसा लगता है जैसे GSC_client पुस्तकालय बहुत कसकर Google_Client पुस्तकालय के लिए अपने स्वयं के OAuth2 कार्यान्वयन के लिए युग्मित है होना करने के लिए बिना किसी महत्वपूर्ण रिफैक्टरिंग काम के आसानी से इसमें एकीकृत किया गया। इसके अलावा GSC_Client का OAuth2 कार्यान्वयन ग्राहक गुप्त अवधारणा के साथ बहुत निकटता से है और मेरे लिए एक कार्यान्वयन लिखने के लिए एक सहमति पृष्ठ पर रीडायरेक्ट करने के लिए है जो Google_Client कार्यान्वयन को प्रतिस्थापन में गिरावट के रूप में लपेटता है।

सौभाग्य से, हमारे पास Google के एपीआई के साथ इंटरफेसिंग के लिए एक कोडबेस है जो घर में विकसित किया गया था, और इसकी प्रमाणीकरण प्रणाली के साथ कम कसकर जोड़ा गया है। कुछ काम के साथ Google_Client लपेटने के लिए एक नया प्रमाणीकरण मॉड्यूल जोड़ना संभव था।

हालांकि, ऐसा लगता है कि Google_CLient के साथ काम करने वाले Google के GSC_Client को कैसे प्राप्त किया जाए, इसलिए मैं अभी भी एक बेहतर उत्तर की तलाश में हूं।

0

मुझे पता है कि यह एक छोटा सा सवाल है, लेकिन मुझे इसी तरह की आवश्यकताएं थीं क्योंकि Google ने पुरानी एपीआई को मार डाला था जिसे हम कीमतों और उपलब्धता को अपडेट करने के लिए उपयोग कर रहे थे।

नीचे दिया गया कोड मेरे लिए काम करता है। यह सर्वर-सर्वर प्रमाणीकरण का उपयोग करता है ताकि उपयोगकर्ता इनपुट की आवश्यकता न हो। आपको अपने Google एपीआई कंसोल पर लॉगऑन करना होगा और एक नया सेवा खाता सेट करना होगा (या यदि आपके पास एक और पी 12 फाइल है तो मौजूदा का उपयोग करें) और आपको सेवा कोड के लिए अपने Google Merchant Center में ईमेल पता भी जोड़ना होगा एक मानक उपयोगकर्ता - ठीक है, मुझे नहीं यकीन है कि अगर यह आवश्यक है हूँ, लेकिन मैं यह किया है और यह :-)

काम करता है एक तरफ ध्यान दें पर - वर्ष एपीआई हम एमपीएन का उपयोग करके खोज का उपयोग कर, नए एपी

साथ
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; 
} 
संबंधित मुद्दे