Виктория В.
5 сообщений
#16 лет назад
Никогда не возникало проблем с парсингом, а тут столкнулась, и не могу понять в чем дело.
Есть GET запрос:

Вводим его в броузер и вответ получаем XML с одной пустой строкой.
Строка пустая, потому как броузер не передал сookie.
Вводим этот запрос еще раз и в ответ получаем ХML со строкой данных, т.к . второй запрос ушел с сookie, полученном в ответе первого запроса.

Теперь все это пробую сделать на php:

function SOCK80 ($url, $request, $response)
{
if (!$sock = fsockopen ($url, 80))
return false;
if (!@fwrite ($sock, $request))
return false;
while (!feof ($sock))
$response.= @fread ($sock, 8192);
fclose ($sock);
return $response;
}

$url = ';;
$request = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\nHost: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n";

$response = SOCK80 ($url, $request, '';

preg_match ('|Cookie:\s(.*?);|', $response, $arr);
$cookie = $arr;

$request = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\nHost: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14\r\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCookie: ".$cookie."\r\n\r\n";

$response = SOCK80 ($url, $request, '';

echo $response;

В ответе получаю XML с пустой строкой
Через снифер вижу, что броузер и скрипт отправляют абсолютно идентичные запросы с сookie,
но броузер возвращает XML со строкой данных, а скрипт с пустой строкой.
В чем может быть проблемма?
Если кто-то поможет решить, гарантирую небольшой бонус в 10WMZ.
Помогите!
Эдуард Третьяков
269 сообщений
#16 лет назад
Смотрите куки, которые отправляете.
Лучше их не копировать, а переписать заново.
В любом случае одна из кук должнв быть PHPSESSID, вторая - tosAgree со значением yes.
Только после этого у меня получилось забрать правильную XMLку.
Если нужно - через несколько минут могу выдать рабочий кусок кода.
Виктория В.
5 сообщений
#16 лет назад
Покажите пожалуйста код.
В моем коде добавление сookie: tosAgree=yes не помогло.
Эдуард Третьяков
269 сообщений
#16 лет назад
Цитата ("VikaS"):
Покажите пожалуйста код.
В моем коде добавление сookie: tosAgree=yes не помогло.


NOTE! Это всего лишь пример.
Файл test.php для командной строки:

$fp = fsockopen("www.freshdrop.net", 80, $errno, $errstr, 30);

if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
echo("Start connection to the Main Site\n\r\n\r");
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: ;;
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$content = '';
while (!feof($fp)) {
$content.= fgets($fp, 128);
}
fclose($fp);
preg_match("/Cookie:(.*);/",$content,$match);
echo("Loaded Cookie:\n\r\n\r");
print_r($match);
}

$fp = fsockopen("www.freshdrop.net", 80, $errno, $errstr, 30);

if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
echo("Start connection to the XML\n\r\n\r");
$out = "GET /php/engine.php?act=load_xml&table_name=closeouts&posStart=0&count=1 HTTP/1.1\r\n";
$out .= "Host: ;;
$out .= "Cookie: ".$match."; tosAgree=yes";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$content = '';
while (!feof($fp)) {
$content.= fgets($fp, 128);
}
fclose($fp);
echo("Loaded XML:\n\r\n\r");
print_r($content);
}


запуск: /usr/bin/php test.php

Список лоадится нормально.
Эдуард Третьяков
269 сообщений
#16 лет назад
Сама ошибка, скорее всего, в том, что при запросе любой сервер вместе с Cookie озвращает путь, для которого устанавливается Cookie:
Cookie: PHPSESSID=26ec830b35bc71f1cf87cee35183d344; path=/

Но во втором запросе path для Cookie передавать не нужно, хотя он у вас при работе вашего скрипта передается. В итоге сервер с другой стороны не воспринимает вашу куку.
Я думаю, что ошибка заключается именно в этом. Дополнительно порою RFC, если нужно, посмотрю, что и как на самом деле.
Тут М.
626 сообщений
#16 лет назад
Все верно, путь передавать не нужно.
Виктория В.
5 сообщений
#16 лет назад
Цитата ("elhsmart"):
Сама ошибка, скорее всего, в том, что при запросе любой сервер вместе с Cookie озвращает путь, для которого устанавливается Cookie:
Cookie: PHPSESSID=26ec830b35bc71f1cf87cee35183d344; path=/

Но во втором запросе path для Cookie передавать не нужно, хотя он у вас при работе вашего скрипта передается. В итоге сервер с другой стороны не воспринимает вашу куку.
Я думаю, что ошибка заключается именно в этом. Дополнительно порою RFC, если нужно, посмотрю, что и как на самом деле.


elhsmart, спасибо!
Ваш код возвращает то, что нужно и бонус безусловно ваш (сообщите мне номер вашего кошелька).
Я вот только пока не поняла, почему не работает мой код. Куку я отправляла правильую, типа PHPSESSID=26ec830b35bc71f1cf87cee35183d344 в моем изначальном коде, и типа
PHPSESSID=26ec830b35bc71f1cf87cee35183d344; tosAgree=yes после вашего первого ответа.
Откуда вы решили, что я отправляла еще и patch ?

Еще раз большое спасибо за помощь.
PS А что такое RFC ?
Эдуард Третьяков
269 сообщений
#16 лет назад
Цитата ("VikaS"):

elhsmart, спасибо!
Ваш код возвращает то, что нужно и бонус безусловно ваш (сообщите мне номер вашего кошелька).
Я вот только пока не поняла, почему не работает мой код. Куку я отправляла правильую, типа PHPSESSID=26ec830b35bc71f1cf87cee35183d344 в моем изначальном коде, и типа
PHPSESSID=26ec830b35bc71f1cf87cee35183d344; tosAgree=yes после вашего первого ответа.
Откуда вы решили, что я отправляла еще и patch ?

Еще раз большое спасибо за помощь.

Незачто. You are welcome.
Только что внимательно пересмотрел оба куска кода.
Было:
preg_match ('|Cookie:\s(.*?);|', $response, $arr);
$cookie = $arr;

Стало:
preg_match("/Cookie:(.*);/",$content,$match);
...
print_r($match);

Банальная ошибка в регулярке ^_^
Так что мне тоже нужно быть внимательнее.
Максим В.
731 сообщение
#16 лет назад
Цитата:
PS А что такое RFC ?


Request for Comments - документы, содержащие спецификации, стандарты и пр. для работы в интернете.