Что нового

Отправка капчи POST с multipart/form-data в GSA Captha Breaker

nhlstar

Новичок
Сообщения
8
Репутация
0
Шалом, бояре!
Имеется следующая проблема:
Для распознавания капчи использую прогу GSA Captcha Breaker, в него post-запросом нужно отправить содержимое капчи, обшарив форум пытаюсь сформировать запрос, но вместо результата скрипт выдает пустое значение.

HTML:
<html>
<head>
<title>GSA Captcha Breaker</title>
</head>
<body>
<h1>Upload a captcha to test</h1>
<form id="gsa_form" name="gsa_form" method="post" enctype="multipart/form-data" action="/gsa_test.gsa">Image
<input type="file" name="file" id="gsa_file" value="C:\Program Files (x86)\GSA Captcha Breaker\test.png">
<input type="hidden" name="source_url" value="">
<input type="hidden" name="captcha_platform" value="">
<input type="submit" name="action" id="gsa_button" value="Submit">
</form>
</body>
</html>
Заголовок отправляемого запроса (смотрел в IE)
Ключ Значение
Запрос POST /gsa_test.gsa HTTP/1.1
Accept text/html, application/xhtml+xml, */*
Referer 127.0.0.1/gsa_test.gsa
Accept-Language ru-RU
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Content-Type multipart/form-data; boundary=---------------------------7df17a1d5073e
Accept-Encoding gzip, deflate
Host 127.0.0.1
Content-Length 7266
Connection Keep-Alive
Cache-Control no-cache
Текст запроса (смотрел так же в IE после отправки в ручном режиме.
-----------------------------7df17a1d5073e
Content-Disposition: form-data; name="file"; filename="FILE.png"
Content-Type: image/png

<Данные двоичного файла не отображаются>
---------------------------7df17a1d5073e
Content-Disposition: form-data; name="source_url"


-----------------------------7df17a1d5073e
Content-Disposition: form-data; name="captcha_platform"


-----------------------------7df17a1d5073e
Content-Disposition: form-data; name="action"

Submit
-----------------------------7df17a1d5073e--

Код:
#include "WinHTTP.au3"

Local $File = @scriptdir & "\FILE.png"
Local $oFile = FileOpen($File,16) ;Содержимое картинки
Local $binFile = FileRead($oFile)

;Текст запроса
Local $boundary = '-----------------------------7df20a346035e'
Local $content = $boundary & @LF
$content &= 'Content-Disposition: form-data; name="file"; filename="FILE.png"' & @LF
$content &= 'Content-Type: image/png' & @LF
$content &= @LF
$content &= $binFile & @LF
$content &= $boundary & @LF
$content &= 'Content-Disposition: form-data; name="source_url"' & @LF & @LF & @LF
$content &= $boundary & @LF
$content &= 'Content-Disposition: form-data; name="captcha_platform"' & @LF & @LF & @LF
$content &= $boundary & '--'


;отправка капчи
Local $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
$oRequest.Open('POST', 'http://127.0.0.1/gsa_test.gsa', 0) ;Создаём соеденение
$oRequest.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*')
$oRequest.SetRequestHeader('Referer', 'http://127.0.0.1/gsa_test.gsa')
$oRequest.SetRequestHeader('Accept-Language', 'ru-RU')
$oRequest.SetRequestHeader('User-Agent', 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)')
$oRequest.SetRequestHeader('Content-Type', 'multipart/form-data; boundary=' & $boundary)
$oRequest.SetRequestHeader('Accept-Encoding', 'gzip, deflate')
$oRequest.SetRequestHeader('Host', '127.0.0.1')
$oRequest.SetRequestHeader('Content-Length', BinaryLen($binFile))
$oRequest.SetRequestHeader('Connection', 'Keep-Alive')
$oRequest.SetRequestHeader('Cache-Control', 'no-cache')
$oRequest.Send(StringToBinary($content, 1)) ; отправляем запрос
Local $sResp = $oRequest.ResponseText ; получаем ответ
MsgBox(32,'$sResp',$sResp) ;Возвращает пустое значение

Вроде бы воспроизвел все в точности, но сервер результат не возвращает :stars:
 
Автор
nhlstar

nhlstar

Новичок
Сообщения
8
Репутация
0
Дело в том что как раз на основание найденного на форуме кода и пытаюсь написать свой скрипт, но данные не отправляются. Моих знаний не хватает для определения проблемы. Вроде бы воспроизвел в точности текст и заголовки отправляемых данных, но ответ captcha breaker мне не возвращает. Передача данных происходит через multipart/form-data. Подозреваю что может быть проблема с моим способом передачи бинарного кода картинки, или я неверно пытаюсь отправить заголовки.
Может кто подсказать в чем может быть проблема?
 
Автор
nhlstar

nhlstar

Новичок
Сообщения
8
Репутация
0
Все же удалось одолеть передачу капчи в captcha breaker. Пишу для тех кто столкнется с подобной задачей, может чем помогу :smile:, ибо потратил времени на это дело я немало...

Как узнать заголовки и содержимое POST или GET запроса
Для того чтобы узнать требуемое содержимое отправляемого post запроса можно вручную отправить в браузере капчу, картинку, любые данные, передаваемые формой <form> (например: ввод логина и пароля осуществляется так же с помощью GET или POST запроса) на примере "осла" internet explorer:
открываем нужную страничку, жмем средства разработчика F12, открываем закладку сеть, клацаем кнопку начать сбор, далее вручную отправляем капчу|любые др. данные - после отправки в табличке появится запрос, кликаем на нем 2раза.

Полезные ссылки:
1. learn.javascript.ru/xhr-forms - об отправке post запросов.
2. Так же крайне полезным был видос (правда на немецком) youtube.com/watch?v=pvocMiW9N34 и youtube.com/watch?v=8W4EDP10CNc, нашел его на просторах нашего форума, дублирую ссылки в своем посте.

Код:
$binary = FileRead('file.png') ;Читаем содержимое капчи

$boundary =  '-----------------------------41081806617' ;задаем "разделитель" между полями данных, вообще его можно сгенерировать из случайных чисел

;Создаем переменную $postpacket - "тело" отправляемого запроса
$postpacket =  $boundary & @CRLF & _ ;вставляем разделитель boundary
			   'Content-Disposition: form-data; name="file"; filename="FILE.png"' & @CRLF & _
			   'Content-Type: image/png' & @CRLF & @CRLF & _
			   $binary & @CRLF & _
			   $boundary & '--' & @CRLF

$SendData = StringToBinary($postpacket,1) ; переводим в бинарный вид наш отправляемый пакет, файл капчи нужно передавать в бинарном виде, в таком случае и остальное тело $postpacket нужно привести в бинарный вид

;отправка капчи
Local $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
$oRequest.Open('POST', 'http://127.0.0.1/gsa_test.gsa', 0) ;Создаём соеденение
$oRequest.SetRequestHeader('Content-Type', 'multipart/form-data; boundary=' & $boundary) ;Передаем заголовок
$oRequest.SetRequestHeader('Content-Length', BinaryLen($binary)) ;Передаем длинну содержимого, вообще Content-Length можно не задавать, т.к. она определится автоматически, а в случае, если Content-Length будет указана неверно, выполнить передачу не удастся.
$oRequest.Send($SendData) ;отправляем запрос
Local $sResp = $oRequest.ResponseText ;получаем ответ
MsgBox(32,'$sResp',$sResp)


Так же отправку можно осуществить и через TCP, код в спойлере, его можно почистить от "шлака" - оставить только действительно необходимые для данного случая данные хедера и тела запроса.
Код:
$binary = FileRead('FILE.png')
$postpacket =  '-----------------------------41081806617' & @CRLF & _
			   'Content-Disposition: form-data; name="file"; filename="FILE.png"' & @CRLF & _
			   'Content-Type: image/png' & @CRLF & @CRLF & _
			   $binary & @CRLF & _
			   '-----------------------------41081806617' & @CRLF & _
			   'Content-Disposition: form-data; name="source_url"' & @CRLF & @CRLF & @CRLF & _
			   '-----------------------------41081806617' & @CRLF & _
			   'Content-Disposition: form-data; name="captcha_platform"' & @CRLF & @CRLF & @CRLF & _
			   '-----------------------------41081806617' & @CRLF & _
			   'Content-Disposition: form-data; name="action"' & @CRLF & @CRLF & _
			   'Submit' & @CRLF & _
			   '-----------------------------41081806617--' & @CRLF & @CRLF

$binPacket = StringToBinary($postpacket,1)
$postpacketLen = BinaryLen($binPacket)

$header = 	'POST /gsa_test.gsa HTTP/1.1' & @CRLF & _
			'Host: 127.0.0.1' & @CRLF & _
			'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0' & @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 & _
			'Content-Type: multipart/form-data; boundary=-----------------------------41081806617' & @CRLF & _
			'Accept-Encoding: gzip, deflate' & @CRLF & _
			'Referer: http://127.0.0.1/gsa_test.gsa' & @CRLF & _
			'Content-Length: ' & $postpacketLen & @CRLF & _
			'Cache-Control: no-cache' & @CRLF & _
			'Connection: keep-alive' & @CRLF & @CRLF & $postpacket


$SendData = StringToBinary($header,1)

TCPStartup()
$socket = TCPConnect('127.0.0.1',80)
TCPSend($socket,$SendData)
Do
   $ReciveData = TCPRecv($socket,1024)
Until $ReciveData <> ''
Do
   $ReciveData &= TCPRecv($socket,1024)
Until @error or StringInStr($ReciveData,'</html>')
MsgBox(32,'$ReciveData',$ReciveData)
TCPCloseSocket($socket)
TCPShutdown()
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Объясните для тех, кто не в теме, хотя бы в двух словах.
Так в чем же конкретно была проблема? Что исправлено?
Спасибо.
 
Автор
nhlstar

nhlstar

Новичок
Сообщения
8
Репутация
0
veretragna сказал(а):
Объясните для тех, кто не в теме, хотя бы в двух словах.
Так в чем же конкретно была проблема? Что исправлено?
Спасибо.
Проблема была в отправке неверного текста post - запроса:
1. Сам PNG капчи был читался через FileOpen() - FileRead()
Код:
Local $File = @scriptdir & "\FILE.png"
Local $oFile = FileOpen($File,16) ;Содержимое картинки
Local $binFile = FileRead($oFile)

с флагом 16, этого делать нелья, честно, не пока не разобрался почему... Можно использовать либо FileOpen() с флагами 0 или 16384, либо напрямую сразу читать через FileRead('file.png'). Вроде при FileOpen с флагом 16 файл должен быть прочитан как бинарные данные, но так скрипт не работал.
P.S. в тексте запроса нельзя мешать обычный текст и бинарный код, хотя как не странно это изначально было учтено через StringToBinary():
Код:
$oRequest.Send(StringToBinary($content, 1))

2. Так же разобрался с важным параметром Content-Length текста запроса - его либо считать через BinaryLen() для бинарного кода картинки, либо не отправлять вообще.

Вроде это основные моменты.
 
Верх