Что нового

[Сеть, интернет] Как отправить пакет с использованием прокси?

Gzzk

Новичок
Сообщения
104
Репутация
1
Здравствуйте.
Можно ли средствами AutoIt отправить пакет через прокси?
Если да,то как будет выглядеть,например,отправка такого пакета?
Код:
#include "Array.au3"
Func Check($id)
$sDomain = 'montytool.ru' ;домен или ip-адрес
$iPort = 80 ;порт
;Запрос, который будет отправлен серверу
$sRequest = 'GET /tasks/check?id='&$id&' HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'http://montytool.ru/tasks' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: PHPSESSID=80b526fdfc5215dba67b67667fecd8d1; _user_id=190405458; _user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5' & @CRLF & @CRLF
;ConsoleWrite($sRequest & @LF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось соединиться с сервером.')
    Exit 3
EndIf

TCPSend($iSocket, $sRequest) ;отправляем сообщение

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    Exit 4
EndIf

$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    $iError = @error
    If Not $sBuffer = '' Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

TCPCloseSocket($iSocket)
TCPShutdown()


EndFunc

Заранее благодарен за ответы.


Добавлено:
Сообщение автоматически объединено:

Ап...
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Ответьте кто-нибудь!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
TCPConnect($sIP, $iPort)
здесь укажи прокси сервер
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
То есть для проки 0.0.0.0:0 код будет выглядеть так:
Код:
$iSocket = TCPConnect("0.0.0.0",0)

?
У меня так не вышло,404-ая ошибка.
Ответ сервера:
Код:
HTTP/1.1 404 Not Found
Date: Sat, 06 Apr 2013 12:11:20 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 287
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /php.php was not found on this server.</p>
<hr>
<address>Apache/2.2.14 (Ubuntu) Server at server.ru Port 80</address>
</body></html>
Без прокси отравляется нормально.
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Код без использования прокси:
Код:
Func Redirectlot($sCookie,$sProxy)
$sDomain = 'olike.ru' ;домен или ip-адрес
$iPort = 80 ;порт
;Запрос, который будет отправлен серверу
$sRequest = 'GET /redirectlot.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'Referer: http://olike.ru/earn.php' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: '&$sCookie & @CRLF & @CRLF
;ConsoleWrite($sRequest & @LF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    Exit 3
EndIf

TCPSend($iSocket, $sRequest) ;отправляем сообщение

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    Exit 4
EndIf

$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    $iError = @error
    If Not $sBuffer = '' Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

TCPCloseSocket($iSocket)
TCPShutdown()
$a=StringRegExp($sData,'Location:\s(.+)',3)	
if StringInStr($sData,'заказов') Then
	ConsoleWrite("Нет заказов."&@CRLF)
EndIf
if Not StringInStr($sData,"заказов") AND Not StringInStr($sData,"vk") Then
	ConsoleWrite("Redirectlot:"&$sData&@CRLF)
EndIf

If Not IsArray($a) Then
return 0
Else
return $a[0]	
EndIf
EndFunc
Его бы переделать :smile:
 

sss

Продвинутый
Сообщения
332
Репутация
96
Нашел в закромах скрипт с таким функционалом (ибо сам через прокси сижу). Возможно, часть заголовков лишняя... Проверил на Яндексе - HTTP 200 OK

Код:
$proxy = "0.0.0.0" ; адрес прокси-сервера
$port = 0000 ; порт прокси-сервера

$domain = "www.yandex.ru" ; домен
$path = "/" ; URL страницы, без домена и с слешем в начале
$agent = "Sky-WaLkeR" ; User-Agent

$request = "GET " & $path & " HTTP/1.1" & @CRLF
$request &= "Host: " & $domain & "" & @CRLF
$request &= "User-Agent: " & $agent & "" & @CRLF
$request &= "Connection: close" & @CRLF
$request &= "Accept: application/xhtml+xml,html/text,application/xml;q=0.9" & @CRLF & @CRLF

TCPStartup()

$socket = TCPConnect($proxy, $port)
If $socket = -1 Then Exit

TCPSend($socket, $request)

While 1
	$recv = TCPRecv($socket, 2048)
	If $recv <> "" Then
		ConsoleWrite($recv)
		ExitLoop
	EndIf
WEnd

TCPShutdown()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Sky-WaLkeR,
У меня работает с прокси только если указать полный адрес
Код:
;...
$sRequest = "GET http://www.yandex.ru/ HTTP/1.1" & @CRLF
;...
 

sss

Продвинутый
Сообщения
332
Репутация
96
Странно, у меня и так и так работает... Может, зависит от прокси-сервера? У меня HandyCache крутится...
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
Вот так без прокси работает:
Код:
$sCookie="кука"
$sDomain = 'olike.ru' ;домен или ip-адрес
$iPort = 80 ;порт
;Запрос, который будет отправлен серверу
$sRequest = 'GET /redirectlot.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'Referer: http://olike.ru/earn.php' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: '&$sCookie & @CRLF & @CRLF
ConsoleWrite($sRequest & @LF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    Exit 3
EndIf

TCPSend($iSocket, $sRequest) ;отправляем сообщение

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    Exit 4
EndIf

$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    $iError = @error
    If Not $sBuffer = '' Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

TCPCloseSocket($iSocket)
TCPShutdown()
ConsoleWrite($sData)
А вот так и с прокси не работает:
Код:
#include <Array.au3>
Func Redirectlot($sCookie,$sProxy,$iPort)
$sDomain = "olike.ru" ; домен
$sRequest = "GET /redirectlot.php HTTP/1.1" & @CRLF
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31' & @CRLF
$sRequest &= 'Host: olike.ru' & @CRLF
$sRequest &= 'Referer: http://olike.ru/earn.php' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: '&$sCookie & @CRLF & @CRLF
ConsoleWrite($sRequest)
TCPStartup()
$socket = TCPConnect($sProxy, $iPort)
If $Socket = -1 Then Exit

TCPSend($Socket, $sRequest)

While 1
    $sData = TCPRecv($socket, 2048)
    If  $sData <> "" Then
        ConsoleWrite($sData)
        ExitLoop
    EndIf
WEnd
TCPShutdown()
ConsoleWrite($sData)
Заголовки одинаковые, однако на запрос без прокси мы получаем такой ответ:
Код:
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sun, 07 Apr 2013 14:39:55 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=15
X-Powered-By: PHP/5.3.14
Set-Cookie: PHPSESSID=9pe0tk6pcudaas4g1u1h6rao56; path=/
Set-Cookie: PHPSESSID=9pe0tk6pcudaas4g1u1h6rao56; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: http://vk.com/away.php?to=http%3A%2F%2Fvk.com%2Fwall171975670_905

0
А с прокси такой:
Код:
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sun, 07 Apr 2013 14:33:58 GMT
Content-Length: 0
Set-Cookie: cDRGN=3562632267; path=/
P3P: CP="CUR ADM OUR NOR STA NID", policyref="/w3c/p3p.xml"
Location: http://olike.ru/redirectlot.php?drgn=1
Что не так в коде?
 

sss

Продвинутый
Сообщения
332
Репутация
96
Насколько я понял, это какая-то хитрая защита (dragonara). В первом запросе она шлет куки и редиректит на другую страницу. И если куки установлены, то уже дает доступ до основной страницы.

Вот так вроде работает.
Код:
; шлем запрос, дергаем куки, шлем запрос с кукой, получаем ответ
$proxy = "0.0.0.0"
$port = 0000

$domain = "olike.ru" ; домен
$path = "/redirectlot.php" ; URL страницы, без домена и с слешем в начале
$agent = "Sky-WaLkeR" ; User-Agent

$request = "GET " & $path & " HTTP/1.1" & @CRLF
$request &= "Host: " & $domain & @CRLF
$request &= "User-Agent: " & $agent & "" & @CRLF
$request &= "Connection: close" & @CRLF
$request &= "Accept: application/xhtml+xml,html/text,application/xml;q=0.9" & @CRLF & @CRLF

TCPStartup()
$socket = TCPConnect($proxy, $port)
If $socket = -1 Then Exit

TCPSend($socket, $request)
While 1
	$recv = TCPRecv($socket, 2048)
	If $recv <> "" Then
		$cookie = StringRegExp($recv, "Set-Cookie: (.*?)\r\n", 3) ; ловим куку
		ExitLoop
	EndIf
WEnd

TCPCloseSocket($socket) ; не получается если завоно не подкючится - бесконечный цикл...
$socket = TCPConnect($proxy, $port)
If $socket = -1 Then Exit

$request = "GET " & $path & " HTTP/1.1" & @CRLF
$request &= "Host: " & $domain & "" & @CRLF
$request &= "User-Agent: " & $agent & "" & @CRLF
$request &= "Connection: close" & @CRLF
$request &= "Cookie: " & $cookie[0] & @CRLF ; ставим куку
$request &= "Accept: application/xhtml+xml,html/text,application/xml;q=0.9" & @CRLF & @CRLF

TCPSend($socket, $request)
While 1
	$recv = TCPRecv($socket, 2048)
	If $recv <> "" Then
		ConsoleWrite($recv)
		ExitLoop
	EndIf
WEnd

TCPShutdown()


Код:
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 07 Apr 2013 20:12:03 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Keep-Alive: timeout=15
X-Powered-By: PHP/5.3.14
Set-Cookie: PHPSESSID=(много_символов); path=/
Set-Cookie: PHPSESSID=(много_символов,_но_других); path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Close

86
 <center><h2>К сожалению, Вас долго не было на сайте.
<a href="http://olike.ru">Придется заново войти с главной страницы.</a></h2> 
0
 
Верх