Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сокеты + POST + SID
 
 автор: Киналь   (31.07.2006 в 20:54)   письмо автору
 
 

Не очень удачное название темы, но лучшего не придумал, извините)

В общем, понадобились мне сокеты; поискал по форуму, написал скрипт. Все работает прекрасно. даже получил SID, но вот POST почему-то не отправляется! Код вот:

<?
$sock 
fsockopen($host80$errno$errstr30);
if (!
$sock)
     {
      die(
"($errno ($errstr))");
     }

$data "stat_login=login&Submit=".urlencode('вход')."&stat_password=password\r\n\r\n";
$headers "POST $path HTTP/1.1\r\n";
$headers .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
$headers .= "Referer: http://$host/\r\n";
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
$headers .= "User-Agent: Opera\r\n"
$headers .= "Host: $host\r\n";
$headers .= "Content-Lehgth: ".strlen($data)."\r\n";
$headers .= "Cookie: PHPSESSID=".$sid.";\r\n\r\n";

fwrite($sock$headers.$data);
?>


Проверял по логу MiniBrowser'а - все заголовки совпадают, отличается только ответ сервера - при обращении через сокеты появляется строчка Transfer-Encoding: chunked. В гугле нашел вот что:

Если поле заголовка Transfer-Encoding (раздел 14.40) присутствует и указывает на применение
кодирования передачи "chunked", то длина определяется кодированием по кускам (chunked
encoding) (раздел 3.6).

Думаю, не в этом дело=)

Подскажите, где ошибка? Может, запятую где пропустил?:)

   
 
 автор: WinT   (01.08.2006 в 01:19)
 
   для: Киналь   (31.07.2006 в 20:54)
 

Может проще будет воспользоваться cURL?

   
 
 автор: Саня   (01.08.2006 в 01:25)   письмо автору
 
   для: Киналь   (31.07.2006 в 20:54)
 

В конце запроса у вас получается вот что:
Cookie: PHPSESSID=".$sid.";\r\n\r\n
stat_login=login&Submit=".urlencode('вход')."&stat_password=password\r\n\r\n


Сервер уже не получит данные "stat_login=login&...", так как решит, что запрос закончился на отсылке кукисов. Сервер считает заголовком то, что находится до \r\n\r\n.

Измените строку так:
$headers .= "Cookie: PHPSESSID=".$sid.";\r\n";

   
 
 автор: cheops   (01.08.2006 в 10:44)   письмо автору
 
   для: Саня   (01.08.2006 в 01:25)
 

Нет здесь всё правильно заголовки и данные должны быть разделены лишним символом перевода строки.

   
 
 автор: cheops   (01.08.2006 в 10:45)   письмо автору
 
   для: Киналь   (31.07.2006 в 20:54)
 

Что-то не вижу заголовка "Connection: Close", попробуйте так
<? 
$sock 
fsockopen($host80$errno$errstr30); 
if (!
$sock
     { 
      die(
"($errno ($errstr))"); 
     } 

$data "stat_login=login&Submit=".urlencode('вход')."&stat_password=password\r\n\r\n"
$headers "POST $path HTTP/1.1\r\n"
$headers .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n"
$headers .= "Referer: http://$host/\r\n"
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n"
$headers .= "User-Agent: Opera\r\n";  
$headers .= "Host: $host\r\n"
$headers .= "Content-Lehgth: ".strlen($data)."\r\n"
$headers .= "Cookie: PHPSESSID=".$sid.";\r\n"
$headers .= "Connection: Close\r\n\r\n"

fwrite($sock$headers.$data); 
?>

   
 
 автор: Киналь   (01.08.2006 в 21:26)   письмо автору
 
   для: cheops   (01.08.2006 в 10:45)
 

Попробовал, не получилось(
Вот на всякий случай полностью "переписка" скрипта с сервером.

Ушло:

POST /4users/stats HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Referer: http://azimut-r.ru/
Content-Type: application/x-www-form-urlencoded
User-Agent: Apocalyptica
Host: *хост*
Content-Lehgth: 62
Cookie: PHPSESSID=f814cc7e0a3b02232719bbf2f03bdf11;
Connection: Close

stat_login=login&Submit=%E2%F5%EE%E4&stat_password=password


Пришло:

HTTP/1.1 200 OK
Date: Tue, 01 Aug 2006 17:15:14 GMT
Server: Apache/1.3.33 (Unix)
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked // Подозрительная строчка
Content-Type: text/html; charset=windows-1251


Насчет curl - к стыду своему ничего об этом не знаю. кроме названия, а в поиске что-то все не то( Не подскажете, где бы почитать "от начала"?

   
 
 автор: cheops   (01.08.2006 в 22:47)   письмо автору
 
   для: Киналь   (01.08.2006 в 21:26)
 

Так вроде 200 код состояния, а что на странице приходит в ответ?

   
 
 автор: Киналь   (01.08.2006 в 23:05)   письмо автору
 
   для: cheops   (01.08.2006 в 22:47)
 

А на страница выглядит так, как если бы ничего post'ом не ушло. То есть: если вызвать страницу напрямую через браузер, выведется форма логин/пароль; обработчик формы - сама эта страница. После сабмита выводится либо приватная информация, либо сообщение о неверном логине/пароле и форма. В результате работы моего скрипта выдается форма без сообщения об ошибке. Из этого делаю вывод, что данные просто не дошли.

Только что подумал - а не может это быть из-за того, что я все проделываю из-под Денвера на собственном компьютере? Хотя по идее какая разница...

   
 
 автор: cheops   (02.08.2006 в 10:50)   письмо автору
 
   для: Киналь   (01.08.2006 в 23:05)
 

Нет, если ответ получаете, от денвера уже не зависит, вот чего может не нравится скрипту
User-Agent: Apocalyptica

Попробуйте браузер эмулировать.

   
 
 автор: Киналь   (02.08.2006 в 16:03)   письмо автору
 
   для: cheops   (02.08.2006 в 10:50)
 

Да это я уже от обиды:) Из-под MiniBrowser'а с таким, с позволения сказать, юзер-агентом, заходит. Хотя сейчас попробую ИЕ сымитировать.

UPD: "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)" - не вышло(
Так что там все-таки с curl? Это заменит сокеты?

   
 
 автор: JIEXA   (02.08.2006 в 16:25)   письмо автору
 
   для: Киналь   (02.08.2006 в 16:03)
 

Можно увидить код скрипта, к котрому отсылаются все эти данные?

   
 
 автор: Киналь   (02.08.2006 в 20:09)   письмо автору
 
   для: JIEXA   (02.08.2006 в 16:25)
 

Если бы все было так просто=) Нет, скрипт на чужом сервере.
На всякий случай объясню - никакого криминала, никого я не спамлю и не ломаю) Подключаюсь я к сайту своего провайдера, с мирной целью получить данные по собственному счету (ну там сколько метров трафика ушло и все такое прочее). Заодно и сокеты осваиваю)

   
 
 автор: Саня   (02.08.2006 в 23:10)   письмо автору
 
   для: Киналь   (02.08.2006 в 20:09)
 

Так что там все-таки с curl?
<?php
$headers
[] = "Accept: */*";
$data "stat_login=login&Submit=".urlencode('вход')."&stat_password=password";

$crl curl_init($host);
curl_setopt($crlCURLOPT_POST1); // отправка методом POST
curl_setopt($crlCURLOPT_USERAGENT"Opera");
curl_setopt($crlCURLOPT_REFERER"http://".$host."/");
curl_setopt($crlCURLOPT_COOKIE"PHPSESSID=".$sid); // данные cookie
curl_setopt($crlCURLOPT_POSTFIELDS$data); // данные для передачи
curl_setopt($crlCURLOPT_HTTPHEADER$headers); // дополнительные заголовки
curl_exec($crl);
?>

   
 
 автор: Киналь   (03.08.2006 в 00:11)   письмо автору
 
   для: Саня   (02.08.2006 в 23:10)
 

Спасибо, попробую. Только что записывать в $headers? Только Accept, причем в таком виде? Браузер несколько длиннее отсылает=) Я правильно понял. что заголовки идут массивом?
И еще - где бы все-таки про curl почитать? Посмотрел на phpclub'е и php.net - все примеры по-английски, константы не расшифрованы...

   
 
 автор: Саня   (03.08.2006 в 00:22)   письмо автору
 
   для: Киналь   (03.08.2006 в 00:11)
 

Я правильно понял. что заголовки идут массивом?
Да. И не нужно добавлять перевод строки.
<?php
$hdr
[] = "Connection: close";
$hdr[] = "Accept: */*";
$hdr[] = "Заголовок: значение";
# и такой массив уже можно скармливать CURLOPT_HTTPHEADER

Только Accept, причем в таком виде?
Ну да, ведь всё остальное уже установлено при помощи curl_setopt(). А content-length само посчитается.

Браузер несколько длиннее отсылает=)
Какие хотите, такие и отсылайте.

И еще - где бы все-таки про curl почитать?
В официальной документации всё замечательно написано. Причём есть и на русском.
http://php.net/curl
http://php.net/curl-setopt - а тут и константы все расписаны, правда в английской версии побольше констант описано.

   
 
 автор: Саня   (03.08.2006 в 00:36)   письмо автору
 
   для: Саня   (03.08.2006 в 00:22)
 

Только в моём коде неточность есть одна. В старой версии библиотеки curl опция CURLOPT_COOKIE отсылает заголовок Cookie, а новая - Set-Cookiе.
Вот исправленный вариант:
<?php 
$headers
[] = "Accept: */*"
$headers[] = "Cookie: PHPSESSID=".$sid;
$data "stat_login=login&Submit=".urlencode('вход')."&stat_password=password"

$crl curl_init($host); 
curl_setopt($crlCURLOPT_POST1); // отправка методом POST 
curl_setopt($crlCURLOPT_USERAGENT"Opera"); 
curl_setopt($crlCURLOPT_REFERER"http://".$host."/"); 
curl_setopt($crlCURLOPT_HTTPHEADER$headers); // дополнительные заголовки 
curl_setopt($crlCURLOPT_POSTFIELDS$data); // данные для передачи 
curl_exec($crl); 
?>

   
 
 автор: Shorr Kan   (03.08.2006 в 02:17)   письмо автору
 
   для: Саня   (03.08.2006 в 00:36)
 

Если вернуться к сокетам... Посмотрите хиддены в форме на сайте. Вполне вероятно, что там есть хидден с кукой или с сессией. То есть, нужно не

$data="stat_login=login&Submit=".urlencode('вход')."&stat_password=password"; 

а

$data="stat_login=login&Submit=".urlencode('вход')."&stat_password=password&PHPSESSID=".$sid; 

   
 
 автор: Киналь   (03.08.2006 в 17:57)   письмо автору
 
   для: Shorr Kan   (03.08.2006 в 02:17)
 

Хиддены просмотрел в первую очередь=) Там все просто донельзя:

<form action="http://site.ru/4users/stats" method="POST">
<input type="TEXT" name="stat_login" value="" class="inp">
<input type="PASSWORD" name="stat_password" value="" class="inp">
<input type="submit" name="send" value="вход" class="btn">
</form>


Саня: Спасибо за подробности; иду переделывать под curl.

   
 
 автор: Киналь   (03.08.2006 в 18:39)   письмо автору
 
   для: Киналь   (31.07.2006 в 20:54)
 

Вот ведь зараза!=) Call to undefinied function curl_init() ! А это Денвер, а пакета с curl для него нету... Но ради одного скрипта всю связку настраиывать точно не буду))

   
 
 автор: Loki   (03.08.2006 в 19:45)   письмо автору
 
   для: Киналь   (03.08.2006 в 18:39)
 

так доустановите что нужно... денвер это позволяет

   
 
 автор: Киналь   (03.08.2006 в 22:00)   письмо автору
 
   для: Loki   (03.08.2006 в 19:45)
 

Хех, оказывается, надо было весь РНР переустановить=) Зато получилось! Все работает! Ура, товарищи! Спасибо всем!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования