Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > эмуляция браузера fsockopen


Автор: beAth10N 15.3.2007, 14:38
Люди помогите. Весь день бьюсь  smile . Для связки двух систем приходится эмулировать запросы браузера в PHP, в запрашиваемых страницах находится форма, и результат выполнения нек скрипта по этой форме. В первый раз, я посылаю  GET запрос 
 
GET /samo/index.php/fr_monitor HTTP/1.1  
Host: online.pegastour.ru  
Content-Type: text/html; charset=iso-8859-1  
Connection: close 
 
Когда форма заполняется то формирую POST запрос.  
 
POST /samo/index.php/fr_monitor HTTP/1.1  
User-Agent: PHP Script  
Host: online.pegastour.ru  
Content-Type: application/x-www-form-urlencoded  
Content-Length: 39  
Connection: close  
 
MONTH=3&YEAR=2007&TOURINC=43&CLASSINC=2 
 
Потом копирую тело от <body> до </body>, и все вроде отлично, тока В РЕЗУЛЬТИРУЮЩЕЙ СТРАНИЦЕ ПОЯВЛЯЮТСЯ СИМВОЛЫ ffb (почему то именно они) и разможаются гады по всей странице в разном количестве. Если зайти браузером то ниче такого нет. А если эмулировать то выползают, причем всегда, и в гет запросе и в пост. Мож в запросах ошибка? Помогите пожалуйста.

Автор: mishaSL 15.3.2007, 15:37
beAth10N, покажите пожалуйста ваш скрипт.

Автор: beAth10N 15.3.2007, 16:22
Цитата

покажите пожалуйста ваш скрипт.

вот скрипт, кстати я  заметил что не только ffb вставляется, вообще любая абракадабра появляется, но именно по 3 символа
Код

$content_lenght = 0; // в этой переменной я собственно храню значение контен-ленс, если форман е сабнитилась, то равно 0

//считываю входящие заголовки, если там есть контент ленс, то  присваиваю его значение моей переменной
$headers = apache_request_headers();
foreach ($headers as $header => $value) if ($header == 'Content-Length') $content_lenght = $value;

$host = "online.pegastour.ru";
$uri = "/samo/index.php/".$prop;

$samo = @fsockopen($host,80);
$vars = '';
$request = '';
if ($content_lenght)//если есть контен-денс, значит был сабмит формы, значит генерирую post запрос
{
    foreach ($_POST as $name => $value1) $vars .= "{$name}={$value1}&";
    $vars = substr($vars,0,strlen($vars)-1);
    $request .= "POST {$uri}  HTTP/1.1\r\n";
    $request .= "Host: {$host}\r\n";
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Content-Length: {$content_lenght}\r\n";
    $request .= "Connection: close\r\n";
    $request .= "\r\n";
    $request .= $vars;

}else//если контент-ленс = 0, значит форма не трогалась и шлем обычный гет запрос
{
    $request .= "GET {$uri} HTTP/1.1\r\n";
    $request .= "Host: {$host}\r\n";
    $request .= "Content-Type: text/html; charset=iso-8859-1\r\n";
    $request .= "Connection: close\r\n\r\n";
}

$body = '';
@fputs($samo, $request);                                    
while(!feof($samo)) $body .= @fgets($samo));//считываю полученное в переменную
@fclose($samo);
$body_start = strpos($body,"<body>");
$body_end = strpos($body,"</body>");
if ($body_start !== false) $body = substr($body,$body_start+6,$body_end-$body_start);//вырезаю часть, расположенную между тегами <body></body>
echo $body;

Автор: AmraKimmerian 22.11.2009, 16:35
Хотел бы апнуть тему, так как ответа нет и может быть спустя 2,5 года он появится.
У меня такая же проблема: сохранаяю текст страницы в переменную:
Код

// ПОКА ПУСТАЯ ПЕРЕМЕННАЯ
    $f='';
    // ОТКРЫВАЕМ СОЕДИНЕНИЕ ЧЕРЕЗ СОКЕТ
    $fp = fsockopen($host, 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        // Подадрес и сортировка по дате
        $out = "GET /".$page.$params." HTTP/1.1\r\n";
        // Сервер
        $out .= "Host: ".$host."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        // ПЕРЕДАЕМ ПАРАМЕТРЫ СТРАНИЦЕ
        fwrite($fp, $out);
        // ЗАГРУЖАЕМ ДАННЫЕ ПО ЧАСТЯМ И ЗАПИСЫВАЕМ В ПЕРЕМЕННУЮ
        while (!feof($fp)) {
            $f .= fgets($fp, 1024);
        }
    }
    echo $f;
    // ЗАКРЫВАЕМ СОЕДИНЕНИЕ ЧЕРЕЗ СОКЕТ
    fclose($fp);

Эхо все выдает, но в тексте то тут то там (но только не внутри начала или конца тега <...> ) появляются по три символа - латинские буквы и цифры - в  любом сочетании: 9ab, 47a, a31. 962, 8fc и т. д. Это основательно портит возможность дальнейшего разбора страницы.
Подскажите пожалуйста, из-за чего появляются эти символы?

Автор: Pitlord 22.11.2009, 19:12
Из-за незнания HTTP/1.1. Замените
Цитата(beAth10N @  15.3.2007,  16:22 Найти цитируемый пост)
 $request .= "POST {$uri}  HTTP/1.1\r\n";

на
Цитата(beAth10N @  15.3.2007,  16:22 Найти цитируемый пост)
 $request .= "POST {$uri}  HTTP/1.0\r\n";


Добавлено через 7 минут и 25 секунд
Вернее, в Вашем случае надо менять версию протокола в этой строке:
Код

$out = "GET /".$page.$params." HTTP/1.1\r\n";

Автор: AmraKimmerian 24.11.2009, 20:03
Спасибо, Pitlord! Работает!
Почитаю ка я про HTML 1.0 и 1.1.

Я бы отметил тему как решенную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)