#php #flash #post #curl #flashvars
#php #flash #Публикация #curl #flashvars
Вопрос:
Я пытаюсь воспроизвести POST-запрос, который был получен из WireShark, используя PHP. Этот POST-запрос был отправлен объектом Flash (.swf), поэтому настройка заголовка немного сложна.
В конце ничего не выводится, поэтому, должно быть, что-то не так с PHP-кодом, который я не смог увидеть.
Вот что зафиксировал WireShark:
POST /engine/ HTTP/1.1rn
Host: abcdef.comrn
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/4.0rn
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8rn
Accept-Language: en-us,en;q=0.5rn
Accept-Encoding: gzip, deflatern
Accept-Charset: UTF-8,*rn
Keep-Alive: 115rn
Connection: keep-alivern
Cookie: __utma=77520967.190998754.1302600802.1302605710.1302693085.3; __utmz=77520967.1302600802.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); PHPSESSID=vqtt7v2l5h10nd06fdsuii49e0; __utmc=77520967
Referer: http://abcdef.com/v2.swfrnrn
Referer: http://abcdef.com/v2.swfrn
Content-Type: application/x-amfrn
Content-Length: 50rn
rn
Вот PHP-код с info.txt был создан шестнадцатеричным редактором, и вся информация верна (т. е. 50 байт, точное шестнадцатеричное содержимое, захваченное WireShark)
// Get cookie
$ch = curl_init('http://abcdef.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
preg_match('/^Set-Cookie: (.*?);/m', curl_exec($ch), $m);
// Read x-amf data
$fileHandle = fopen("info.txt", "rb");
$postdata = stream_get_contents($fileHandle);
fclose($fileHandle);
// Send POST request to server
$opts = array('http' =>
array(
'method' => 'POST',
'header' => "
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/4.0rn
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8rn
Accept-Language: en-us,en;q=0.5rn
Accept-Encoding: gzip, deflatern
Accept-Charset: UTF-8,*rn
Keep-Alive: 115rn
Cookie: ".$m[1]."rn
Connection: keep-alivern
Referer: http://abcdef.com/v2.swfrn
Content-Type: application/x-amfrn
Content-Length: 50rn",
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://abcdef.com/engine/', false, $context);
print_r($result);
Результатом является пустая страница вместо ответа от сервера.
Комментарии:
1. ох… Я предположил, что cookie не нужен, но я просто добавил «Cookie: __utma=77520967.190998754.1302600802.1302605710.130269308 ….» и все тот же результат — пустое место без ответа ….
2. учитывая, что там есть файл cookie сеанса PHP, можно предположить, что вам нужно будет получить действительный идентификатор сеанса..
3. Я только что добавил cookie / php-сессию в приведенный выше код. все еще пустая страница: (
4. если это ваше приложение, из которого вы пытаетесь получить содержимое, или есть опубликованный API, я бы проверил назначение различных файлов cookie. Теоретически, использование CURL для хранения файлов cookie сеанса должно работать, но это может быть просто методом проб и ошибок, пока вы не найдете что-то, что работает.
5. Проблема решена, спасибо за вашу помощь. CURL намного лучше. Теперь все работает нормально.
Ответ №1:
Пример решения:
// Get content of x-amf file (must read in binary mode)
$fileHandle = fopen("info.txt", "rb");
$postdata = stream_get_contents($fileHandle);
fclose($fileHandle);
// Get cookie for CURL
$ch = curl_init('http://abcdef.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
preg_match('/^Set-Cookie: (.*?);/m', curl_exec($ch), $m);
// Set headers for CURL (with cookie stored in $m)
$header = array(
"POST /engine/ HTTP/1.1",
"User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10",
"Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language: de, en-gb;q=0.9, en;q=0.8",
"Accept-Encoding: gzip",
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Connection: close",
"Referer: http://abcdef.com/v2.swf",
"Content-Type: application/x-amf",
"Cookie: ".$m[1],
"Host: abcdef.com",
"Content-Length: 50",
);
// Set options for CURL
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postdata,
CURLOPT_FOLLOWLOCATION =>true
);
// POST the CURL and enjoy the outcome :)
$ch = curl_init("http://abcdef.com");
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );