|
|
|
| плиз дайте мне ман по этой теме...
или ещо лутше приведите пример правельных заголовков
вот что то вроде таких..
POST /login.php HTTP/1.1
Host: http://anysite.ru
Content-type: application/x-www-form-urlencoded
Content-Length: 74
username=LOGIN&password=03080308&login=PASS
|
и как работать с ними через ПХП (с сокетами)
т.е. превидите пример правельного построения заголовков и полной эмуляции браузера..
.. я пробовал отправить данные через сокеты методом POST - выдает ошибку 400 ... хотя взвешивыю длинну POST переменных правильно..
заранее спасибо.. | |
|
|
|
|
|
|
|
|
для: cheops
(26.07.2007 в 11:13)
| | Огромное спасибо за подборку топиков и компетентные ответы, мануалы на подобную тему практически невозможно найти в сети. Многое для себя прояснил, однако кое-что все еще непонятно. Во-первых, если я не ошибаюсь, везде чтение ответов сервера ограничено последним аргументом функции fgets();, чаще всего до 1kb. Как принять весь контент, отправленный в ответ на текущий запрос?
Во-вторых, вопрос подмены IP- как же все-таки заставить скрипт отправлять запросы через прокси?
и, в-третьих, можно ли эмулировать с помощью fsockopen и ее друзей отправку UPLOAD-формы?
P.S. хотел еще спросить, как отделить полученые заголовки от html, но, кажется сам понял- по \r\n\r\n =) | |
|
|
|
|
|
|
|
для: amigo62
(27.07.2007 в 17:13)
| | 1кб в примерах , обычно - размер последовательно читаемого блока, а не предельный размер контента.
всё это можно делать. и аплоады и обмен через прокси и всё остальное.
Но нужно отдавать себе отчет в том, что HTTP-протокол, особенно его версия 1.1 - совсем не такой простой, как кажется на первый взгляд.
Поэтому альтернатива в виде применения библиотеки CURL обычно оказывается более надежным и устойчивым методом межсерверной коммуникации, нежели fsockopen и иже с ним. | |
|
|
|
|
|
|
|
для: cheops
(26.07.2007 в 11:13)
| | Мм, и все-таки? Я разбирался с cURL, но
"Прямые норы роет
Упрямый глупый крот,
Нормальные герои
Всегда идут в обход..."
=) короче говоря, хочувсезнатьскорейскорей =).
И еще, чуть не забыл :
<?php
$fp=fsockopen($host,80,$errno,$errstr,30);
?>
| что задает последний аргумент? | |
|
|
|
|
|
|
|
для: amigo62
(27.07.2007 в 18:24)
| | =) короче говоря, хочувсезнатьскорейскорей =).
И я;)
что задает последний аргумент?
Timeout fsockopen(); | |
|
|
|
|
|
|
|
для: amigo62
(27.07.2007 в 18:24)
| | Это время в секундах, которое функция будет ждать ответа от сервера, если в течении этого времени ответа не последует - функция вернёт false и выведит предупреждение о невозоможности установить соединение. | |
|
|
|
|
|
|
|
для: deman-b
(25.07.2007 в 20:52)
| | Хотел скрипт выложить, да что то ни в какую не хочет помещаться, и не прицепляется, не подскажет кто-нибудь тут ограничение на сколько символов в одном посте установлено?! | |
|
|
|
|
|
|
|
для: testdriver
(27.07.2007 в 21:00)
| | Это не лимит форума....
Это nginx кусается. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2007 в 21:17)
| | testdriver, выложите фрагментами! Сгодится любая инфа:) | |
|
|
|
|
|
|
|
для: deman-b
(25.07.2007 в 20:52)
| |
<?php
/*======================================================================*\
|| #################################################################### ||
|| # PHP Class передачи POST запросов
|| #
|| #
|| # ---------------------------------------------------------------- # ||
|| # Avtor: First. ||
|| # ---------------------- Контактная информация ------------------- # ||
|| # E-mail: primary_send@mail.ru | # ||
|| # ICQ: 473-133-888 # ||
|| #################################################################### ||
\*======================================================================*/
# пример использования класса
# $http = new httprequest; // создаем класс
# $http->url = "http://www.mysite.ru/"; // url
# $http->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"; // user agent
# $http->cookies["SESSION"] = "abJXIJkDBfy5"; // coockie
# $http->cookies["ID"] = "255"; // coockie
# $http->vars["login"] = ""; // переменная Login
# $http->vars["pass"] = ""; // переменная pass
# //$http->proxy_host = "201.38.194.38"; // устанавливаем IP Proxy если нужно
# //$http->proxy_port = "6588"; // устанавливаем Port Proxy если нужно
# $http->server_connect(); // соединяемся с сервером
# $http->send_POST(); // передаем данные (POST)
# $page = $http->answer; // помещаем ответ сервера в переменную
# $http->server_connect_close(); // закрываем соединение
class httprequest
{
var $url = ""; // url адрес
var $agent = ""; // агент
var $referer = ""; // реферрер
var $cookies = array(); // куки
var $connection = "Keep-Alive"; // тип соеднинения
var $lang = "ru"; // язык
var $vars = array(); // переменные
var $error; // сообщение об ошибке
var $socket; // сокет
var $host = ""; // хост
var $port = 80; // порт
var $answer; // ответ сервера
var $length = 2500; // длина читаемых данных (можно менять)
var $proxy_host = ""; // прокси хост
var $proxy_port = ""; // прокси порт
function server_connect()
{
$url = parse_url($this->url);
$this->host = $url['host'];
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!empty($this->proxy_host) || !empty($this->proxy_port))
{
$host = $this->proxy_host;
$port = $this->proxy_port;
}
else
{
$host = $this->host;
$port = $this->port;
}
$result = socket_connect($this->socket, gethostbyname($host), $port);
if ($result < 0 || $result === false)
{
$this->error = "socket_connect() Произошла ошибка.\nПричина: ($result) " . socket_strerror(socket_last_error($this->socket));
socket_close($this->socket); //закрываем соединение
}
}
function server_connect_close()
{
socket_close($this->socket); //закрываем соединение
}
function create_packet()
{
$postdata = $this->get_vars(); //получаем переменные
$cookie = $this->get_coockie(); // получаем строку cookie
//формируем пакет
$headers = "POST ".$this->url." HTTP/1.0\r\n";
$headers .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-icq, application/x-shockwave-flash, */*\r\n";
$headers .= "Referer: ".$this->referer."\r\n";
$headers .= "Accept-Language: ".$this->lang."\r\n";
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
$headers .= "Proxy-Connection: ".$this->connection."\r\n";
$headers .= "User-Agent: ".$this->agent."\r\n";
$headers .= "Host: ".$this->host."\r\n";
$headers .= "Content-Length: ".strlen($postdata)."\r\n";
$headers .= "Pragma: no-cache\r\n";
$headers .= "Cookie: ".$cookie."\r\n\r\n";
$headers .= $postdata;
return $headers;
}
function send_POST()
{
$headers = $this->create_packet(); //формируем пакет
$result = socket_write($this->socket,$headers,strlen($headers)); //передаем данные на сервер
if($result < 0 || $result === false)
{
$this->error = "socket_connect() Произошла ошибка.\nПричина: ($result) " . socket_strerror(socket_last_error($this->socket));
}
$this->answer = socket_read($this->socket,$this->length); //читаем ответ сервера (25000)
}
function get_vars()
{
if (count($this->vars) > 0)
{
$postdata = "";
foreach ($this->vars as $key => $val)
{
$postdata .= urlencode($key)."=".urlencode($val)."&";
}
return $postdata;
}
}
function get_coockie()
{
if (count($this->cookies) > 0)
{
$cookie_string = '';
foreach ($this->cookies as $key => $val)
{
$cookie_string .= $key."=".urlencode($val)."; ";
}
return $cookie_string;
}
return false;
}
}
?>
|
Вот из своего проекта выдрал куски и сделал небольшой класс передачи POST запросов, посмотри может пригодиться. | |
|
|
|
|
|
|
|
для: testdriver
(28.07.2007 в 01:30)
| | Спасибо, обязательно сохраню, но.. на будущее, т.к. в ООП я пока чайнег :-( | |
|
|
|
|
|
|
|
для: amigo62
(28.07.2007 в 17:06)
| | На самом деле все очень просто :)
Сохраняеш этот класс в файл например с именем classhttp.php
а затем подключаеш его в свой скрипт примено вот так:
<?php
include("classhttp.php");// подключаем класс
$http = new httprequest; // создаем класс
$http->url = "http://www.mysite.ru/login.php"; // url
$http->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"; // user agent
$http->cookies["SESSION"] = "abJXIJkDBfy5"; // coockie
$http->cookies["ID"] = "255"; // coockie
$http->vars["login"] = "Test"; // переменная Login
$http->vars["pass"] = "12345"; // переменная pass
//$http->proxy_host = "201.38.194.38"; // IP Proxy если нужно
//$http->proxy_port = "6588"; // Port Proxy если нужно
$http->server_connect(); // соединяемся с сервером
$http->send_POST(); // передаем данные (POST)
$page = $http->answer; // ответ сервера
$http->server_connect_close(); // закрываем соединение
?>
|
И собственно все :) Хотя если не чувствуете в себе достаточной уверенности лучше пока и правда к ООП не переходить, нападает лень и самому уже не захочется не чего писать и не в чем разбираться :) А это плохо ... | |
|
|
|
|
|
|
|
для: testdriver
(28.07.2007 в 17:25)
| | Для этого как раз CURL надо применять, а не подобные классы. | |
|
|
|
|
|
|
|
для: Unkind
(28.07.2007 в 17:29)
| | testdriver, вроде все понятно- в смысле как юзать. А как устроено- разберусь обязательно, но позже, когда то же придется учится на ооп писать;)
Unkind, если не трудно, можно ссылки на темы по cURL? Читал справочник, но понял не все и не везде...
И- вопрос остался открытым- как формируются заголовки отправки файла и обращения через прокси? | |
|
|
|
|
|
|
|
для: amigo62
(28.07.2007 в 18:10)
| | Unkind, если не трудно, можно ссылки на темы по cURL? Читал справочник, но понял не все и не везде...
Темы не знаю. Для меня понятнее первоисточник.
как формируются заголовки отправки файла
http://phpclub.ru/detail/article/http_request
обращения через прокси
Вместо /path/ пишется http://host.com/path/; через заголовок Host передается host запрашиваемого ресурса через прокси. Остальное все точно так же. | |
|
|
|
|
|
|
|
для: Unkind
(28.07.2007 в 20:09)
| | тоесть "Host: 201.38.194.8 \r\n
POST http://requested_url/path/ HTTP/1.1 \r\n" верно? | |
|
|
|
|
|
|
|
для: amigo62
(29.07.2007 в 06:11)
| | если адрес прокси myproxy.com, его порт $myproxy_port, а адрес целевого сайта mysite.com, то обращение надо строить по схеме:
$h = fsockopen("myproxy.com", $myproxy_port, ..)
$URI = "http://mysite.com/path/file.php"
$req = "POST $URI HTTP/1.0
Host: mysite.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 35
var1=encodeddata1&var2=encodeddata2
";
|
| |
|
|
|
|
|
|
|
для: Trianon
(29.07.2007 в 12:28)
| | А дальше что? Куда ресурс $h девается? Куда вставить $proxy_login и $proxy_password?
P.S. прочитал статью по ссылке, но чем больше читаю, тем больше вопросов:) сделать бы отдельный форум- "Протоколы" | |
|
|
|
|
|
|
|
для: Trianon
(29.07.2007 в 12:28)
| | Сори, с $h понятно все :) | |
|
|
|