1

我想使用 php 和 curl 登录 yahoo.co.jp 网站。我已经尝试过 yahoo.com。它的工作非常好。但是当我使用相同的格式登录 yahoo.co.jp 时。但它不起作用。它正在进行验证码验证。

在此处输入图像描述

我正在尝试很多方法,但它不起作用我的代码如下所示。

<?php
set_time_limit(0);

//$php_userid = 'username';
//$php_password ='password';

Example login
$php_userid = 'jpnathanstock';
$php_password ='somepwpw!2345';



$cookie_file_path = "cookie.txt"; // Please set your Cookie File path

$fp = fopen($cookie_file_path,'wb'); 
fclose($fp);
$agent = "Mozilla/5.0 (Linux; U; Android 2.3.2; ja-jp; SonyEricssonSO-01C Build/3.0.D.2.79) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
$reffer = "http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&logout=1&.src=www&.done=http://www.yahoo.co.jp";

// log out.
$LOGINURL = "http://us.ard.yahoo.com/SIG=12hoqklmn/M=289534.5473431.6553392.5333790/D=mail/S=150500014:HEADR/Y=YAHOO/EXP=1135053978/A=2378664/R=4/SIG=133erplvs/*http://login.yahoo.co.jp/config/login?logout=1&.done=http://auctions.yahoo.co.jp/&.src=ym&.lg=us&.intl=us"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$result = curl_exec ($ch);
curl_close ($ch);


//1. Get first login page to parse hash_u,hash_challenge

$LOGINURL = "https://login.yahoo.co.jp/config/login?"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$loginpage_html = curl_exec ($ch);
curl_close ($ch); 

preg_match_all("/name=\".u\" value=\"(.*?)\"/", $loginpage_html, $arr_hash_u);
preg_match_all("/name=\".challenge\" value=\"(.*?)\"/", $loginpage_html, $arr_hash_challenge);

 $hash_u = $arr_hash_u[1][0];
 $hash_challenge = $arr_hash_challenge[1][0];



//.tries=1&.src=auc&.last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc&promo=&.intl=jp&.bypass=&.partner=&.u=cq4ce2ov02mdi&.v=0&.fUpdate=Y&hasMsgr=0&.chkP=Y&.done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus&login=********&passwd=***********
// 2- Post Login Data to Page https://login.yahoo.com/config/login?

$LOGINURL = "https://login.yahoo.co.jp/config/login";

$POSTFIELDS = '.tries=1&.src=auc&.hash=&.last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc&promo=&.intl=jp&.bypass=&.partner=&.u='.$hash_u.'&.v=0&.fUpdate=Y&.challenge='.$hash_challenge.'&.hasMsgr=0&.chkP=Y&.done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus&login='.$php_userid.'&passwd='.$php_password;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$POSTFIELDS); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_REFERER, $reffer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$result = curl_exec ($ch);
curl_close ($ch); 
print_r($result);
exit;
?>

请指导我。我的代码有什么问题。任何人都给我建议..

4

2 回答 2

3

http://us.ard.yahoo.com您在第一个徘徊$loginurl,它可能应该是一个*.co.jp,您需要查看文档以了解要使用的正确 URL。

另一个问题可能是您在.co.jp和之间切换时忘记更改 URL 签名.com

编辑

当我更多地查看您的代码时,我注意到您立即打开然后关闭 cookie jar,这不起作用,您还使用写入二进制wb标志打开它,这不是必需的。这就是为什么你有一个空的cookie。

你需要做的是

$cookie_file_path = "cookie.txt"; // Please set your Cookie File path
$fp = fopen($cookie_file_path,'w'); 

然后在脚本的最后,您可以关闭 cookie 文件

fclose($fp);
于 2013-09-23T07:55:13.047 回答
0

最后,根据我的研究,无法绕过 oauth 中的雅虎登录,因为登录程序会不断更新。它是oauth,你真正需要的是

  1. 实现用户登录的链接

  2. 登录后,将访问令牌和刷新令牌存储到数据库中

  3. 访问令牌每 1 小时过期一次,因此,在调用 yahoo api 之前,您需要确保访问令牌不会过期,否则,请使用刷新令牌来更新您的访问令牌

  4. 到目前为止,我测试了 4 - 5 天,它运行没有任何问题,但我怀疑刷新令牌会过期,所以在我的程序中,如果刷新令牌过期,我会警告用户再次登录

就这样。希望你能解决你的问题

于 2014-09-01T03:23:26.560 回答