मैं एक 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);
क्या आप जो भी तोड़ रहे हैं उसे साझा कर सकते हैं। एक बार जब आपके पास संरचित सामग्री स्कोप के लिए अधिकृत पहुंच टोकन हो, तो उसे उत्पाद API में GET/POST अनुरोध के साथ पारित किया जा सकता है। क्या आप सही त्रुटि साझा कर सकते हैं। –
"ब्रेकिंग" क्या है कि google_client लाइब्रेरी से GSC_Content लाइब्रेरी में प्राप्त टोकन को इंजेक्ट करने का कोई तरीका नहीं प्रतीत होता है। वे एक-दूसरे के साथ स्पष्ट रूप से संगत नहीं हैं। – GordonM