在php中使用cURL登录Yahoo时出现问题

在php中使用cURL登录Yahoo时出现问题,php,curl,login,yahoo,Php,Curl,Login,Yahoo,我用我写的PHP代码登录雅虎时遇到问题。代码在早期工作,但由于某种原因它停止了工作。它总是在顶部显示带有我的用户名的Yahoo登录页面,如标题处的“Hi Sudhir”,就好像我已经登录了一样,同时显示我的Yahoo用户名,但再次显示密码字段和登录按钮,上面写着“请验证您的密码” 虽然我尝试再次使用新的表单操作重新发送请求https://login.yahoo.com/config/login_verify2?,但它始终显示同一页。以下是我完整的雅虎登录代码 请说明我做错了什么或我遗漏了什么 &

我用我写的PHP代码登录雅虎时遇到问题。代码在早期工作,但由于某种原因它停止了工作。它总是在顶部显示带有我的用户名的Yahoo登录页面,如标题处的“
Hi Sudhir
”,就好像我已经登录了一样,同时显示我的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;

?>


虽然我尝试使用密码散列,即将雅虎的动态频道值与我的密码相结合,但也没有成功。

似乎没有人对此做出回应。我知道这是一个恼人的问题

我知道您在哪里设置cookie名称/jar。。。但不打开文件进行读/写。解决方案很可能首先在文件上使用
fopen()

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

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar_file);
此外:

不要忘记关闭打开的文件,并在脚本结束时将其删除

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];
}
这里的postfield有一个名为“done”的字段

将其设置为
done=http://calendar.yahoo.com


或者登录后想去的任何地方。

可能是一个愚蠢的问题,但您仍然可以“正常”方式登录吗?此外,请检查登录时发送的标题。也许他们的形式已经改变了!上面的代码在我的本地服务器上运行良好,但当我将其上传到live server时,它根本不起作用,始终显示登录页面。我有一台linux服务器。有什么问题吗。。?请建议请检查live和local的PHP.ini设置是否相同。请确保同时显示所有错误
ini_集('display_errors','on');错误报告(E_全部)
我检查了在yahoo登录期间创建的cookie文件,当我在本地尝试时,cookie文件是完整的(即成功登录),但是服务器中的cookie文件具有完全不同的数据,并且不完整。和本地服务器一样,cookie文件是1KB,但在live上只有307字节,所以在服务器上没有正确设置cookie。这可能是什么原因?Sudhir,很高兴听到。是什么解决了这个问题?
// *********************************************************************************************
// 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;