Войти

Показать полную графическую версию : [решено] Ошибка 400 в POST-запросе (PHP)


Luzuk
19-10-2015, 08:25
Здравствуйте!

До этого писал функцию для парсера (http://forum.oszone.net/nextnewesttothread-229890.html).
Все нормально работало, а теперь в ответ получаю: HTTP Error 400. The size of the request headers is too long.

Вот код функции:
function post_content ($url,$postdata) {
$uagent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0";
$headers = array
(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding: deflate'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_POST, true); // установка метода передачи параметров
// curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // установка браузера
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // возвращает веб-страницу
// curl_setopt($ch, CURLOPT_HEADER, false); // не возвращает заголовки
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // добавляем заголовков
curl_setopt($ch, CURLOPT_PROXY, 'x.x.x.x:xxxx'); // Прокси
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');// авторизация
curl_setopt($ch, CURLOPT_REFERER, $url);// Подделываем значение - откуда пришли данные.
// curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, "elib_cookie.txt"); // Функции для обработки установливаемых сайтом кук.
curl_setopt($ch, CURLOPT_COOKIEFILE,"elib_cookie.txt"); // Функции для обработки установливаемых сайтом кук.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // разрешить переадресацию
curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // таймаут ответа
// curl_setopt($ch, CURLOPT_FAILONERROR, true); // подробный отчет об ошибках
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); //формируем сам запрос


$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );

$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}


Использую ее здесь:

$url = 'http://elibrary.ru/authors.asp';

$post='authors_all=&pagenum=&authorbox_name=&selid=&orgid=984&orgadminid=&surname=&codetype=SPIN&codevalue=
&town=&countryid=&orgname=%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%BA%D1%81%D0
%BA%D0%B8%D0%B9+%D0%B3%D0%BE%D1%81%D1%83%D0%B4%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B
%D0%B9+%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82+%D1%8D%D0%BA%D0%BE%D0%BD%D 0
%BE%D0%BC%D0%B8%D0%BA%D0%B8+%D0%B8+%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0&rubriccode=&sortorder=0
&order=0&hid741746=%D0%9C%D0%B0%D1%81%D0%BB%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F+%D0%9E+%D0%92&authorboxid
=0';

$result = post_content( $url, $post );

echo "errno ".$result['errno']."<br/>
errmsg ".$result['errmsg']."<br/>
content ".$result['content']."<br/>";



Как я понял на сайте, что-то поменяли....
Перехватил POST-запрос с помощью FireBug, пробовал скопировать от туда POST-запрос полностью, толку ноль!
Вот что было в FireBug:


POST http://elibrary.ru/authors.asp HTTP/1.1

Host: elibrary.ru

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://elibrary.ru/authors.asp

Cookie: UserID=1475842157; SesCookieID=358975791; __utma=216012346.286143210.1435126771.1445224911.1454871428.6; __utmz=216042306.1435126771.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=216042306; __utmb=216154306.1.10.1457891428; __utmt=1

Connection: keep-alive

HTTP/1.0 200 OK

Cache-Control: private

Content-Length: 225396

Content-Type: text/html; Charset=UTF-8

Server: Microsoft-IIS/7.0

X-Powered-By: ASP.NET

Date: Mon, 19 Oct 2015 05:10:49 GMT

X-Cache: MISS from libnh.vvsu.ru, MISS from nh.vvsu.ru

X-Cache-Lookup: MISS from libnh.vvsu.ru:3128, MISS from nh.vvsu.ru:3128

Via: 1.0 libnh.vvsu.ru (squid), 1.0 nh.vvsu.ru (squid)

Proxy-Connection: keep-alive

Content-Length
610
Content-Type
application/x-www-form-urlencoded

authors_all=&pagenum=&authorbox_name=&selid=&orgid=984&orgadminid=&surname=&codetype=SPIN&codevalue=
&town=&countryid=&orgname=%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%BA%D1%81%D0
%BA%D0%B8%D0%B9+%D0%B3%D0%BE%D1%81%D1%83%D0%B4%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B
%D0%B9+%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82+%D1%8D%D0%BA%D0%BE%D0%BD%D 0
%BE%D0%BC%D0%B8%D0%BA%D0%B8+%D0%B8+%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0&rubriccode=&sortorder=0
&order=0&hid741746=%D0%9C%D0%B0%D1%81%D0%BB%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F+%D0%9E+%D0%92&authorboxid
=0

Luzuk
19-10-2015, 09:26
Нашел причину :)
Что-то не то было с сессией.
Добавил
curl_setopt($ch, CURLOPT_COOKIESESSION, true); //начинает новую сессию

И все заработало :)


А бился с этим почти неделю....................




© OSzone.net 2001-2012