Евгений С.
17 сообщений
#14 лет назад
Народ, может подскажет кто...
Тут проблемка возникла.... За всю свою жизнь как-то со сокетами совсем косвенно работал,
а тут возникла задача передать простенький запрос определенному домену, через проксю.

Т.е. получается "my.domain.ru:port" нужно отправить "GET 1.0 значение"

Подключиться к проксе не сложно, делаю вот так, но в данном
примере я просто получаю ответ от "my.domain.ru:port", а как
ему передать этот запрос? Как только уже не пробовал


$http_request = "GET HTTP/1.0\r\n";
$http_request .= "HOST: domain.ru\r\n\r\n";

$fp = fsockopen($proxyhost, $proxyport);
if($fp){
fwrite($fp,$http_request);
while(!feof($fp)){
$http_response .= fgets($fp, 128);
}
}


При попытках подобных, приведенной ниже выдает ошибку....

$http_request = "GET 1.0 значение\r\n";
$http_request .= "HOST: my.domain.ru\r\n\r\n";


и т.п...
Николай Г.
601 сообщение
#14 лет назад
Почитайте в википедии про GET запрос, можете еще и про POST почитать.
GET запрос - это то, что находится в строке урла после ?.
То есть вы как бы запрашиваете страницу
Не забудьте в ответной странице передать статус сообщения(все ли ок).
Евгений С.
17 сообщений
#14 лет назад
Я знаю, что такое GET и POST.
Прочтите внимательно, что я написал! Нужно передать запрос нужному хосту на порт через прокси...
А также посмотрите формат запроса, который нужно передать...

запрос типа

не работает!
Себастьян Ф.
584 сообщения
#14 лет назад
RTFM:

Sherif Gayed
30-Jan-2003 06:00
Here is how to connect to the web from behind a proxy server:

<?php
/*************start code**************/
/*your proxy server address*/
$proxy = "192.168.10.1";
/*your proxy server port*/
$port = 8080;
/*the url you want to connect to*/
$url = "http://www.php.net/";
$fp = fsockopen($proxy, $port);
fputs($fp, "GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n");
while(!feof($fp)){
$line = fgets($fp, 4000);
print($line);
}
fclose($fp);
/**************end code**************/
?>
Вадим Т.
3240 сообщений
#14 лет назад
Цитата ("dervinar"):
Почитайте в википедии про GET запрос, можете еще и про POST почитать.

Прошу прощения, но в данном случае нужно читать не Википедию, а спецификацию протокола HTTP, и читать нужно каждому, перед тем как давать такие советы...
Пожалуйста обратите внимание на пункт 5.1.2 Request-URI.

Цитата:

The absoluteURI form is REQUIRED when the request is being made to a proxy. The proxy is requested to forward the request or service it from a valid cache, and return the response. Note that the proxy MAY forward the request on to another proxy or directly to the server specified by the absoluteURI. In order to avoid request loops, a proxy MUST be able to recognize all of its server names, including any aliases, local variations, and the numeric IP address. An example Request-Line would be:

GET HTTP/1.1
Вадим Т.
3240 сообщений
#14 лет назад
Цитата ("dervinar"):
GET запрос - это то, что находится в строке урла после ?.

Можете ли сказать, где Вы прочитали такое, в Википедии, или еще где?
Если Вы ссылались на статью то там написано следующее:

Цитата:
Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»:
GET /path/resource?param1=value1&param2=value2 HTTP/1.1

Из этого примера (не говоря уже о спецификации!) видно, что путь, находящийся перед "?", тоже передается в GET.
Теперь видите разницу с тем, что Вы написали?
Пожалуйста без обид, но старайтесь проверять то, что пишите, ведь форум читают новички, и неверная информация от специалистов может вводить их в заблуждение.
Николай Г.
601 сообщение
#14 лет назад
Разумеется без обид - спасибо что поправили, неправильно выразился. Действительно, путь, а в некоторых случаях и доменный адрес тоже имеются в строке GET запроса. Сработал стереотип, что под запросом обычно подразумевается только набор параметров, передаваемых непосредственно в исполняемый файл веб-сайта (в стандартном окружении переменных, проставляемом HTTP серверами переменная QUERY_STRING), хотя стереотип этот категорически неверен. Мне стыдно и нет мне прощения.
Поэтому новички - читайте меня внимательно, я некомпетентен и ленив. Впрочем, обратиться к первоисточникам это всегда небесполезно будет, неважно, кто дает ответ.

По теме, weblands, получилось?
Евгений С.
17 сообщений
#14 лет назад
А что должно было получиться?
Сразу уточню. Это просто доработка к проекту (за доработку я деньги не беру, потому создал тему,
просто уже блин за живое взяло... неужто я такой дебил, что не могу решить.....).
Был проект по чекеру доменов в зоне .lt (литва) .
Чекер сделал, отдал клиенту. Потом сделал авторегистратор доменов, все работает. Но возникла проблемка,
что сервер (возможно считает за ddos-атаку) после часа проверок блокирует ip с которого идут
запросы. Хотя по их спецификации нет ограничений...
Вот и возникла потребность попробовать сделать передачу запроса через прокси!
По их документации нужно отправить запорос на "das.domreg.lt" порт 4343.

"GET 1.0 название_домена\r\n"

Без прокси все работает. Подключаюсь сокетом, отправляю, получаю ответ.
А с проки - болт полный.... Уже незнаю, что и думать... Может просто прокси не работает
с нужным портом? Попробовать что ль взять платную.... Не знаю уже что и думать....
Если вы имели в виду запрос типа "http://das.domreg.lt:4343/?название" - не катит...
Можете сами попробовать....

Да и смущает сам формат запроса....
Когда я подключаюсь на прямую к их домену, то так и передаю строку запроса.
"GET 1.0 название_домена\r\n" , а через проксю? что-то типа "GET HTTP/1.0\r\n"
или "GET HTTP/1.0\r\n"; или еще что-то в таком направлении не катит.
Или действительно просто прокси гонят, или я чего-то не догоняю....
Евгений С.
17 сообщений
#14 лет назад
Народ, не нужно давать ссылки или вырезки кусков кода с каких-то источников!
Я не маленький, гуглом пользоваться умею! И читать умею еще... Возникла проблема.
Если есть конкретные предложения - тогда пишите, а сообщения типа посмотри документацию там,
посмотри спецификацию здесь я и поиском найду...
Евгений С.
17 сообщений
#14 лет назад
И еще уточнение по поводу приведенного примера. В самом первом сообщении приведен пример получения страницы через прокю.
То же самое фактически, что дал "SField" только вот не работает! Просто страницу получает, а вот то что нужно нет!
Николай Г.
601 сообщение
#14 лет назад
Не-а.
Различие есть и существенное. По тому, что выложил SField, должно получиться что-то вроде

$http_request = "GET HTTP/1.0\r\n";
$http_request .= "HOST: $proxyhost\r\n\r\n";

$fp = fsockopen($proxyhost, $proxyport);
if($fp){
fwrite($fp,$http_request);
while(!feof($fp)){
$http_response .= fgets($fp, 128);
}
}

тоесть в хосте вместо требуемого домена нужно писать хост прокси.
Евгений С.
17 сообщений
#14 лет назад
dervinar,
не работает. Если не указал это, то пробовал и так!
Пробовал запрос на свой скрипт, который тупо выдает printr($HTTP_SERVER_VARS);
(printr - это моя функция, такой в php нет стандартной а то ща заклюете, что не так написал )
Запрос идет через проксю даже без указания в "HOST: адрес_прокси".
Николай Г.
601 сообщение
#14 лет назад
Скиньте адрес прокси, которой пользуетесь - попробую проверить...
Евгений С.
17 сообщений
#14 лет назад
Да их десятки....
последнее, что было

72.254.128.202:80
93.152.136.96:808
217.77.209.30:3128
72.254.128.201:80
93.91.200.146:8080
210.212.123.10:8080
12.49.70.150:3128
213.42.178.199:80
209.97.203.60:8080
69.10.130.206:8080
69.10.130.205:8080
209.97.203.64:8080
69.10.130.204:8080
164.78.252.24:80
222.77.14.55:80
201.20.18.165:3128
58.215.78.157:808
41.208.14.4:80
210.187.51.43:80
Себастьян Ф.
584 сообщения
#14 лет назад
Цитата ("weblands"):
попробовать что ль взять платную


Зачем? Поставьте себе прокси сервер, например: и тестируйте бесплатно
Вадим Т.
3240 сообщений
#14 лет назад
weblands,

1. Попробуйте сделать через CURL. Если не будет работать, значит проблема в самом прокси или сайте, к которому обращаетесь. Если будет, тогда уже делаете решение через сокет (если CURL не устраивает), учитывая заколовки, которые отсылает курл.
2. Проверьте, возможно данная прокси требует аутентификации, и нужно передавать логин и пароль?
3. Проверьте, может быть нужно устанавливать юзерагент или еще какие-либо HTTP заголовки, может быть сайт не принимает запросы без них?
4. Работа с прокси и сайтом идет через HTTP, или может быть через HTTPS?

Конечно, в идеале было бы знать, что там за прокси, и что за сайт, и самому локально попробовать...
Так как вслепую, не зная деталей, помочь Вам шансов мало (минимальный код для работы с прокси Вам привели, да Вы и сами наверняка находили, но скорее всего именно в Вашем случае этого недостаточно, или, возможно, где-то ошибка вне этого кода).

На самом деле, того кода, что Вы написали, в любом случае недостаточно для качественного решения, даже если бы этот код и работал. Где задание таймаутов? Где ограничение размера закачки? Где проверка ошибок? Да и HTTP заголовков передается маловато. Но это детали уже.
Себастьян Ф.
584 сообщения
#14 лет назад
Freeproxy из ссылки выше +

<?php
$proxy ='192.168.0.100:8080';
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, $proxy);
curl_setopt($ch, CURLOPT_URL, 'das.domreg.lt:4343');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"get 1.0 testreg.lt\n");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ( $result = curl_exec ($ch) ) echo $result.'<hr />';
else echo curl_error($ch).'<hr />';
print_r(curl_getinfo($ch));
curl_close($ch);
?>


работает.
Евгений С.
17 сообщений
#14 лет назад
В данный момент у вас работает?
Дайте свой скайп или асю. С тем номером проки не работает....
Если выдает что-то типа "не верный синтаксис запроса" то это и у меня есть...
Виктор С.
94 сообщения
#14 лет назад
Рабочий код

$proxy_hostname="72.254.128.202";
$proxy_port="80";

$host="www.mail.ru";
$query="http://".$host.":80";


$send = "GET $query HTTP/1.0\r\n";
$send .= "Host: $host\r\n";
$send .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.5.7\r\n";
$send .= "Pragma: no-cache\r\n";
$send .= "Connection: Close\r\n\r\n";


@$fp = @fsockopen($proxy_hostname, $proxy_port, $errno, $errstr, 30);

if(!$fp){echo $errno .": ". $errstr."<hr>";}
else
{
@fwrite($fp, $send);

while (!feof($fp))
{
@$content.=fgets($fp, 4096);
}

}

@fclose($fp);


print $content;
Себастьян Ф.
584 сообщения
#14 лет назад
Цитата ("weblands"):
В данный момент у вас работает?
Дайте свой скайп или асю. С тем номером проки не работает....
Если выдает что-то типа "не верный синтаксис запроса" то это и у меня есть...


Да, работает и дает такой результат работы..

% .lt registry DAS service
Domain: testreg.lt
Status: available

Array
(
http:// =>
=>
=> 0
=> 0
=> 168
=> -1
=> 0
=> 0
=> 0.437
=> 0
=> 0.015
=> 0.109
=> 0
=> 37
=> 84
=> 0
=> -1
=> -1
=> 0.171
=> 0
=> get 1.0 testreg.lt
/ HTTP/1.1
Host: das.domreg.lt:4343
Accept: */*
)


Как я понимаю это то, что нужно.. Через прокси из паблика, вряд ли будет работать, т.к. они в большинстве своем не поддерживают, метод CONNECT для создания тунеля на другие порты..

Создайте проект, не мучайтесь. Либо сделайте чекер через обычную отправку формы , с обычным использование прокси..