2011-03-25 75 views
0

我遇到了用我写的PHP代码登录到Yahoo的问题。该代码工作较早,但由于某种原因,它停止工作。它总是显示雅虎登录页面,顶部有我的用户名,如Hi Sudhir在标题处,就好像我已经登录了,还有我的雅虎用户名,但又显示密码字段和登录按钮,并再次显示Please Verify your password在php中使用cURL登录到Yahoo的问题

虽然我试图再次采取新的表单动作https://login.yahoo.com/config/login_verify2?重新发送请求,但它不断显示相同的页面。以下是我完整的雅虎登录代码。

请建议我做错了什么,或者我错过了什么?

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

?> 

虽然我尝试使用密码哈希值,即雅虎的动态信道值与我的密码组合,但它也不能工作了这种方式。

+0

也许一个愚蠢的问题,但你还能登录“正常”的方式?另外,请检查登录时正在发送的标题。也许他们的形式已经发生了变化! – ChrisH 2011-03-25 09:57:00

+0

上面的代码在我的本地服务器上工作正常,但是当我将它上载到活服务器时,它根本不起作用,始终保持显示登录页面。我现场有一台Linux服务器。可能是什么问题呢..?请建议 – 2011-03-29 07:40:28

+0

请检查您是否具有相同的PHP.ini设置,适用于实况和本地。请确保你也显示了所有的错误'ini_set('display_errors','on'); error_reporting(E_ALL);' – ChrisH 2011-03-29 09:39:22

回答

1

看起来没有人对此作出回应。我知道它是一个令人讨厌的问题。

我看你在哪里设置cookie名称/ jar ...但不能打开文件来读/写。解决的办法是多likley使用该文件第一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:从雅虎获取您需要的信息。

// ********************************************************************************************* 
// 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 "<PRE>"; 
    print_r($challenge); 
    print"</PRE>"; 
    print "FOUND CHALLENGE STRING<BR>"; 
    $chal = $challenge[1]; 
} 
else { 
    print "\nNO CHALLENGE STRING"; 
    $proceed = false; 
} 
if(preg_match("/type=\"hidden\" name=\".u\" value=\"(.*?)\"/", $y_login_page, $array_u)){ 
    print "<PRE>"; 
    print_r($array_u); 
    print"</PRE>"; 
    print "FOUND .U STRING<BR>"; 
    $u = $array_u[1]; 
} 
else { 
    print "\nNO U STRING"; 
    $proceed = false; 
} 
if(preg_match("/type=\"hidden\" name=\".pd\" value=\"(.*?)\"/", $y_login_page, $array_pd)){ 
    print "<PRE>"; 
    print_r($array_pd); 
    print"</PRE>"; 
    print "FOUND .PD STRING<BR>"; 
    $pd = $array_pd[1]; 
} 

if(preg_match("/ts=(.*?)&/", $y_login_page, $array_ts)){ 
    print "<PRE>"; 
    print_r($array_ts); 
    print"</PRE>"; 
    print "FOUND TIME STAMP STRING<BR>"; 
    $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

或任何你想要在登录后去。