यहाँ कुछ संशोधित कोड है कि काम करता है।
यह पहली बार प्रारंभिक कुकीज़ प्राप्त करने और लॉगिन फ़ॉर्म के लिए आवश्यक मान निकालने के लिए लॉगिन पृष्ठ का अनुरोध करता है। इसके बाद यह लॉगिन सेवा में एक पोस्ट करता है। यह तब जांचता है कि यह गंतव्य URL पर रीडायरेक्ट करने के लिए जावास्क्रिप्ट और मेटा टैग का उपयोग करने का प्रयास कर रहा है या नहीं।
ऐसा लगता है कि आपके पास फॉर्म फ़ील्ड को पकड़ने के लिए पहले से ही कोड है, इसलिए मैंने अपनी पोस्ट नहीं की, लेकिन अगर आपको इसकी ज़रूरत है तो मुझे बताएं। बस सुनिश्चित करें कि $formFields
एक सहयोगी सरणी है जिसमें कुंजियां फ़ील्ड नाम हैं, और मान फ़ील्ड मान है।
<?php
/**
* Log in to Google account and go to account page
*
*/
$USERNAME = '[email protected]';
$PASSWORD = 'password';
$COOKIEFILE = 'cookies.txt';
// initialize curl handle used for all requests
$ch = curl_init();
// set some options on the handle
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $COOKIEFILE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIEFILE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
// url of our first request fetches the account login page
curl_setopt($ch, CURLOPT_URL,
'https://accounts.google.com/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com/alerts/manage');
$data = curl_exec($ch);
// extract form fields from account login page
$formFields = getFormFields($data);
// inject email and password into form
$formFields['Email'] = $USERNAME;
$formFields['Passwd'] = $PASSWORD;
unset($formFields['PersistentCookie']);
$post_string = http_build_query($formFields); // build urlencoded POST string for login
// set url to login page as a POST request
curl_setopt($ch, CURLOPT_URL, 'https://accounts.google.com/ServiceLoginAuth');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
// execute login request
$result = curl_exec($ch);
// check for "Redirecting" message in title to indicate success
// based on your language - you may need to change this to match some other string
if (strpos($result, '<title>Redirecting') === false) {
die("Login failed");
var_dump($result);
}
// login likely succeeded - request account page; unset POST so we do a regular GET
curl_setopt($ch, CURLOPT_URL, 'https://myaccount.google.com/?utm_source=OGB');
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, null);
// execute request for login page using our cookies
$result = curl_exec($ch);
echo $result;
// helpef functions below
// find google "#gaia_loginform" for logging in
function getFormFields($data)
{
if (preg_match('/(<form.*?id=.?gaia_loginform.*?<\/form>)/is', $data, $matches)) {
$inputs = getInputs($matches[1]);
return $inputs;
} else {
die('didnt find login form');
}
}
// extract all <input fields from a form
function getInputs($form)
{
$inputs = array();
$elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches);
if ($elements > 0) {
for($i = 0; $i < $elements; $i++) {
$el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]);
if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) {
$name = $name[1];
$value = '';
if (preg_match('/value=(?:["\'])?([^"\'\s]*)/i', $el, $value)) {
$value = $value[1];
}
$inputs[$name] = $value;
}
}
}
return $inputs;
}
आपको शायद यूआरएल को 'file_get_html' फ़ंक्शन में कर्ल का उपयोग करके लाया जाना चाहिए क्योंकि यह शायद कुछ कुकीज़ सेट करता है जो ऑथ सेवा दिख रहा हो। साथ ही, क्या आप 'कुकीज' द्वारा निर्दिष्ट फ़ाइल की पुष्टि कर सकते हैं और कुकीज़ शामिल है? – drew010
मैंने कुकीज फ़ाइल की जांच की, हाँ इसमें कुछ टेक्स्ट शामिल है। मैंने curl_init url को उसी url पर file_get_html के रूप में भी सेट किया है, फिर भी वही बात, मेरे लिए कोई कुकी नहीं है। :( – kazuo
मुझे कुछ शीर्षलेख मिलते हैं, क्या इससे कोई फर्क पड़ता है? यहां वे हैं: HTTP/1.1 200 ठीक सेट-कुकी: GoogleAccountsLocale_session = en; सुरक्षित सेट-कुकी: GAPS = 1: ZuuFm50cJM2_fiqQc38hkyuCjZXRRg: bMuhAssScKIBtI1L; पथ = /; समाप्त हो जाता है = गुरु, 23-जनवरी -2014 18:32:24 जीएमटी; सुरक्षित; केवल सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; वर्णसेट = यूटीएफ -8 सख्त-परिवहन-सुरक्षा: अधिकतम आयु = 25 9 2000; शामिल हैंसबडोमेन तिथि: मंगलवार, 24 जनवरी 2012 18:32:24 जीएमटी की समयसीमा समाप्त हो जाती है: मंगलवार, 24 जनवरी 2012 18:32:24 जीएमटी कैश-कंट्रोल: निजी, अधिकतम आयु = 0 एक्स-कंटेंट-टाइप-ऑप्शन: नोस्निफ एक्स-एक्सएसएस-प्रोटेक्शन: 1; मोड = ब्लॉक सामग्री-लंबाई: 1848 सर्वर: जीएसई – kazuo