У меня есть скрипт, который использует загрузку cURL для входа на сайт и отправки ряда форм, однако недавно он перестал работать из-за того, что запросы cURL возвращают 302s и перенаправляют на страницу блока / конечной точки. Если я делаю те же действия с браузером, у меня нет перенаправлений, только 200 OK.
Мой cURL использует cookie, возвращаемый процессом входа в систему, поэтому я не думаю, что сеанс удаляется.
Первоначально я думал, что токен CSRF (какого-то рода) отсутствует, учитывая местоположение перенаправления, и что более поздние формы в процессе (с использованием браузера) содержат скрытое поле токена CSRF, но URL-адрес не требует опубликованных данных.
CURL и ответ следующие:
curl_setopt($ch, CURLOPT_URL, 'https://*******.********.co.uk/Dispatcher?menuid=pos_home');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 0);
$content = curl_exec ($ch);
echo "CURL INFO : <BR/><pre>" ;
print_r(curl_getinfo($ch));
который возвращает:
Array
(
[url] => https://*******.********.co.uk/Dispatcher?menuid=pos_home
[content_type] => text/html
[http_code] => 302
[header_size] => 253
[request_size] => 332
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.142718
[namelookup_time] => 2.4E-5
[connect_time] => 2.4E-5
[pretransfer_time] => 9.0E-5
[size_upload] => 43
[size_download] => 327
[speed_download] => 2291
[speed_upload] => 301
[download_content_length] => -1
[upload_content_length] => 43
[starttransfer_time] => 0.142659
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => nnn.nnn.nnn.nn
[primary_port] => 443
[local_ip] => nnn.nnn.nnn.nn
[local_port] => 53154
[redirect_url] => https://*******.********.co.uk/Dispatcher?menuid=badorMissingCSRFT
)
Если у кого-то есть идеи, почему или как сервер может дать другой ответ для cURL на запрос браузера, я был бы очень признателен — спасибо.
Вам необходимо следовать перенаправлению:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Другие причины не следовать перенаправлению:
4.14 Перенаправляет работу в браузере, но не с curl!
curl прекрасно поддерживает перенаправления HTTP (см. пункт 3.8). Браузеры обычно поддерживают, по крайней мере, два других способа выполнения перенаправлений, которых нет в curl:
Мета-теги. Вы можете написать HTML-тег, который заставит браузер перенаправить на другой данный URL-адрес через определенное время.
Javascript. Вы можете написать программу Javascript, встроенную в HTML-страницу, которая перенаправляет браузер на другой заданный URL-адрес.
Невозможно заставить curl следовать этим перенаправлениям. Вы должны либо вручную выяснить, для чего предназначена страница, либо написать скрипт, который анализирует результаты и выбирает новый URL.
источник: http://curl.haxx.se/docs/faq.html#Redirects_work_in_browser_but_no
Может быть, сервер начал проверять User-Agent:
или Referer:
Заголовки HTTP.
Попробуйте прослушать запросы, отправленные вашим браузером (средства разработчика современных браузеров сообщают вам, как выглядит запрос) и обновите cUrl
код, соответствующий запросу, отправленному браузером.
Также рассмотрите предложения, которые вы получили в комментариях к вопросу (спросите владельца сайта или просто прекратите собирать их сайт автоматически).
свернуться с опцией -L или —location, чтобы следовать перенаправлению.
curl -L google.com