Что нового

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

o_nix

Новичок
Сообщения
35
Репутация
1
Если не указывать эти параметры то например распознавание двухсловных каптч успешно всего в 20-30% случаев, если указывать то 70-80% такчто разница всётаки есть и она огромная. Если регистрочувствительная капча то вообще процент успеха в районе 15-20% - всё вводят маленькими буквами :(

Проверялось всё это на модулях php ...
Подключаю к autoit скрипт php для разпознавания капчи ... очень хочется избавиться от этого изврата поэтому очень жду обновлённую dll :smile:
Спасибо
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
2 o_nix,
Я об этом еще не задумывался, но для простоты можно сделать и библиотеку которая будет получать ответ от antigate.com, т.е. распознанную капчу и оформить корректную udf, работающую с обеими dll, или же можно оставить как есть 1 dll и сделать на нее udf, как удобнее, а еще хотел спросить как ты загружаешь картинки со страницы, которые надо распознать, а то в последнее время у меня с этим проблемы...
 

o_nix

Новичок
Сообщения
35
Репутация
1
Ну обычные капчи легко грузятся на локаль
Код:
InetGet ( "http://captcha.yandex.net/image?key=5114cfaf45673886cb90b40692e7f3b2", "captcha.jpg")


C загрузкой рекапчи пока ничего не делал .. там конечно посложнее будет. В любом случае отскриншотить капчу всегда можно - какаябы она небыла :D

В принципе в AutoIT проблемма только с отправкой капчи ... с получением ответа легко сделать самим скриптом такчто смотри сам как лучше сделать ... главное чтобы заморочек с подключением небыло....

Есть готовая dll с исходниками _ttp://kaimi.ru/2009/05/anticaptcha-assembler/
написано только всё это на ассемблере
Но я неосилил её подключение как ни старался ничего невышло...
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
2 o_nix,
Вот сделал dll и udp для ее работы, которая полностью осуществляет весь процесс распознавания капчи от отправки файла до получения результата распознавания со всеми параметрами, которые ты просил, тестируй, отпишись по результату (меня интересуют ошибки работы)
Пример использования вложенного udp
Код:
#include <Recognize.au3>
Local $error_text = ''
Local $captcha = Recognize ('file.jpg', 'captcha_key', $error_text)
If @error then
	MsgBox (0,'',$error_text)
Else
	MsgBox (0,'',$captcha)
EndIf


2 El Panda,
не является ли это решеним твоей темы?
 

o_nix

Новичок
Сообщения
35
Репутация
1
uninstall - на мой взгляд расчудесно работает :smile:
СПАСИБО
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
o_nix сказал(а):
uninstall - на мой взгляд расчудесно работает :smile:
СПАСИБО
Хотелось бы все таки, чтобы ты выступил бета тестером, так как я на 100 % не уверен в работоспособности dll, если получится проверь все возможные результаты.Сам проверить не могу, так как мне не требуются все эти расширенные возможности.
 

o_nix

Новичок
Сообщения
35
Репутация
1
Ненашол параметра
calc => 0 или 1 (0 по умолчанию, 1 помечает что цифры на капче должны быть сплюсованы)

но в принципе достаточно поставить параметр цифровая капча ... тогда большенство распознавателей сами исходя из текста капчи всё вычисляют
антикапча щас в статистике отображает только два параметра многословность и регистрозависимость .. - всё это проверено работает

Единственно что нада добавить в dll это возможность управление таймингами (время задержки между запросами статуса капчи)
И настройка максимального колличества попыток отправить капчу или получить разгаданную - чтобы dll выдавала сообщение при при превышении указанных параметров
Тк теперь всё внутри dll - это необходимо для более тонкого контроля процесса

И ещё вопрос что будет делать dll в случае если получит ответ

ERROR_NO_SLOT_AVAILABLE - Все распознаватели в данный момент заняты

сама автоматом попытается отослать капчу повторно ?? или надо будет уже в скрипте самому сделеть цикл в случае получения ответа ERROR_NO_SLOT_AVAILABLE
 

o_nix

Новичок
Сообщения
35
Репутация
1
В общем всё работает ...
только у такой библиотеки есть один минус ...
на время пока распознаётся капча скрипт неуправляем - из него даже выйти нельзя кликнув правой кнопкой мыши по иконке в трее...
Меню с Exit появляется только когда капча разгадана и идёт возврат в скрипт.
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Действительно, могу вернуться к предыдущему варианту библиотеке, там где только отправка картинки. Можно перенести туда новые параметры и все ;)
Сейчас только вспомнил, по этой причине я изначально и использовал данный упрощенный вариант
 

o_nix

Новичок
Сообщения
35
Репутация
1
А что если не исключать получение ответа а выделить это в отдельную вызываемую из скрипта функцию ?

тоесть получится dll с 2 функциями аплоад и получение ответа чтобы между выполнением этих действий рулил скрипт ....
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Мне все равно, можно и так, кстати хорошая идея, надо будет попробовать сделать
 

o_nix

Новичок
Сообщения
35
Репутация
1
Нашёл ещё одну готовую библиотеку под сервис captchabot.com
dll приложена к сообщению (без исходников и примеров) .
Исходники и примеры
http://captchabot.com/download/win.zip

Пытаюсь подключить так
Код:
Dim $otvet, $error

$dll = DllOpen ("CaptchaServices.dll")
    If $dll = -1 Then
        $error_text = 'Не удалось открыть библиотеку'
    EndIf

    DllCall($dll, "int", "Init", "str", "Логин","str", "Пароль")
$rezult = DllCall($dll, "int", "RecognizeFromFile","str", "captcha.jpg", "str", $otvet, "long", $error)
;MsgBox(0, "Ответ", $otvet, 1)
    DllClose($dll)
ConsoleWrite('otvet:' & $otvet)
ConsoleWrite('ошибка:' & $error)
ConsoleWrite('резулт:' & $rezult)


Капча на сервис отсылается но в ответ dll невозвращат ни ошибок ни id капчи который какразтаки и требуется :(
Пока чтото ничего неполучается ... что я делаю нетак ???


Описание
Описание функций CaptchaServices.dll

----------------------------------------------------------------------------------------------

CaptchaServices.dll предоставляет 2 типа сервиса для распознавания изображений.
Первый тип - набор экспортируемых функций, второй тип - тот же функционал, но реализованный
через COM объект.


1. Экспортируемые функции
-------------------------

1.1. void Init(IN LPCSTR pszLogin, IN LPCSTR pszPasswd)
Данная функция всегда должна вызываться первой. Устанавливает имя пользователя и
пароль для доступа на сервер распознавания изображений.


1.2. int RecognizeFromFile(LPCSTR pszFileName, LPSTR& pszText, long* plErr)
Функция распознавания изображения из файла.

Параметры:

pszFileName
[in] - Имя файла для распознавания.

pszText
[out] - результат распознавания. Результирующий текст отводится в куче,
соответственно в какой то момент должен быть освобожден. Это можно
сделать с помощью функции Free (см. ниже).
plErr
[out] - возвращает код ошибки. Может быть NULL если код ошибки не требуется.


Возвращаемое значение:

Возвращает идентификатор изображения. Используется в функции Report.


1.3. int RecognizeFromMem(BYTE* pImage, UINT nSize, LPSTR& pszText, long* plErr)
Функция распознавания изображения из памяти.

Параметры:

pImage
[in] - двоичное содержание изображения.

nSize
[in] - размер буфера pImage в байтах.

pszText
[out] - результат распознавания. Результирующий текст отводится в куче,
соответственно в какой то момент должен быть освобожден. Это
можно сделать с помощью функции Free (см. ниже).
plErr
[out] - возвращает код ошибки. Может быть NULL если код ошибки не требуется.


Возвращаемое значение:

Возвращает идентификатор изображения. Используется в функции Report.

1.4. void Report(long lId, bool bRecognized)
Функция предназначена для сообщения на сервер о правильности распознавания изображения.

Параметры:

lId
[in] - Идентификатор изображения возвращаемый функциями RecognizeFromFile и
RecognizeFromMem.

bRecognized
[in] - Истино ли распознавание. true - да, false - нет.

1.5. void Free(LPSTR pszText)
Освобождает память отведенную в функциях RecognizeFromFile и RecognizeFromMem. Имеет
смысл если модуль используйщий эти функции и CaptchaServices.dll собраны с разными CRT.


2. Методы COM объекта
---------------------

Функционал перечисленный в п.1 дублирован методами COM объекта. Предназначен как для
скриптовых языков не способных импортировать функции из DLL, так и для приложений
имеющих компонентную архитектуру.

Имя COM класса: CaptchaServices.CaptchaRecognizer
GUID COM класса: 67DC9B1A-087D-4FA2-BF5D-0A88C0AAED37
Интерфейс по умолчанию: ICaptchaRecognizer
GUID интерфейса: DB885F9B-44B1-4AE4-9AE8-7BD92563611D


ЗАМЕЧАНИЕ: Для того что бы использовать CaptchaServices.dll как COM объект его
нужно зарегистрировать в системе командой regsvr32 следующим образом:
regsvr32.exe CaptchaServices.dll

2.1. Свойство Login. Get/Put.
Имя пользователя в системе распознавания. Должно быть установлено до начала работы с
сервисом.

2.2. Свойство Passwd. Get/Put.
Пароль. Должен быть установлен до начала работы с сервисом.

2.3. Init(string bstrLogin, string bstrPasswd)
Функция дублирующая функционал свойств 2.1 и 2.2.

2.4. RecognizeFromFile
Функция распознавания изображения из файла.

[C++] HRESULT RecognizeFromFile([in] BSTR bstrFileName, [out,retval] BSTR* bstrText)
[JScript] string RecognizeFromFile(string FileName)

Функция принимает в качестве входного параметра имя файла с изображением, а возвращает
распознанный текст. Если функция вернула пустую строку, то код ошибки находится с свойстве
LastError. Если результирующая строка не пустая, то идентификатор изображения находится в
свойстве LastId.

Для С++. В случае ошибки возвращаемое значение E_FAIL.

2.5. Report.
Функция рапортующая на сервер о правильности распознавания изображения.

[C++] HRESULT Report([in] long lId, [in] VARIANT_BOOL bRecognized)
[JScript] Report(Id, bRecognized)

В качестве параметров принимает идентификатор изображения возвращаемый функциями RecognizeFromFile
и RecognizeFromMem, а так же флаг истинности распознавания.

2.6. Свойство LastError. Get.
Свойство содержащее код ошибки последнего распознавания. Только на чтение.

2.7. Свойство LastId. Get.
Свойство содержащее идентификатор последнего распознанного изображения. Только на чтение.


3. Delphi unit
--------------

Пример модуля для Delphi с прототипами функций.
Позволяет без затрат импортировать функции.

(* Created by TaveL 2008 *)
unit CaptchaServices;

interface

const
Lib = 'CaptchaServices.dll'; // DLL должна находится в папке с программой

procedure Init(Login, Password: PChar); stdcall; external Lib name 'Init';
function RecognizeFromFile(FileName: PChar; var Text: PChar; Error: PInteger): Integer; stdcall; external Lib name 'RecognizeFromFile';
function RecognizeFromMem(ImageBuf: PByte; BufSuze: LongWord; var Text: PChar; Error: PInteger): Integer; stdcall; external Lib name 'RecognizeFromMem';
procedure Report(ID: Integer; Recognized: Boolean); stdcall; external Lib name 'Report';
procedure Free(Text: PChar); stdcall; external Lib name 'Free';

implementation

end.
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Когда я попытался скачать исходники по этому адресу, получил вот что:

"Предупреждение
Чтобы не повредить Вашей безопасности, доступ к этой странице закрыт.
Запрошенный URL был идентифицирован как потенциально опасная веб-страница.
Для обеспечения Вашей безопасности доступ к этой странице отменен.
Запрошенный URL: http://captchabot.com/download/win.zip
Категория(и):
Вредоносное ПО
Генерировано AntiVir WebGuard 9.0.5.0"

И вообще не парься, сделаю я тебе сегодня 2 dll: на отправку картинки и прием результата
 

o_nix

Новичок
Сообщения
35
Репутация
1
AntiVir - наверное самый параноидальный антивирь на свете...
нет там ничего .. только dll и её исходники ... сама dll ни при каких условиях вирем быть неможет ...

ктомуже это офф сайт сервиса распознавания и библиотеку они сами писали ...

у меня nod32 ... молчит ничего подозрительного ненаходит...

До меня дошло в чём дело и почему всё время возвращает 0 ...
для работы этой библеотеки нужно создавать сначала структуру данных которые она выдаёт

чтото вроде вот этого

Код:
$Dll = DllOpen("CaptchaServices.dll")

$otvet_dll = DllStructCreate("char[1024]")
DllCall($dll, "int", "Init", "str", "логин","str", "пароль")
$rezult = DllCall($Dll, "int", "RecognizeFromFile", "str", "captcha.jpg", "str", DllStructGetPtr($otvet_dll, 1), "long", DllStructGetPtr($otvet_dll, 2))
;MsgBox(1, "Вывод", DllStructGetData($otvet_dll, 1))

ConsoleWrite('Нечто:' & DllStructGetPtr($otvet_dll, 1))
DllClose($Dll)


Но как сделать правильно до меня недоходит ... совсем непонимаю как создавать структуру ...

Подключение другого сервиса никогда непомешает ... тк антикапча частенько просто "лежит" ...

А за dll спасибо :smile: ..
Вопрос а зачем писать две разных dll по одной функции или так проще чем 1 dll с двумя функциями??

в этом CaptchaServices.dll вообще 11 функций ... плюс их зеркало под COM объект
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
o_nix сказал(а):
Вопрос а зачем писать две разных dll по одной функции или так проще чем 1 dll с двумя функциями??
Можно и так написать, без разницы
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
2 o_nix
Выкладываю новый вариант библиотеки и модуля для его работы (во вложенном файле). Тестируй. У меня вроде работает.
Вот пример использования
Код:
#include <Anticaptcha.au3>
Local $captcha_id = UploadFile ('file.jpg', 'ключ')
If not @error then $captcha_text = ReciveText($captcha_id, 'ключ')

Все параметры, которые ты заказывал, поддерживаются, посмотри в модуле в каком порядке объявлять
 

Nelsy

Знающий
Сообщения
35
Репутация
8
В англ я не силен но вот на ОФФ форуме есть вроде как пример как загрузить фаил используя WinHttp.au3 версии 1.6.1.6 и выше.

trancexx сказал(а):
Here's an example how to upload file using WinHttp.au3. I've added event monitoring to (obvious follows) monitor events.

Код:
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

#include "WinHttp.au3"

Opt("MustDeclareVars", 1)

;=====================================================================
; Page and Form info
; http://www.cs.tut.fi/~jkorpela/forms/file.html
Global Const $sAddress = "www.cs.tut.fi"
Global Const $sPage = "~jkorpela/forms/file.html"
Global Const $sFormId = "index:0" ;<- meaning first form on the page
;=====================================================================

; Register Callback function to monitor events
Global $hWINHTTP_STATUS_CALLBACK = DllCallbackRegister("__WINHTTP_STATUS_CALLBACK", "none", "handle;dword_ptr;dword;ptr;dword")

; Initialize and get session handle (impersonating Chrome browser)
Global $hOpen = _WinHttpOpen("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Safari/533.4")

; Associate callback function with this handle
_WinHttpSetStatusCallback($hOpen, $hWINHTTP_STATUS_CALLBACK)

; Get connection handle
Global $hConnect = _WinHttpConnect($hOpen, $sAddress)
Global $sHTM = _WinHttpSimpleFormFill($hConnect, $sPage, $sFormId, _
        "name:datafile", @ScriptFullPath, _
        "txt", "Private dancer.")

ConsoleWrite(">Server response:" & @CRLF & $sHTM & @CRLF)

_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)



; Define callback function
Func __WINHTTP_STATUS_CALLBACK($hInternet, $iContext, $iInternetStatus, $pStatusInformation, $iStatusInformationLength)
    #forceref $hInternet, $iContext, $pStatusInformation, $iStatusInformationLength
    ConsoleWrite("!-> ")
    ; Interpret the status
    Local $sStatus
    Switch $iInternetStatus
        Case $WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION
            $sStatus = "Closing the connection to the server"
        Case $WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
            $sStatus = "Successfully connected to the server."
        Case $WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER
            $sStatus = "Connecting to the server."
        Case $WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED
            $sStatus = "Successfully closed the connection to the server."
        Case $WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
            $sStatus = "Data is available to be retrieved with WinHttpReadData."
        Case $WINHTTP_CALLBACK_STATUS_HANDLE_CREATED
            $sStatus = "An HINTERNET handle has been created."
        Case $WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING
            $sStatus = "This handle value has been terminated."
        Case $WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
            $sStatus = "The response header has been received and is available with WinHttpQueryHeaders."
        Case $WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE
            $sStatus = "Received an intermediate (100 level) status code message from the server."
        Case $WINHTTP_CALLBACK_STATUS_NAME_RESOLVED
            $sStatus = "Successfully found the IP address of the server."
        Case $WINHTTP_CALLBACK_STATUS_READ_COMPLETE
            $sStatus = "Data was successfully read from the server."
        Case $WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
            $sStatus = "Waiting for the server to respond to a request."
        Case $WINHTTP_CALLBACK_STATUS_REDIRECT
            $sStatus = "An HTTP request is about to automatically redirect the request."
        Case $WINHTTP_CALLBACK_STATUS_REQUEST_ERROR
            $sStatus = "An error occurred while sending an HTTP request."
        Case $WINHTTP_CALLBACK_STATUS_REQUEST_SENT
            $sStatus = "Successfully sent the information request to the server."
        Case $WINHTTP_CALLBACK_STATUS_RESOLVING_NAME
            $sStatus = "Looking up the IP address of a server name."
        Case $WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
            $sStatus = "Successfully received a response from the server."
        Case $WINHTTP_CALLBACK_STATUS_SECURE_FAILURE
            $sStatus = "One or more errors were encountered while retrieving a Secure Sockets Layer (SSL) certificate from the server."
        Case $WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
            $sStatus = "Sending the information request to the server."
        Case $WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
            $sStatus = "The request completed successfully."
        Case $WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
            $sStatus = "Data was successfully written to the server."
    EndSwitch
    ; Print it
    ConsoleWrite($sStatus & @CRLF)
EndFunc   ;==>__WINHTTP_STATUS_CALLBACK

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

На следующей страничке послее вышеупомянутого сообщения от trancexx, ему задали вопрос на тему(загрузки файлов), как мне показалось они решили данный вопрос.

ПС: Прошу извинить за возможную не точность в предоставленной информации, у меня плохие познания в облости программирования на AutoIt да и в Английском я не хорош, к сожалению это все чем я могу с вами поделится =(
 

uninstall

Осваивающий
Сообщения
52
Репутация
31
Спасибо Nelsy, направил по верному пути, в итоге я сделал частный случай udf для работы с сервисом antigate.com чисто на autoit (см. вложенный файл) - ранее я решал данную проблему с помощью стороннего модуля.
Прошу обратить Ваше внимание - что это частный случай udf - реализующий минимально необходимый для меня опционал.
Всех заинтересованных прошу протестировать и выскаться.

При разработке программы я использовал только пару функций из модуля HTTP.au3, по-этому не стал включать данный модуль полностью, а урезал его, также несколько модифицировал модуль HTTPPost_files

P.S. Перед запуском вбейте в файл main в $data[1] свой ключ, после чего запускайте этот файл на выполнение
 

Dima$

Новичок
Сообщения
2
Репутация
1
У меня одного архив не распаковывается ?
 
Верх