| |
|
|
| | Не очень удачное название темы, но лучшего не придумал, извините)
В общем, понадобились мне сокеты; поискал по форуму, написал скрипт. Все работает прекрасно. даже получил SID, но вот POST почему-то не отправляется! Код вот:
<?
$sock = fsockopen($host, 80, $errno, $errstr, 30);
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? | |
| |
|
|
| |
|
|
| |
для: Киналь
(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";
|
| |
| |
|
|
| |
|
|
| |
для: Саня
(01.08.2006 в 01:25)
| | | Нет здесь всё правильно заголовки и данные должны быть разделены лишним символом перевода строки. | |
| |
|
|
| |
|
|
| |
для: Киналь
(31.07.2006 в 20:54)
| | | Что-то не вижу заголовка "Connection: Close", попробуйте так
<?
$sock = fsockopen($host, 80, $errno, $errstr, 30);
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);
?>
|
| |
| |
|
|
| |
|
|
| |
для: 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 - к стыду своему ничего об этом не знаю. кроме названия, а в поиске что-то все не то( Не подскажете, где бы почитать "от начала"? | |
| |
|
|
| |
|
|
| |
для: Киналь
(01.08.2006 в 21:26)
| | | Так вроде 200 код состояния, а что на странице приходит в ответ? | |
| |
|
|
| |
|
|
| |
для: cheops
(01.08.2006 в 22:47)
| | | А на страница выглядит так, как если бы ничего post'ом не ушло. То есть: если вызвать страницу напрямую через браузер, выведется форма логин/пароль; обработчик формы - сама эта страница. После сабмита выводится либо приватная информация, либо сообщение о неверном логине/пароле и форма. В результате работы моего скрипта выдается форма без сообщения об ошибке. Из этого делаю вывод, что данные просто не дошли.
Только что подумал - а не может это быть из-за того, что я все проделываю из-под Денвера на собственном компьютере? Хотя по идее какая разница... | |
| |
|
|
| |
|
|
| |
для: Киналь
(01.08.2006 в 23:05)
| | | Нет, если ответ получаете, от денвера уже не зависит, вот чего может не нравится скрипту
Попробуйте браузер эмулировать. | |
| |
|
|
| |
|
|
| |
для: cheops
(02.08.2006 в 10:50)
| | | Да это я уже от обиды:) Из-под MiniBrowser'а с таким, с позволения сказать, юзер-агентом, заходит. Хотя сейчас попробую ИЕ сымитировать.
UPD: "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)" - не вышло(
Так что там все-таки с curl? Это заменит сокеты? | |
| |
|
|
| |
|
|
| |
для: Киналь
(02.08.2006 в 16:03)
| | | Можно увидить код скрипта, к котрому отсылаются все эти данные? | |
| |
|
|
| |
|
|
| |
для: JIEXA
(02.08.2006 в 16:25)
| | | Если бы все было так просто=) Нет, скрипт на чужом сервере.
На всякий случай объясню - никакого криминала, никого я не спамлю и не ломаю) Подключаюсь я к сайту своего провайдера, с мирной целью получить данные по собственному счету (ну там сколько метров трафика ушло и все такое прочее). Заодно и сокеты осваиваю) | |
| |
|
|
| |
|
|
| |
для: Киналь
(02.08.2006 в 20:09)
| | | Так что там все-таки с curl?
<?php
$headers[] = "Accept: */*";
$data = "stat_login=login&Submit=".urlencode('вход')."&stat_password=password";
$crl = curl_init($host);
curl_setopt($crl, CURLOPT_POST, 1); // отправка методом POST
curl_setopt($crl, CURLOPT_USERAGENT, "Opera");
curl_setopt($crl, CURLOPT_REFERER, "http://".$host."/");
curl_setopt($crl, CURLOPT_COOKIE, "PHPSESSID=".$sid); // данные cookie
curl_setopt($crl, CURLOPT_POSTFIELDS, $data); // данные для передачи
curl_setopt($crl, CURLOPT_HTTPHEADER, $headers); // дополнительные заголовки
curl_exec($crl);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Саня
(02.08.2006 в 23:10)
| | | Спасибо, попробую. Только что записывать в $headers? Только Accept, причем в таком виде? Браузер несколько длиннее отсылает=) Я правильно понял. что заголовки идут массивом?
И еще - где бы все-таки про curl почитать? Посмотрел на phpclub'е и php.net - все примеры по-английски, константы не расшифрованы... | |
| |
|
|
| |
|
|
| |
для: Киналь
(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: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($crl, CURLOPT_POST, 1); // отправка методом POST
curl_setopt($crl, CURLOPT_USERAGENT, "Opera");
curl_setopt($crl, CURLOPT_REFERER, "http://".$host."/");
curl_setopt($crl, CURLOPT_HTTPHEADER, $headers); // дополнительные заголовки
curl_setopt($crl, CURLOPT_POSTFIELDS, $data); // данные для передачи
curl_exec($crl);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Саня
(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;
|
| |
| |
|
|
| |
|
|
| |
для: 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. | |
| |
|
|
| |
|
|
| |
для: Киналь
(31.07.2006 в 20:54)
| | | Вот ведь зараза!=) Call to undefinied function curl_init() ! А это Денвер, а пакета с curl для него нету... Но ради одного скрипта всю связку настраиывать точно не буду)) | |
| |
|
|
| |
|
|
| |
для: Киналь
(03.08.2006 в 18:39)
| | | так доустановите что нужно... денвер это позволяет | |
| |
|
|
| |
|
|
| |
для: Loki
(03.08.2006 в 19:45)
| | | Хех, оказывается, надо было весь РНР переустановить=) Зато получилось! Все работает! Ура, товарищи! Спасибо всем! | |
| |
|
|