Здравствуйте! Столкнулся с проблемой при отправке POST запроса на создание темы с прикрепленным торрент файлом.
Выше представленный запрос был перехвачен снифером.
Часть запроса которая нас интересует:
Интересует несколько вопросов:
[list type=decimal]
[*]Как правильно записать данные торрент файла(или любого другого, например файла .EXE) в переменную. (Пытался записать с помощью функции FileRead() но по не известным мне причинам данные полностью не записываются)
[*]В каком виде хранить данные. (пытался представить их в Hex виде, но насколько я понял такое кол-во данных не помещается в переменную)
[/list]
Интересуют способы отправки запросов POST содержащих "прикрепленные" файлы, предпочтительно используя стандартные функции или WinHTTP 1.6.1.7.
Приветствуются абсолютно любые идеи по данному вопросу, и коментарии по улучшению/оптимизации ниже представленого кода.
Наработки, используя которые я столкнулся с вышеописанной проблемой
Код:
POST /forum/posting.php HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.63
Host: post.rutracker.org
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Expect: 100-continue
Referer: http://post.rutracker.org/forum/posting.php?mode=newtopic&f=7
Cookie: spylog_test=1; bb_data=x-xxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxx-x
Cookie2: $Version=1
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers
Content-Length: 20334
Content-Type: multipart/form-data; boundary=----------THF4runExoL0k3GYlhACMk
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="mode"
newtopic
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="f"
7
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="t"
0
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="p"
0
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="tor_required"
1
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="subject"
(Название темы)
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="fontFace"
-1
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="codeColor"
black
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="codeSize"
12
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="align"
-1
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="codeUrl2"
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="message"
(Текст темы)
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="MAX_FILE_SIZE"
256000
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="attach"; filename="Отправляемый торрент файл.torrent"
Content-Type: application/x-bittorrent
( Сдесь распологаются данные торрента примерно в таком виде:
/©Ns’ЦґєHаБй{л‚ъ.h(ГF©ПLћ/г%Ч©ы®KZ~Э{щu#U”оФ§TьХб†Љ»YСЇzщz )
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="preview"
Предв. просмотр
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="form_token"
06dbd3e4adffcb1a567183b944ca8a51
------------THF4runExoL0k3GYlhACMk--
Часть запроса которая нас интересует:
Код:
------------THF4runExoL0k3GYlhACMk
Content-Disposition: form-data; name="attach"; filename="Отправляемый торрент файл.torrent"
Content-Type: application/x-bittorrent
( Здесь распологаются данные торрента примерно в таком виде:
/©Ns’ЦґєHаБй{л‚ъ.h(ГF©ПLћ/г%Ч©ы®KZ~Э{щu#U”оФ§TьХб†Љ»YСЇzщz )
Интересует несколько вопросов:
[list type=decimal]
[*]Как правильно записать данные торрент файла(или любого другого, например файла .EXE) в переменную. (Пытался записать с помощью функции FileRead() но по не известным мне причинам данные полностью не записываются)
[*]В каком виде хранить данные. (пытался представить их в Hex виде, но насколько я понял такое кол-во данных не помещается в переменную)
[/list]
Интересуют способы отправки запросов POST содержащих "прикрепленные" файлы, предпочтительно используя стандартные функции или WinHTTP 1.6.1.7.
Приветствуются абсолютно любые идеи по данному вопросу, и коментарии по улучшению/оптимизации ниже представленого кода.
Наработки, используя которые я столкнулся с вышеописанной проблемой
Код:
#Include <String.au3>
$filename = 'ТоррентФайл.torrent'
$filedata = ''
Global $Boundary = sBoudary('------------')
Dim $sTmpHost[3] = ['login.rutracker.org','rutracker.org','post.rutracker.org']
Dim $sTmpPage[3] = ['forum/login.php','forum/index.php','forum/posting.php']
Dim $sTmpPost[3] = ['login_username=jopiksz&login_password=123456&login=%C2%F5%EE%E4','', $Boundary & @CRLF & _
'Content-Disposition: form-data; name="mode"' & @CRLF & _
@CRLF & _
'newtopic' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="f"' & @CRLF & _
@CRLF & _
'7' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="t"' & @CRLF & _
@CRLF & _
'0' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="p"' & @CRLF & _
@CRLF & _
'0' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="tor_required"' & @CRLF & _
@CRLF & _
'1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="subject"' & @CRLF & _
@CRLF & _
'Theme Name' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="fontFace"' & @CRLF & _
@CRLF & _
'-1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeColor"' & @CRLF & _
@CRLF & _
'black' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeSize"' & @CRLF & _
@CRLF & _
'12' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="align"' & @CRLF & _
@CRLF & _
'-1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeUrl2"' & @CRLF & _
@CRLF & _
@CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="message"' & @CRLF & _
@CRLF & _
'Theme Message' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="MAX_FILE_SIZE"' & @CRLF & _
@CRLF & _
'256000' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="attach"; filename="' & $filename & '"' & @CRLF & _
'Content-Type: application/x-bittorrent' & @CRLF & _
@CRLF & _
$filedata & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="preview"' & @CRLF & _
@CRLF & _
'Предв. просмотр' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="form_token"' & @CRLF & _
@CRLF & _
'06dbd3e4adffcb1a567183b944ca8a51' & @CRLF & _
$Boundary & '--' & @CRLF & @CRLF]
Dim $sTmpConnectType[3] = ['application/x-www-form-urlencoded','','multipart/form-data; boundary=' & $Boundary]
Dim $sTmpReferer = ''
Dim $sTmpCookies = ''
$i = 0
$a = 3
Do
$sTmpRecv = TCPRequest($sTmpHost[$i], $sTmpPage[$i], $sTmpPost[$i], $sTmpConnectType[$i], $sTmpReferer, $sTmpCookies)
If $sTmpCookies = '' Then
$sTmpCookies = GetCookies($sTmpRecv)
EndIf
$i = $i + 1
MsgBox(0,'',$sTmpRecv)
Until $i = $a
Exit
Func GetCookies($sTmpRecv)
Local $sCookies = '', $aCookies, $i
$aCookies = _StringBetween($sTmpRecv, 'Set-Cookie: ',';',1)
For $i = 0 To UBound($aCookies)-1
$sCookies &= $aCookies[$i]&';'
Next
Return $sCookies
EndFunc
Func TCPRequest($sHost = '', $sPage = '', $sPost = '', $sConnectType = '', $sReferer = '', $sCookies = '', $iMaxTime = 10000)
Local $sPacket, $iSocket, $iTimer
If $sPost = '' Then
$sPacket = 'GET /' & $sPage & ' HTTP/1.1' & @CRLF
Else
$sPacket = 'POST /' & $sPage & ' HTTP/1.1' & @CRLF
EndIf
$sPacket &= 'Host: ' & $sHost & @CRLF & _
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12' & @CRLF & _
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF & _
'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF & _
'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7' & @CRLF & _
'Keep-Alive: 115' & @CRLF & _
'Connection: keep-alive' & @CRLF
If $sReferer <> '' Then
$sPacket &= 'Referer: ' & $sReferer & @CRLF
EndIf
If $sPost <> '' Then
$sPacket &= 'Content-Type: ' & $sConnectType & @CRLF
EndIf
If $sCookies <> '' Then
$sPacket &= 'Cookie: ' & $sCookies & @CRLF
EndIf
If $sPost <> '' Then
$sPacket &= 'Content-Length: ' & StringLen($sPost) & @CRLF
EndIf
$sPacket &= @CRLF
if $sPost <> '' Then
$sPacket &= $sPost
EndIf
ConsoleWrite($sPacket)
MsgBox(0,'',$sPacket)
TCPStartup()
Local $sIp = TCPNameToIP($sHost)
If @error Then Return SetError(1,0,"")
$iSocket = TCPConnect($sIp, 80)
If @error Then Return SetError(2,0,"")
TCPSend($iSocket, $sPacket)
If @error Then Return SetError(3,0,"")
$iTimer = TimerInit()
Do
$sRecv = TCPRecv($iSocket, 1024)
If TimerDiff($iTimer) > $iMaxTime Then Return SetError(4,0,"")
Until $sRecv <> ""
Do
$sRecv &= TCPRecv($iSocket, 1024)
If TimerDiff($iTimer) > $iMaxTime Then ExitLoop
Until @error Or StringInStr($sRecv, '</html>')
TCPCloseSocket($iSocket)
TCPShutdown()
Return $sRecv
EndFunc
Func sBoudary($sOut)
Local $i = 0
Local $a = 0
Do
$a = Random(1,3,1)
Select
Case $a = 1
$sOut &= Chr(Random(Asc("a"), Asc("z"), 1))
Case $a = 2
$sOut &= Chr(Random(Asc("A"), Asc("Z"), 1))
Case $a = 3
$sOut &= Random(0, 9, 1)
EndSelect
$i = $i + 1
Until $i = 22
Return $sOut
EndFunc
Код:
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include "WinHttp.au3"
Opt("MustDeclareVars", 1)
Global $filename = 'ТоррентФайл.torrent'
Global $filedata = ''
Global $Boundary = sBoudary('------------')
Func sBoudary($sOut)
Local $i = 0
Local $a = 0
Do
$a = Random(1,3,1)
Select
Case $a = 1
$sOut &= Chr(Random(Asc("a"), Asc("z"), 1))
Case $a = 2
$sOut &= Chr(Random(Asc("A"), Asc("Z"), 1))
Case $a = 3
$sOut &= Random(0, 9, 1)
EndSelect
$i = $i + 1
Until $i = 22
Return $sOut
EndFunc
Global $PostData = $Boundary & @CRLF & _
'Content-Disposition: form-data; name="mode"' & @CRLF & _
@CRLF & _
'newtopic' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="f"' & @CRLF & _
@CRLF & _
'7' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="t"' & @CRLF & _
@CRLF & _
'0' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="p"' & @CRLF & _
@CRLF & _
'0' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="tor_required"' & @CRLF & _
@CRLF & _
'1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="subject"' & @CRLF & _
@CRLF & _
'Theme Name' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="fontFace"' & @CRLF & _
@CRLF & _
'-1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeColor"' & @CRLF & _
@CRLF & _
'black' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeSize"' & @CRLF & _
@CRLF & _
'12' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="align"' & @CRLF & _
@CRLF & _
'-1' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="codeUrl2"' & @CRLF & _
@CRLF & _
@CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="message"' & @CRLF & _
@CRLF & _
'Theme Message' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="MAX_FILE_SIZE"' & @CRLF & _
@CRLF & _
'256000' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="attach"; filename="' & $filename & '"' & @CRLF & _
'Content-Type: application/x-bittorrent' & @CRLF & _
@CRLF & _
$filedata & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="preview"' & @CRLF & _
@CRLF & _
'Предв. просмотр' & @CRLF & _
$Boundary & @CRLF & _
'Content-Disposition: form-data; name="form_token"' & @CRLF & _
@CRLF & _
'06dbd3e4adffcb1a567183b944ca8a51' & @CRLF & _
$Boundary & '--' & @CRLF & @CRLF
Global $hOpen = _WinHttpOpen("Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.63")
If @error Then
MsgBox(48, "Error", "Error initializing the usage of WinHTTP functions.")
Exit 1
EndIf
; Get connection handle
Global $hConnect = _WinHttpConnect($hOpen, 'login.rutracker.org')
If @error Then
MsgBox(48, "Error", "Error specifying the initial target server of an HTTP request.")
_WinHttpCloseHandle($hOpen)
Exit 2
EndIf
; Make a request
Global $hRequest = _WinHttpOpenRequest($hConnect, "POST", 'forum/login.php')
If @error Then
MsgBox(48, "Error", "Error creating an HTTP request handle.")
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Exit 3
EndIf
; Send it. Specify additional data to send too.
_WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded", 'login_username=jopiksz&login_password=123456&login=%C2%F5%EE%E4')
If @error Then
MsgBox(48, "Error", "Error sending specified request.")
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Exit 4
EndIf
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
$hConnect = _WinHttpConnect($hOpen, 'post.rutracker.org')
If @error Then
MsgBox(48, "Error", "Error specifying the initial target server of an HTTP request.")
_WinHttpCloseHandle($hOpen)
Exit 2
EndIf
$hRequest = _WinHttpOpenRequest($hConnect, "POST", 'forum/posting.php')
If @error Then
MsgBox(48, "Error", "Error creating an HTTP request handle.")
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Exit 3
EndIf
_WinHttpSendRequest($hRequest, 'Content-Type: multipart/form-data; boundary=' & $Boundary, $PostData)
If @error Then
MsgBox(48, "Error", "Error sending specified request.")
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Exit 4
EndIf
_WinHttpReceiveResponse($hRequest)
Global $sHeader
If _WinHttpQueryDataAvailable($hRequest) Then $sHeader = _WinHttpQueryHeaders($hRequest) ; ...get full header
; See if there is data to read
Global $sChunk, $sData
If _WinHttpQueryDataAvailable($hRequest) Then
; Read
While 1
$sChunk = _WinHttpReadData($hRequest)
If @error Then ExitLoop
$sData &= $sChunk
WEnd
ConsoleWrite($sData & @CRLF) ; print to console
Else
MsgBox(48, "Error", "Site is experiencing problems.")
EndIf
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
MsgBox(0, "Header", $sHeader)