2011-03-25 3 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

아마 바보 같은 질문을 원하지만, 여전히 "정상"방식으로 로그인 할 수 done=http://calendar.yahoo.com

에 또는 어디? 또한 로그온 할 때 어떤 헤더가 전송되는지 확인하십시오. 아마도 뭔가가 그들의 형태로 바뀌었을 것입니다! – ChrisH

+0

위의 코드는 로컬 서버에서 제대로 작동하지만 라이브 서버에 업로드하면 전혀 작동하지 않고 항상 로그인 페이지를 계속 표시합니다. 나는 살아있는 리눅스 서버를 가지고있다. 무슨 문제가 될 수 있니 ..? –

+0

을 제안하십시오. 라이브와 로컬 모두 동일한 PHP.ini 설정을 갖고 있는지 확인하십시오. 'ini_set ('display_errors', 'on') 오류를 모두 표시했는지 확인하십시오. error_reporting (E_ALL); ' – ChrisH

답변

1

아무도 이것에 응답하지 않은 것처럼 보입니다. 그리고 나는 그 성가신 문제를 안다.

쿠키 이름/jar ...을 설정하는 곳을 볼 수 있지만 읽기/쓰기로 파일을 열지는 않습니다.

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

이 스크립트의 끝에서 열려있는 파일을 닫고 삭제하는 것을 잊지 마세요 :이 솔루션은 ... 또한

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

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar_file); 

먼저 파일에 fopen()를 사용하는 likley보다 더했다.

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; 

여기서 PostFeild에는 "완료 됨"이라는 필드가 있습니다.

설정하는 것이 당신은. 로그인 후 갈

관련 문제