Имитация POST с PHP и cURL

Я пытаюсь смоделировать POST на веб-сайт на основе того, что я вижу, исходя из заголовков HTTP в Firefox.

Вот копия / вставка журнала из плагина Firefox:

POST / context? Tab = login HTTP / 1.1
Хост: веб-сайт
User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.13) Gecko / 20101206 Ubuntu / 10.10 (maverick) Firefox / 3.6.13
Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: en-us, en; q = 0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7
Keep-Alive: 115
Подключение: сохранить жизнь
Референт: референт
Cookie: fontsize = 2; JSESSIONID = 0000pXE_BK7TjZFzEyNHqOKzXz2: -1
Content-Type: application / x-www-form-urlencoded
Контент-длина: 46
LoginID = пароль и пароль = пароль и Войти = Войти

И ответ, который следует сразу после POST:

HTTP / 1.1 302 Найдено
Расположение: сайт / контекст? Tab = p00689
Content-Language: en-US
Set-Cookie: JSESSIONID = 0000oaKlIeeDRWkX5YCiJu5v1lM: -1; Path = /
Передача-кодирование: chunked
Дата: Пн, 07 Фев 2011 14:15:21 GMT
Сервер: WebSphere Application Server / 6.1
Истекает: Чт, 01 декабря 1994 г. 16:00:00 GMT
Cache-Control: no-cache = "set-cookie, set-cookie2"

Основываясь на моем тестировании, ответ, который перенаправляется на

сайт / контекст? Вкладка = p00689

Означает, что пользователь был аутентифицирован, и все работает правильно.

Однако, когда вы пытаетесь выполнить это через PHP и cURL, меня перенаправляют на страницу, которая информирует пользователя о том, что их сеанс завершен.

Вот код:

// Provider only likes Firefox $agent = "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13"; ini_set("user_agent", $agent); // Cookie $cookie = tempnam("/tmp", "curlcookie"); // Post everything that was posted to me. $fields = $_POST; foreach($fields as $key=>$value) { $fields_string .= "$key=$value&"; } $fields_string = substr($fields_string, 0, strlen($fields_string) - 1); // Custom headers $headers = array( "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language: en-us,en;q=0.5", "Accept-Encoding: gzip,deflate", "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Keep-Alive: 115", "Connection: keep-alive"); // cURL options $ch = curl_init("website"); curl_setopt($ch, CURLOPT_REFERER, "referer"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_MAXREDIRS, 1); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $output = curl_exec($ch); $header = curl_getinfo($ch); curl_close($ch); // Debugging junk echo nl2br($header["request_header"]); echo "<br/><br/>Output:<br/><br/>$output"; 

Результат этого скрипта выглядит следующим образом:

POST / context? Tab = login HTTP / 1.1
User-Agent: User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.13) Gecko / 20101206 Ubuntu / 10.10 (maverick) Firefox / 3.6.13
Хост: веб-сайт
Pragma: no-cache
Референт: референт
Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: en-us, en; q = 0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7
Keep-Alive: 115
Подключение: сохранить жизнь
Контент-длина: 46
Content-Type: application / x-www-form-urlencoded

LoginID = имя пользователя и пароль = пароль и Войти = Войти

Вывод:

HTTP / 1.1 302
Найденный
Расположение: сайт / контекст вкладка = p00697
Content-Language: en-US Set-Cookie:
JSESSIONID = 0000Tl8NL1Hg2dbNv_PEnq-bbvr: -1;
Path = / Set-Cookie:
JSESSIONID = 0000Zue58y1tXg3tt4XjB8exXw6: -1;
Path = / Transfer-Encoding: chunked
Дата: Пн, 07 Фев 2011 19:18:20 GMT
Сервер: приложение WebSphere
Сервер / 6.1 Истекает: Чт, 01 декабря 1994 г.
16:00:00 GMT Cache-Control:
нет кэша = "Set-Cookie,
установленный Cookie2"

На основании того, что я опубликовал, есть ли что-то очевидное, что я пропал? Что мне делать дальше? Запросы выглядят семантически одинаково; Я не уверен, что я мог бы делать неправильно.

Единственное, что выделяется, это следующая строка кода:

 $cookie = tempnam("/tmp", "curlcookie"); 

Теперь, если это не удается создать файл, тогда tempnam вернет false, что означает, что следующие строки кода:

 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 

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

следующая вещь:

 $fields = $_POST; foreach($fields as $key=>$value) { $fields_string .= "$key=$value&"; } $fields_string = substr($fields_string, 0, strlen($fields_string) - 1); 

Вам не нужно делать это, так как CURLOPT_POSTFIELDS принимает массив, чтобы вы могли это сделать:

 curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 

Это позволит убедиться, что объекты правильно разобраны.

Я также думаю, что вы можете удалить ini_set поскольку это для встроенных функций, таких как file_get_contents и fopen streams и т. Д., Поэтому дважды проверьте строку:

 ini_set("user_agent", $agent); 

Также я бы посмотрел, есть ли файл cookie, уже установленный с главной страницы, например index.php, поскольку сайт может блокировать запросы из источников, которые попали непосредственно на страницу входа с данными.