2016-08-24 1 views
0

Я использовал код ниже, чтобы войти в свою учетную запись Amazon в течение нескольких лет, и он внезапно прекратил работать.Мой php-код, который я использую для входа в Amazon, прекратил работу

Он возвращает меня на страницу входа.

Может кто-нибудь сказать мне, в чем проблема, и как я могу это исправить?

<?php 

$email = '[email protected]'; 
$password = 'password'; 

$URL = 'https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fyourstore%2Fhome%3Fie%3DUTF8%26action%3Dsign-out%26path%3D%252Fgp%252Fyourstore%252Fhome%26ref_%3Dnav_youraccount_signout%26signIn%3D1%26useRedirectOnSuccess%3D1'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $URL); 
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/amazoncookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/amazoncookie.txt'); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1);   
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

$page = curl_exec($ch); 

if (!preg_match('/<form name="signIn".*?<\/form>/is', $page, $form)) { 
die('Failed to find log in form!'); 
} 

$form = $form[0]; 

if (!preg_match('/action="([^"]+)"/i', $form, $action)) { 
die('Failed to find login form url'); 
} 

$URL2 = $action[1]; 

$count = preg_match_all('/<input type="hidden"\s*name="([^"]*)"\s*value="([^"]*)"/i', $form, $hiddenFields); 

for ($i = 0; $i < $count; ++$i) { 
$postFields[$hiddenFields[1][$i]] = $hiddenFields[2][$i]; 
} 

$postFields['email'] = $email; 
$postFields['create'] = 0; 
$postFields['password'] = $password; 

$post = ''; 

foreach($postFields as $key => $value) { 
$post .= $key . '=' . urlencode($value) . '&'; 
} 

$post = substr($post, 0, -1); 

curl_setopt($ch, CURLOPT_URL, $URL2); 
curl_setopt($ch, CURLOPT_REFERER, $URL); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 

$page = curl_exec($ch); 


?> 
+0

Я не вижу, как это может вас выбросить. Там ничего нет, что бы сделать переадресацию. –

+0

Ну, код начинается с синтаксических ошибок в самом начале. Поэтому я не вижу, как это могло бы работать в первую очередь. – David

+0

Какие "синтаксические ошибки"? –

ответ

0

Существует known PHP bug связано с CURLOPT_FOLLOWLOCATION.

Рассматривая взаимодействие элементов CURL, может случиться так, что ваш код не изменился годами, но PHP имеет.

+0

Любое предложение о том, как исправить код, чтобы он снова начал работать? –

+0

В вашем CURL_EXEC не разрешено сообщать об ошибке. Попробуйте добавить следующий код в строку exec: 'if (! Curl_exec ($ ch)) { echo 'Error #'. curl_errno ($ ch). ':'. curl_error ($ ч); } ' –

+0

Спасибо, Джефф. Я внимательно изучил источник страницы входа в Amazon, и кажется, что Amazon изменил способ отправки пароля. Я думаю, что они могут использовать java-скрипт сейчас, а не HTML, который они использовали ранее. Вот где мой код заглох. Есть ли другой способ войти в мою учетную запись Amazon через cURL? –

0

ive проверял ваш код на амазонку, и это хорошо работает. ее код немного изменен:

<?php 
function getRandomUserAgent() 
{ 
    $userAgents=array(
     "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", 
     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", 
     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)", 
     "Opera/9.20 (Windows NT 6.0; U; en)", 
     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50", 
     "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]", 
     "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.7) Gecko/20040624 Firefox/0.9", 
     "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/48 (like Gecko) Safari/48"  
    ); 
    $random = rand(0,count($userAgents)-1); 

    return $userAgents[$random]; 
} 

//============================================================================ 
$randIP = "".mt_rand(0,255).".".mt_rand(0,255).".".mt_rand(0,255).".".mt_rand(0,255); 
$email = '[email protected]'; 
$password = 'pass1234325'; 
$customerName = 'body'; 
$passwordCheck = 'pass1234325'; 

// initial login page which redirects to correct sign in page, sets some cookies 
$URL = 'https://www.amazon.com/ap/register?openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fyourstore%2Fhome%3Fie%3DUTF8%26ref_%3Dnav_ya_signin&prevRID=QQTDRH3T7WP058F3RJBC&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=usflex&openid.mode=checkid_setup&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&prepopulatedLoginId=&failedSignInCount=0&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&pageId=usflex&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $URL); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'amazoncookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'amazoncookie.txt'); 
curl_setopt($ch, CURLOPT_USERAGENT,getRandomUserAgent()); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".$randIP."", "HTTP_X_FORWARDED_FOR: ".$randIP."")); 
//curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_STDERR, fopen('php://stdout', 'w')); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

$page = curl_exec($ch); 

//var_dump($page);exit; 

// try to find the actual login form 
if (!preg_match('/<form id="ap_register_form" name="register".*?<\/form>/is', $page, $form)) { 
    die('Failed to find log in form!'); 
} 

$form = $form[0]; 

// find the action of the login form 
if (!preg_match('/action=(?:\'|")?([^\s\'">]+)/i', $form, $action)) { 
    die('Failed to find login form url'); 
} 

$URL2 = $action[1]; // this is our new post url 

// find all hidden fields which we need to send with our login, this includes security tokens 
$count = preg_match_all('/<input type="hidden"\s*name="([^"]*)"\s*value="([^"]*)"/i', $form, $hiddenFields); 

$postFields = array(); 

// turn the hidden fields into an array 
for ($i = 0; $i < $count; ++$i) { 
    $postFields[$hiddenFields[1][$i]] = $hiddenFields[2][$i]; 
} 

// add our login values 
$postFields['email'] = $email; 
$postFields['password'] = $password; 
$postFields['customerName'] = $customerName; 
$postFields['passwordCheck'] = $passwordCheck; 

$post = ''; 

// convert to string, this won't work as an array, form will not accept multipart/form-data, only application/x-www-form-urlencoded 
foreach($postFields as $key => $value) { 
    $post .= $key . '=' . urlencode($value) . '&'; 
} 

$post = substr($post, 0, -1); 

// set additional curl options using our previous options 
curl_setopt($ch, CURLOPT_URL, $URL2); 
curl_setopt($ch, CURLOPT_REFERER, $URL); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".$randIP."", "HTTP_X_FORWARDED_FOR: ".$randIP."")); 

$page = curl_exec($ch); // make request 
var_dump($page); // should be logged in 

?>