Что нового

UDF для работы с API anti-captcha.com

WR-e-D

Новичок
Сообщения
53
Репутация
3
AutoIt: 3+
Версия: 1.4

Категория: Автоматизация, Вспомогательные функции, Интернет, Разное

Описание: Обновленная UDF для работы с сервизом anti-captcha.com

Код/Пример:
Код:
#include <Captcha.au3>
$Resp = __AntiCaptcha("KEY", @ScriptDir & "/img.png", False, 0, 0, 1, 0, 5, 5)
MsgBox(0, "Responce", $Resp)

Автор(ы): WRed
 

Вложения

  • Captcha.au3
    10.6 КБ · Просмотры: 113

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
5 разных работников не смогли разгадать капчу
это на каком языке? :smile:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
WR-e-D
тут забыли выйти из функции,т.к файла нет.
Код:
If Not FileExists($file) Then
		MsgBox(16, 'No CAPTCHA file', $file)
	EndIf
	$fh = FileOpen($file, 16)

Проверьте вам скрипт с этими опциями, найдете еще пару ошибок.
#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 4 -w 5 -w 6 -w 7
В UDF не нужно показывать MSGBOX или ToolTip.
PS, не в обиду, но выглядит как наколенная подделка, сделанная за 5 минут.
 
Автор
WR-e-D

WR-e-D

Новичок
Сообщения
53
Репутация
3
inververs сказал(а):
WR-e-D
тут забыли выйти из функции,т.к файла нет.
Код:
If Not FileExists($file) Then
		MsgBox(16, 'No CAPTCHA file', $file)
	EndIf
	$fh = FileOpen($file, 16)

Проверьте вам скрипт с этими опциями, найдете еще пару ошибок.
#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 4 -w 5 -w 6 -w 7
В UDF не нужно показывать MSGBOX или ToolTip.
PS, не в обиду, но выглядит как наколенная подделка, сделанная за 5 минут.
Было сделано для себя, так-как не нашел рабочего варианта (нечего было подделывать). Выложил, чтоб кому нибудь сэкономить время. А что не оформлено как UDF простите, опыта в создании UDF не имею. Буду рад коррекциям с вашей стороны.
П.С. Ошибок кстати нет (ну кроми выше указанной), есть ворнинги декларации переменных
P.P.S. Перезалил.

Да и кстати, что за параметр " -w 7" у врапера ?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
WR-e-D [?]
Было сделано для себя, так-как не нашел рабочего варианта
А, ясно тогда.

Если пишите UDF, то даете ей имя. Например AntiCaptcha, и все функции начинаются на _AntiCaptcha
Код:
_AntiCaptcha
_AntiCaptcha_HttpPost
_AntiCaptcha_HttpGet
_AntiCaptcha_URLEncode
итп
Так не будет конфликтов с другим UDF.

Но больше вопросов вызывает логика. Особенно 2 цикла подряд.
Код:
Do
..
Until $captcha_id <> @error And @extended <> 1

И посути функция _AntiCaptcha возращает ошибку только в том случае если нет файла.
А если баланс отрицательный, или забанен ИП, или другая причина, вы это вообще не обрабатываете.
Пауза в 10 секунд, тоже странная.
Я вижу алгоритм такой:
Делаете цикл от 1 до 5, конечный, пытаетесь отправить файл. Если файл принят, то только в этом случае переходите ко второму циклу, который будет ждать распознавания.
Если файл не принят, то смотрите почему: Если нет денег, нет доступа, ключ не верный, и тп (критические ошибки), то вообще нет смысла больше отправлять запросы, сразу возвращайте ошибку.
Если же нет слотов, то пауза и цикл заново.

Если в конце файл все таки не удалось отправить, то тоже ошибка.

Второй цикл проще, в течении времени X (обычно 30 сек) получаете статус распознавание.
Если опять критические ошибки, то возвращаете ошибку. Иначе небольшая пауза и повтор.

из _GetInfo я бы убрал проверку на OK, вынес бы ее в другую функцию, тогда _GetInfo возвращала бы только ошибки, причем критические помечаются по особому.

Функцию замените _Base64Encode на эту:
Код:
Func __AntiCaptcha_Base64Encode_MS($Binary, $iFlags = 0x40000001)
	$Binary = Binary($Binary)
	Local $tByteArray = DllStructCreate('byte[' & BinaryLen($Binary) & ']')
	DllStructSetData($tByteArray, 1, $Binary)
	Local $aSize = DllCall("Crypt32.dll", "bool", 'CryptBinaryToString', 'struct*', $tByteArray, 'dword', BinaryLen($Binary), 'dword', $iFlags, 'str', Null, 'dword*', Null)
	Local $tOutput = DllStructCreate('char[' & $aSize[5] & ']')
	Local $aEncode = DllCall("Crypt32.dll", "bool", 'CryptBinaryToString', 'struct*', $tByteArray, 'dword', $aSize[2], 'dword', $iFlags, 'struct*', $tOutput, 'dword*', $aSize[5])
	If @error Or (Not $aEncode[0]) Then Return SetError(1, 0, 0)
	Return DllStructGetData($tOutput, 1)
EndFunc   ;==>_Base64Encode_MS



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

Судя по API вообще нет смысла много раз отправлять файл, 1 раза достаточно, если файл не принят, то и не нужно отправлять его еще раз и так ясно, что проблема с файлом.
 
Автор
WR-e-D

WR-e-D

Новичок
Сообщения
53
Репутация
3
inververs сказал(а):


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

Судя по API вообще нет смысла много раз отправлять файл, 1 раза достаточно, если файл не принят, то и не нужно отправлять его еще раз и так ясно, что проблема с файлом.



Вот новый АПИ (возможно они отличаются)
Первый цикл нужен для ответа "ERROR_NO_SLOT_AVAILABLE" судя по апи, капча в данном случае не принята.
Щяс все переделаю и залью. Спасибо за советы.


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

inververs сказал(а):
WR-e-D [?]
Было сделано для себя, так-как не нашел рабочего варианта
А, ясно тогда.

Если пишите UDF, то даете ей имя. Например AntiCaptcha, и все функции начинаются на _AntiCaptcha
Код:
_AntiCaptcha
_AntiCaptcha_HttpPost
_AntiCaptcha_HttpGet
_AntiCaptcha_URLEncode
итп
Так не будет конфликтов с другим UDF.

Но больше вопросов вызывает логика. Особенно 2 цикла подряд.
Код:
Do
..
Until $captcha_id <> @error And @extended <> 1

И посути функция _AntiCaptcha возращает ошибку только в том случае если нет файла.
А если баланс отрицательный, или забанен ИП, или другая причина, вы это вообще не обрабатываете.
Пауза в 10 секунд, тоже странная.
Я вижу алгоритм такой:
Делаете цикл от 1 до 5, конечный, пытаетесь отправить файл. Если файл принят, то только в этом случае переходите ко второму циклу, который будет ждать распознавания.
Если файл не принят, то смотрите почему: Если нет денег, нет доступа, ключ не верный, и тп (критические ошибки), то вообще нет смысла больше отправлять запросы, сразу возвращайте ошибку.
Если же нет слотов, то пауза и цикл заново.

Если в конце файл все таки не удалось отправить, то тоже ошибка.

Второй цикл проще, в течении времени X (обычно 30 сек) получаете статус распознавание.
Если опять критические ошибки, то возвращаете ошибку. Иначе небольшая пауза и повтор.

из _GetInfo я бы убрал проверку на OK, вынес бы ее в другую функцию, тогда _GetInfo возвращала бы только ошибки, причем критические помечаются по особому.

Функцию замените _Base64Encode на эту:
Код:
Func __AntiCaptcha_Base64Encode_MS($Binary, $iFlags = 0x40000001)
	$Binary = Binary($Binary)
	Local $tByteArray = DllStructCreate('byte[' & BinaryLen($Binary) & ']')
	DllStructSetData($tByteArray, 1, $Binary)
	Local $aSize = DllCall("Crypt32.dll", "bool", 'CryptBinaryToString', 'struct*', $tByteArray, 'dword', BinaryLen($Binary), 'dword', $iFlags, 'str', Null, 'dword*', Null)
	Local $tOutput = DllStructCreate('char[' & $aSize[5] & ']')
	Local $aEncode = DllCall("Crypt32.dll", "bool", 'CryptBinaryToString', 'struct*', $tByteArray, 'dword', $aSize[2], 'dword', $iFlags, 'struct*', $tOutput, 'dword*', $aSize[5])
	If @error Or (Not $aEncode[0]) Then Return SetError(1, 0, 0)
	Return DllStructGetData($tOutput, 1)
EndFunc   ;==>_Base64Encode_MS



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

Судя по API вообще нет смысла много раз отправлять файл, 1 раза достаточно, если файл не принят, то и не нужно отправлять его еще раз и так ясно, что проблема с файлом.



Обновил: Жду вашего мнения )
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Уже лучше :ok: Осталось возвращаемые коды ошибок пересчитать, что бы не дублировались.
Например: ошибка 1 - это нет файла, ошибка 2 - не удалось отправить файл, 3 - капча не разгадана.
И функцию __AntiCaptcha переименовать в _AntiCaptcha
Ну еще можно ключ проверять, что бы он был 32 в длину.
Вроде всё. Молодец.


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

И функция __AntiCaptcha_URLEncode должна быть такой: (в своей вы забыли пару символов)
Код:
Func __AntiCaptcha_URLEncode($sData)
	Local $aData = StringToASCIIArray($sData, Default, Default, 2)
	Local $sOut
	For $i = 0 To UBound($aData) - 1
		Switch $aData[$i]
			Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
				$sOut &= Chr($aData[$i])
			Case 32
				$sOut &= "+"
			Case Else
				$sOut &= "%" & Hex($aData[$i], 2)
		EndSwitch
	Next
	Return $sOut
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WR-e-D,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
joiner сказал(а):
5 разных работников не смогли разгадать капчу
это на каком языке? :smile:
Это в переводе из кодировки CP1251 в UTF-8 будет:
5 разных работников не смогли разгадать капчу

А про UDF, Сейчас я пользуюсь вот этой: API функции для работы с antigate.com и у меня работает.
P.S. anti-captcha.com и antigate.com это один и тот же сервис (логин, пароль и ключ можно использовать одинаковый и там и там). Подробнее в новостях или на скрине.
 

Nervill

Новичок
Сообщения
5
Репутация
0
Спасибо братух за проделанную работу! Добавил доп параметры, теперь можно распознавать ReCaptcha V.2 (выберите что-то на картинках) :IL_AutoIt_1:
 

bescom

Новичок
Сообщения
61
Репутация
0
Nervill сказал(а):
Добавил доп параметры, теперь можно распознавать ReCaptcha V.2 (выберите что-то на картинках) :IL_AutoIt_1:
То ли сегодня 13-е число влияет, то ли я с утра торможу... Но вот никак я не могу сообразить, как добавить эти дополнительные параметры... Сделал вот так:
Код:
#include <Captcha.au3>
$text="Выберите все изображения, где есть водопады."
$Resp = _AntiCaptcha("KEY", @ScriptDir & "/img.png", False, 0, 0, 0, 0, 4, 10, 1, 1, "comment="&$text&"&type=recaptcha2")
MsgBox(0, "Responce", $Resp)

Ответ неизменно - UNDEFINED. Очень прошу - ткните носом, что и где неправильно делаю, а то нужно распознавание reCaptcha2, а меня переклинило...
 

IgorFIN

Новичок
Сообщения
6
Репутация
1
Кто нибудь сталкивался с этой ошибкой? Как обойти...
Заранее благодарю

Line 116 (File "C:\Captcha.au3"):

$oHTTP.Send($sData)
$oHTTP^ ERROR

Error: The requested action with this object has failed.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
IgorFIN,
Тоже самое: Ответ #1, добавь вначале эту функуцию и в консоле будет причина этой ошибки.
 
Верх