Проблемы со входом в Yahoo с помощью cURL в php - PullRequest
0 голосов
/ 25 марта 2011

У меня проблемы со входом в Yahoo с написанным мною PHP-кодом. Код работал раньше, но по какой-то причине перестал работать. Он всегда показывает страницу входа в Yahoo с моим именем пользователя вверху, например, Hi Sudhir в заголовке, как будто я уже вошел в систему, вместе с моим именем пользователя Yahoo, но отображает поле пароля и кнопку входа снова, говоря Please Verify your password.

Хотя я попытался повторно отправить запрос, выполнив новое действие формы https://login.yahoo.com/config/login_verify2?, но он продолжает отображать ту же страницу. Ниже приведен мой полный код для входа в Yahoo.

Подскажите, пожалуйста, что я делаю не так или я что-то упустил?

<?php
$yahooCalUrl = "http://calendar.yahoo.com";
$ch = curl_init($yahooCalUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies_new.txt");
//curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies_new.txt");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$resCalUrl = curl_exec($ch);
//echo $resCalUrl;
$loginUrl = "https://login.yahoo.com/config/login?";

//get the hidden values
$searchStr = "/name=\".u\" value=\"(.*?)\"/";
preg_match($searchStr, $resCalUrl, $matches);
$u = $matches[1];

$searchStr1 = "/name=\".challenge\" value=\"(.*?)\"/";
preg_match($searchStr1, $resCalUrl, $matches1);
$challenge = $matches1[1];

$searchStr2 = "/name=\".pd\" value=\"(.*?)\"/";
preg_match($searchStr2, $resCalUrl, $matches2);
$pd = $matches2[1];

$username = "my_yahoo_username";
$password = "my_yahoo_password";
//$mdPassword = md5($password);
//$finalPass = $mdPassword . $challenge;
//$hash = md5($finalPass);
//$finalHash = urlencode($hash);
$done = urlencode("http://calendar.yahoo.com");
$postFields = ".tries=1&.src=fpctx&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass=&.partner=&.u=".$u."&.v=0&.challenge=".$challenge."&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=0&.chkP=Y&.done=http%3A%2F%2Fwww.yahoo.com%2F&.pd=fpctx_ver%3D0%26c%3D%26ivt%3D%26sg%3D&pad=3&aad=3&login=".$username."&passwd=".$password."&.save=&passwd_raw=";
//$postFields = ".tries=1&.src=&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass=&.partner=&.u=".$u."&.v=0&.challenge=".$challenge."&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=1&.chkP=Y&.pd=".$pd."&pad=6&aad=6&.persistent=&.save=1&login=".$username."&passwd=".$password."&.done=".$done;
curl_setopt($ch, curlOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_REFERER, $loginUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies_new.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies_new.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$finalLoggedIn = curl_exec($ch);
echo $finalLoggedIn;

?>

Хотя я пытался использовать хэш пароля, то есть объединял значение динамического канала Yahoo с моим паролем, но это также не сработало.

1 Ответ

1 голос
/ 23 августа 2012

Похоже, никто не ответил на это.И я знаю, это раздражающая проблема.

Я вижу, где вы устанавливаете имя файла cookie / jar ... но не открываете файл для чтения / записи.Решение было больше, чем просто использовать fopen() в начале файла ...

$cookie_jar_file = "my_cookies_new.txt";
$fp = fopen($cookie_jar_file, "w");

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar_file);

Также:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

Не забудьте закрыть открытый файл и удалить его приконец вашего сценария.

fclose($fp);

unlink($cookie_jar_file);

Надеюсь, это кому-нибудь поможет.Вот как я бы это сделал:

1: получите от Yahoo информацию, которая вам понадобится.

// *********************************************************************************************
// GET CHALLENGE
// *********************************************************************************************
    $cs = curl_init();
    curl_setopt($cs, CURLOPT_USERAGENT, $agent);
    curl_setopt($cs, CURLOPT_REFERER, "http://m.google.com/");
    curl_setopt($cs, CURLOPT_URL, "https://login.yahoo.com/config/login_verify2?");
//  curl_setopt($cs, CURLOPT_POSTFIELDS, "login=".$id."&passwd=".$pass."&.src=&.tries=5&.bypass=&.partner=&.md5=&.hash=&.intl=us&.tries=1&.challenge=ydKtXwwZarNeRMeAufKa56.oJqaO&.u=dmvmk8p231bpr&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=0&.v=0&.chkP=N&.last=&.done=http://m.yahoo.com/w/ygo-mail/");
    curl_setopt($cs, CURLOPT_COOKIEJAR, $cookie_jar_file);
    curl_setopt($cs, CURLOPT_COOKIEFILE, $cookie_jar_file);
    curl_setopt($cs, CURLOPT_HEADER, 1);
    //curl_setopt($cs, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($cs, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($cs, CURLOPT_TIMEOUT, 30);
    curl_setopt($cs, CURLOPT_CONNECTTIMEOUT,5);
//  curl_setopt($cs, CURLOPT_HTTPPROXYTUNNEL, 1);
//  curl_setopt($cs, CURLOPT_PROXY, $proxy);
    curl_setopt($cs, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($cs, CURLOPT_SSL_VERIFYHOST, 2);

    $y_login_page = curl_exec($cs); 
    //print $y_login_page;
    curl_close($cs);


$proceed = true;


if(preg_match("/type=\"hidden\" name=\".challenge\" value=\"(.*?)\"/", $y_login_page, $challenge)){
    print "";
    print_r($challenge);
    print"
"; напечатайте" FOUND CHALLENGE STRING
"; $ chal = $ challenge[1];} else {print "\ nNO CHALLENGE STRING"; $ continue = false;} if (preg_match ("/ type = \" hidden \ "name = \". U \ "value = \" (. *?) \ "/", $ y_login_page, $ array_u)) {print "
";
    print_r($array_u);
    print"
"; напечатать "FOUND .U STRING
"; $ u = $ array_u [1];} else {print "\ nNO U STRING"; $ continue = false;} if (preg_match (" / type = \ "hidden \" name = \ ". pd \" value = \ "(. *?) \" / ", $ y_login_page, $ array_pd)){print "
";
    print_r($array_pd);
    print"
"; печать "FOUND .PD STRING
"; $ pd = $ array_pd [1];} if (preg_match ("/ ts = (. *?) & /", $ y_login_page, $array_ts)) {print "
";
    print_r($array_ts);
    print"
"; напечатать "FOUND TIME STAMP STRING
"; $ xts = $ array_ts [1];}

Затем используйте информацию, которую вы только что собрали вместе с вашимИмя пользователя и пароль для входа в систему.

// *********************************************************************************************
// CURL SESSION #1:  AUTHENTICATE THE USER ID ON YAHOO'S SERVER
// *********************************************************************************************
$cs = curl_init();
curl_setopt($cs, CURLOPT_USERAGENT, $agent);
curl_setopt($cs, CURLOPT_REFERER, "http://m.google.com/");
curl_setopt($cs, CURLOPT_URL, "http://login.yahoo.com/config/login?");//http://login.yahoo.com/config/login?
curl_setopt($cs, CURLOPT_POSTFIELDS, ".tries=1&.src=&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.lang=en-US&.bypass=&.partner=&.u=".$u."&.v=0&.challenge=".$chal."&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=0&.chkP=Y&.done=http://calendar.yahoo.com&.pd=".$pd."&.ws=0&.cp=0&nr=0&pad=5&aad=5&login=".$id."&passwd=".$pass."&.persistent=y&.save=");
curl_setopt($cs, CURLOPT_COOKIEJAR, $cookie_jar_file);
curl_setopt($cs, CURLOPT_COOKIEFILE, $cookie_jar_file);
curl_setopt($cs, CURLOPT_HEADER, 1);
curl_setopt($cs, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cs, CURLOPT_TIMEOUT, 30);
curl_setopt($cs, CURLOPT_CONNECTTIMEOUT,5);
//curl_setopt($cs, CURLOPT_HTTPPROXYTUNNEL, 1);
//curl_setopt($cs, CURLOPT_PROXY, $proxy); 
$y_login_page = curl_exec($cs); 
print $y_login_page;

В PostFeilds есть поле с именем "done".

Установите это значение в done=http://calendar.yahoo.com

Или куда вы хотите перейтипосле входа в систему.

...