Что нового

Разработка UDF для работы с anticaptcha сервисами

El Panda

Продвинутый
Сообщения
101
Репутация
59
Начал разработку UDF для работы с anticaptcha сервисами...
Для "общения" с сервисом использую WinHttp.WinHttpRequest
Как известно подобные сервисы ловят данные через multipart/form-data:

Что такое кодировка multipart/form-data?
Как вы знаете, в обычном POST-запросе все параметры передаются в одной строке ( param1=value1&param2=value2& ... итд.). Наряду с этим существует еще один способ, повсеместно используемый для отправки файла через веб-форму. Данные здесь уже не кодируются в urlencode а отправляются как есть, разграниченные специальными разделителями, которые вы сами генерируете и указываете в заголовке (официальная спецификация RFC1867). Вот пример, как выглядел бы ваш запрос отсылки капчи:

Код:
POST http://anti-captcha.com/in.php HTTP/1.0 
Content-Type: multipart/form-data; boundary=*BBBBBB* 
Host: anti-captcha.com 
Content-Length: *XXXXXX* 
--*BBBBBB* 
Content-Disposition: form-data; name="method" 

post 
--*BBBBBB* 
Content-Disposition: form-data; name="key" 
41f4d6c342bcad57b6260e64f6a50619
 --*BBBBBB* 
Content-Disposition: form-data; name="file"; filename="capcha.jpg" 
Content-Type: image/pjpeg 

*CCCCCC* --*BBBBBB*--


Где:
*BBBBBB* - разделитель, который должен быть достаточно уникальным (чтобы не повториться случайно в других данных).

Пример: -------------b358fdj4ha19fdk

Обратите внимание на то, как в примере разделитель используется с 2мя дефисами спереди каждый раз перед указыванием нового параметра и с 2мя дефисами спереди и в конце запроса.

*CCCCCC* - содержимое ФАЙЛА капчи, БЕЗ какого либо кодирования, целиком.

*XXXXXX* - длина содержимого POST-запроса в байтах, начиная от первого разделителя --*BBBBBB* до последнего --*BBBBBB*-- ВКЛЮЧАЯ ОБА. Т.е. предварительно нужно собрать содержимое запроса в памяти, посчитать его длину и уже потом формировать окончательный запрос.


PS. Соответственно если вы шлете не JPG а, скажем, GIF, то Content-Type должен быть не image/pjpeg, а image/gif. То же самое для формата PNG - image/png

И всё бы хорошо но никак не могу передать картинку, а именно
*CCCCCC* - содержимое ФАЙЛА капчи, БЕЗ какого либо кодирования, целиком

Пробовал как просто FileRead, так и _Base64Encode.
Принимает все параметры кроме самой картинки :(

У сообщества есть соображения?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
El Panda [?]
Пробовал как просто FileRead
А если прочитать в бинарном режиме?

P.S
Если решить эту задачу, то станет возможным и заливка файлов на разные сервисы...

Можно пример того что уже используется? Поэксперементирую :smile:
 
Автор
E

El Panda

Продвинутый
Сообщения
101
Репутация
59
А если прочитать в бинарном режиме?
Вроде пробовал, не получилось.

Вот примерный кусок отправки данных через multipart/form-data
Код:
Local $post_data
$boundary="dFksdmDjfWfjsnDf"

$post_data &= "--" & $boundary & @CRLF
$post_data &= "Content-Disposition: form-data; name=""method"""&@CRLF&@CRLF
$post_data &= "post"&@CRLF
$post_data &= "Content-Disposition: form-data; name=""key"""&@CRLF&@CRLF
$post_data &= IniRead($INI,"main","ac_key","")&@CRLF
$post_data &= "Content-Disposition: form-data; name=""file""; filename=""capcha.jpg"""&@CRLF
$post_data &= "Content-Type: image/pjpeg"&@CRLF&@CRLF
$post_data &= FileRead(@ScriptDir&"\captcha.jpg")&@CRLF
$post_data &= "--" & $boundary & "--" & @CRLF
$oHTTP.Open("POST", $SERVER_AC&"intest.php")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary="&$boundary&@CRLF)
$oHTTP.SetRequestHeader("Accept-Language", "ru")
$oHTTP.SetRequestHeader("Referer",$SERVER&"index.php")
$oHTTP.SetRequestHeader("User-Agent", $USER_AGENT)
$host = StringReplace($SERVER_AC,"http://","")
$host = StringSplit($host,"/")
$oHTTP.SetRequestHeader("Host",$host[1])
$oHTTP.SetRequestHeader("Content-Length", StringLen($post_data))
$oHTTP.Send($post_data)
$oHTTP.WaitForResponse
If @error Then
    Return 0
EndIf
$resp  = $oHTTP.Responsetext


Поэкспериментировать можно с любой аналогичной формой
 

timsky

Осваивающий
Сообщения
93
Репутация
28
El Panda
Ну как успехи? Разобрался?
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Средствами AutoIT решить данный вопрос не смог, написал библиотерку на delphi и использовал ее, если интересен данный вариант могу выложить библиотеку с описанием использования
 
Автор
E

El Panda

Продвинутый
Сообщения
101
Репутация
59
uninstall сказал(а):
Средствами AutoIT решить данный вопрос не смог, написал библиотерку на delphi и использовал ее, если интересен данный вариант могу выложить библиотеку с описанием использования

Очень интересно ;)
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Как и обещал выкладываю модуль UploadForm на Delphi 7 для заливки картинок на anticapcha сайты и функцию SendCapcha для использования модуля.
Модуль скомпилирован в формате dll, имеется исходный код - dpr файл.
Функция находиться в файле au3.

P/S. Для корректной работы модуля меняете в функции SendCapcha сайт сервиса распознавания и $capcha_key на свои
 

timsky

Осваивающий
Сообщения
93
Репутация
28
За ДЛЛ мега респект!

Но все же странно, в чем проблема-то. :blink:
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Проблема в функциях AutoIT, точнее в их отсутствии - нет функции оправляющей запрос методом post
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
uninstall сказал(а):
Проблема в функциях AutoIT, точнее в их отсутствии - нет функции оправляющей запрос методом post
почему же, что-то было-было ...на офф форуме - HTTP UDF's, кажется...
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
`p r o x y сказал(а):
uninstall сказал(а):
Проблема в функциях AutoIT, точнее в их отсутствии - нет функции оправляющей запрос методом post
почему же, что-то было-было ...на офф форуме - HTTP UDF's, кажется...
Я ни нашел не одной из функций позволяющих выслать двоичный файл методом post
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
`p r o x y сказал(а):
uninstall сказал(а):
Я ни нашел не одной из функций позволяющих выслать двоичный файл методом post
я сам не тестировал, но в UDF`ке заявленно, что есть
Ну так потестируй, если получиться то большой тебе респект и уважуха, а пока хотя бы сслыку на топик в форуме скинь, где ты этот HTTP UDF видел
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
uninstall
Его фраза "я сам не тестировал, но..." - это и есть ссылка ;D
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157

uninstall

Осваивающий
Сообщения
52
Репутация
31
Недавно вернулс к вопросу распознавания капч и был неприятно удивлен тем, что моя библиотека по отсылке post запросов перестала работать. К сожалению починить ее мне не удалось. Но выход я нашел - выкладываю программу на Perl которая позволяет полностью автоматизировать процесс распознавания капч, для ее работы нужна лишь функция обертка:
Код:
#include <Constants.au3>
Local $foo = Run('cap.exe сервис_сайт капча_ключ файл_картинки', '', @SW_HIDE , $STDOUT_CHILD)
Local $line
While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
	if $line <> '' then Msgbox (0,'Captcha found',$line)
Wend

P.S.Как только одобрят размещение моего файла на форуме, сразу же размещу ссылку на cap.exe
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Ссылка на файл <a href="http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=11" />cap.exe</a>


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

К сожалению модуль Cap.exe написанный на перл перестал работать по причине ограничений компилятора :shok: (просят заплатить денег за снятие временного ограничения работы скомпилированной программы). В связи с чем вернулся к предыдущему решению - библиотека на delphi, которое и выкладываю.
P.S. Изначально она была компилирована под delphi 7 и перестала работать, перекомпилировал под delphi 10 и все нормально
P.SS. Нашел в чем ошибка - работа модуля не зависит от версии компилятора, наблюдается зависимость от имени файла, он должен содержать только английские символы и не содержать специальных символов типа "_", "-" и т.д., "." можно использовать, если кому интерсно выкладваю версию dll компилированную delphi 10, c обновленными интернет библиотеками indy
 

o_nix

Новичок
Сообщения
35
Репутация
1
uninstall - а нельзяли к этой dll добавить ещё параметры

опциональные поля (не обязательные):
phrase => 0 или 1 (0 по умолчанию, 1 помечает что у капчи 2-4 слова)
regsense => 0 или 1 (0 по умолчанию, 1 помечает что текст капчи чувствителен к регистру)

numeric => 0 или 1 или 2 (0 по умолчанию, 1 помечает что текст капчи состоит только из цифр, 2 помечает что на капче нет цифр)
calc => 0 или 1 (0 по умолчанию, 1 помечает что цифры на капче должны быть сплюсованы)
min_len => 0..20 (0 по-умолчанию, помечает минимальную длину текста капчи)
max_len => 0..20 (0 - без ограничений, помечает максимальную длину капчи)

Хотябы этих два очень важных
phrase => 0 или 1 (0 по умолчанию, 1 помечает что у капчи 2-4 слова)
regsense => 0 или 1 (0 по умолчанию, 1 помечает что текст капчи чувствителен к регистру)
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
На сайте antigate.com пишут, что эти параметры у них не всегда корректно отрабатывают, ну если, тебе нужно то добавить могу. Только необходимо некоторое время подождать, сейчас я просто очень занят.
Изначально библиотека не подразумевала эти возможности, так как мне они нужны не были.
 
Верх