2012-01-24 13 views
17

मेरे पास कर्ल के साथ सरल डोम पार्सर का उपयोग करके Google में लॉग इन करने के लिए यह कोड है। मैंने कुकीजर फ़ाइल में जोड़ने का प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है। मैं संदेश प्राप्त करता रहता हूं:PHP और कर्ल के साथ Google पर लॉग इन करें, कुकी बंद हो गई?

आपके ब्राउज़र की कुकी कार्यक्षमता बंद है। कृपया इसे चालू करें।

इस समाधान को हल करने के बारे में कोई विचार?

यहाँ संदर्भ के लिए मेरी कोड है:

$html = file_get_html('https://accounts.google.com/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com/alerts/manage'); 

//... some code for getting post data here 

$curl_connection = curl_init('https://accounts.google.com/ServiceLoginAuth'); 
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, COOKIEJAR); 
curl_setopt($curl_connection, CURLOPT_COOKIEFILE, COOKIEJAR); 
curl_setopt($curl_connection, CURLOPT_HEADER, true); 
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 120); 
curl_setopt($curl_connection, CURLOPT_TIMEOUT, 120); 
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 

$result = curl_exec($curl_connection); 
curl_close($curl_connection); 

echo $result; 
+0

आपको शायद यूआरएल को 'file_get_html' फ़ंक्शन में कर्ल का उपयोग करके लाया जाना चाहिए क्योंकि यह शायद कुछ कुकीज़ सेट करता है जो ऑथ सेवा दिख रहा हो। साथ ही, क्या आप 'कुकीज' द्वारा निर्दिष्ट फ़ाइल की पुष्टि कर सकते हैं और कुकीज़ शामिल है? – drew010

+0

मैंने कुकीज फ़ाइल की जांच की, हाँ इसमें कुछ टेक्स्ट शामिल है। मैंने curl_init url को उसी url पर file_get_html के रूप में भी सेट किया है, फिर भी वही बात, मेरे लिए कोई कुकी नहीं है। :( – kazuo

+0

मुझे कुछ शीर्षलेख मिलते हैं, क्या इससे कोई फर्क पड़ता है? यहां वे हैं: 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

उत्तर

26

यहाँ कुछ संशोधित कोड है कि काम करता है।

यह पहली बार प्रारंभिक कुकीज़ प्राप्त करने और लॉगिन फ़ॉर्म के लिए आवश्यक मान निकालने के लिए लॉगिन पृष्ठ का अनुरोध करता है। इसके बाद यह लॉगिन सेवा में एक पोस्ट करता है। यह तब जांचता है कि यह गंतव्य 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; 
} 
+0

वाह! इसके लिए धन्यवाद! मैंने इसे आजमाया और मुझे लॉगिन विफल हुआ। बस प्लग इन मेरे post_data सरणी को आपके फॉर्म फ़ील्ड सरणी में है। यहां स्ट्रिंग है: जारी रखें = http% 3 ए% 2 एफ% 2Fwww.google.com% 2 फाल्टर% 2 फ़ैनमेज और सेवा = अलर्ट और डीएसएच = -6553802846829809996 और एचएल = एन एंड गैलेक्स = सीजी 4 एक्स gqEmZ_w और timeStmp = & secTok = & email = xxxxxxxx और Passwd = xxxxxxxxxxx और साइनइन = साइन + इन और आरएमशॉउन = 1 विफल होने के बाद, कोई अन्य आउटपुट नहीं है। – kazuo

+0

कभी नहीं, मुझे मिल गया, धन्यवाद!: डी मैं यह देखने की कोशिश करूंगा कि आपका काम क्या करता है और मेरा काम नहीं करता है। – kazuo

+0

यह ठीक लगता है कि यह कर्ल के लिए सही चर पर पारित किया गया है। मैंने बस उस पूर्ण संस्करण के साथ कोड अपडेट किया जो छिपे हुए फ़ील्ड को पकड़ता है। वहां अपना उपयोगकर्ता नाम और पासवर्ड इनपुट करें और देखें कि यह आपके लिए काम करता है या नहीं। मैंने फिर से पूरे उदाहरण कार्यों की पुष्टि की। अगर लॉगिन विफल रहता है, तो इसे परिणामी वेबपृष्ठ var_dump करना चाहिए। – drew010