Не удалось войти в Amazon с помощью php/Curl

avatar
Bruce Wayne
8 апреля 2018 в 10:05
272
0
0

Я входил в свою учетную запись Amazon в течение многих лет, используя простую функцию curl, которую я написал. Этот код работал долгое время, пока пару дней назад Amazon не изменил свою страницу входа, и мой код перестал работать. Я ломал голову, пытаясь понять, в чем проблема. Кто-нибудь может помочь?

Вот мой текущий код:

<?php

$email    = 'name@mycompany.com';
$password = 'password1234';

$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%26ref_%3Dgno_signin';

$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);
Источник
Gilles Gouaillardet
8 апреля 2018 в 10:34
0

Amazon обычно предоставляет множество API. Возможно, вы захотите найти тот, который соответствует вашим потребностям, вместо того, чтобы писать свой собственный разборщик.

Nico Haase
8 апреля 2018 в 11:24
0

Он не должен просто «перестать работать». У вас уже есть некоторые части отлова ошибок — какая из них срабатывает? Или есть какое-то дополнительное сообщение об ошибке?

Ответы (0)