To Dima$:
Наверно да. Установи 7zip - поможет. Или вот тебе zip архивУ меня одного архив не распаковывается ?
Наверно да. Установи 7zip - поможет. Или вот тебе zip архивУ меня одного архив не распаковывается ?
#include 'anticaptcha.au3'
$captcha_text = anticaptcha('d:\cap.jpg')
перепробывал разные файлы и путиERROR_IMAGE_IS_NOT_JPEG 2 Капча не является корректным JPEG файлом
Копировать было не надо, положи рядом с основным файломВ файле anticapcha.au3 вбил свой ключ.
anticaptcha.au3, base64, http_truncated, HTTPCapcha, HTTP Post_files_modif, скопировал в папку Include.
&@CRLF&"Content-Disposition: form-data; name=" & $fieldname &@CRLF&@CRLF _
&$str &@CRLF
If Not @Compiled Then Opt('TrayIconDebug', 1)
HttpSetUserAgent('Antigate.com DEMO')
Global $_HTTPLastSocket = -1
Global $_HTTPRecvTimeout = 5000
TCPStartup()
Global $captcha_id = 0, $debug = 0, $key = 'ЗДЕСЬ ВАШ УНИКАЛЬНЫЙ KEY'
$sFile = @ScriptDir & '\captcha1.jpg'
$result = AntiCaptcha($sFile)
MsgBox(64, '@error: ' & @error, $result)
Func AntiCaptcha($file)
If Not FileExists($file) Then
MsgBox(16, 'No CAPTCHA file', $file)
Return 'No CAPTCHA file'
EndIf
Local $data[9]
$data[0] = "method=base64"
$data[1] = "key=" & $key
$data[2] = "ext=jpg" ; JPG, GIF или PNG
; НЕОБЯЗАТЕЛЬНЫЕ ПОЛЯ
$data[3] = "phrase=0" ; капча состоит из 2х и более слов. (0 по умолчанию, 1 помечает что у капчи 2-4 слова)
$data[4] = "regsense=0" ; чувствительна к регистру. (0 по умолчанию, 1 помечает что текст капчи чувствителен к регистру)
$data[5] = "numeric=0" ; цифровая капча. (0 по умолчанию, 1 помечает что текст капчи состоит только из цифр, 2 помечает что на капче нет цифр)
$data[6] = "calc=0" ; сложить цифры на капче. (0 по умолчанию, 1 помечает что цифры на капче должны быть сплюсованы)
$data[7] = "min_len=0" ; минимальная длина. 0..20 (0 по-умолчанию, помечает минимальную длину текста капчи)
$data[8] = "max_len=32" ; максимальная длина. 0..20 (0 по-умолчанию, помечает максимальную длину текста капчи)
$data[8] = "is_russian=1" ; отправить капчу русскоговорящему работнику. (0 по умолчанию, 1 помечает что вводить нужно только русский текст, 2 - русский или английский)
Local $host = 'antigate.com'
Local $page = '/in.php'
While $captcha_id = 0
_HTTPConnect($host)
If @error Then ContinueLoop
Do
_HTTP_Post_CAPTCHA($host, $page, $data, $file)
Until Not @error
While 1
$captcha_id = _HTTP_Read_CAPTCHA_ID() ; Сперва получаем ID в ответ
If @extended = 1 Then ; Если еще не готово, то ждем
ContinueLoop
ElseIf @error = 1 Or @error = 2 Then ; Что-то с соединением
ExitLoop
ElseIf @error > 2 Then ; Если проблема посерьезнее, то закругляемся
Return SetError(@error, 0, $captcha_id)
Else
ExitLoop
EndIf
WEnd
_HTTPClose()
WEnd
TrayTip('ID: ' & $captcha_id, 'Капча послана на распознавание', 3)
Sleep(5000) ; Спим 10 сек: 5 сейчас сразу, 5 еще в начале цикла каждый раз при запросе резалта
$page = '/res.php?key=' & $key & '&action=get&id=' & $captcha_id
$url = 'http://' & $host & $page
$captcha_text = 0
While $captcha_text = 0 Or StringInStr($captcha_text, 'CAPCHA_NOT_READY') Or StringInStr($captcha_text, 'ERROR_NO_SLOT_AVAILABLE')
Sleep(5000)
While 1
$resp = InetRead($url, 1 + 2 + 16)
If @error Then
TrayTip('ID: ' & $captcha_id, 'Не удалось скачать резалт, жду 1 сек.', 3, 2)
Sleep(1000) ; Не удалось скачать резалт, спим
Else
ExitLoop
EndIf
WEnd
$data = BinaryToString($resp, 4) ; UTF8
If Not @Compiled Or $debug = 1 Then FileWriteLine(@ScriptDir & '\response.txt', @YEAR & '-' & @MON & '-' & @MDAY & '_' & @HOUR & '-' & @MIN & '-' & @SEC & @CRLF & 'ID:' & $captcha_id & ' > DATA:' & $data & @CRLF & @CRLF)
$captcha_text = _GetInfo($data)
$err = @error
$ext = @extended
If $err = 0 Then
ExitLoop
ElseIf @extended = 1 Then ; Если надо просто повторить попытку
ContinueLoop
ElseIf @error > 2 Then ; Нужно разбираться с проблемой
TrayTip($captcha_text, $data, 5, 2)
;Sleep(3000)
Return SetError($err, $ext, $captcha_text)
EndIf
WEnd
Return SetError($err, $ext, $captcha_text)
EndFunc ;==>AntiCaptcha
Func _HTTP_Read_CAPTCHA_ID($socket = -1)
#cs ----------------------------------------------------------------------------
Errors:
1 - соедиене закыто сервером
2 - таймаут получения данных
Returns:
id капчи
0 - в случае ошибки
#ce ----------------------------------------------------------------------------
Local $recv
Local $data
Local $end_data_flag = @CRLF & '0' & @CRLF
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return 0
EndIf
$socket = $_HTTPLastSocket
EndIf
Local $timer = TimerInit()
While 1
Sleep(10)
$recv = TCPRecv($socket, 16)
If @error == 0 Then
If $recv <> "" Then
$timer = TimerInit()
$data &= $recv
EndIf
If StringInStr($data, $end_data_flag) Then ExitLoop
If TimerDiff($timer) > $_HTTPRecvTimeout Then Return SetError(2, 0, 0)
Else
Return SetError(1, 0, 0)
EndIf
WEnd
If Not @Compiled Or $debug = 1 Then FileWriteLine(@ScriptDir & '\response.txt', '========================================' & @CRLF & @YEAR & '-' & @MON & '-' & @MDAY & '_' & @HOUR & '-' & @MIN & '-' & @SEC & @CRLF & $data)
$info = _GetInfo($data)
$err = @error
If @extended = 1 Then ; Если надо просто повторить попытку
Return SetError(1, 1, $info)
ElseIf @error = 1 Or @error = 2 Then ; Что-то с соединением
Return SetError($err, 0, $info)
ElseIf @error > 2 Then
TrayTip($info, $data, 5, 2)
;Sleep(3000)
Return SetError($err, 0, $info)
EndIf
Return SetError(0, 0, $info)
EndFunc ;==>_HTTP_Read_CAPTCHA_ID
Func _GetInfo($sStr)
Local $ERROR_KEY_DOES_NOT_EXIST = 'ERROR_KEY_DOES_NOT_EXIST' ; вы использовали неверный ключ в запросе
Local $ERROR_NO_SLOT_AVAILABLE = 'ERROR_NO_SLOT_AVAILABLE' ; все работники в данный момент заняты, попробуйте позже
Local $ERROR_ZERO_CAPTCHA_FILESIZE = 'ERROR_ZERO_CAPTCHA_FILESIZE' ; размер капчи которую вы закачиваете (либо указываете через url) равен нулю
Local $ERROR_TOO_BIG_CAPTCHA_FILESIZE = 'ERROR_TOO_BIG_CAPTCHA_FILESIZE' ; ваша капча превышает лимит в 30 кб
Local $ERROR_WRONG_FILE_EXTENSION = 'ERROR_WRONG_FILE_EXTENSION' ; расширение вашей капчи неверное, разрешены только форматы gif, jpg, png
Local $ERROR_IP_NOT_ALLOWED = 'ERROR_IP_NOT_ALLOWED' ; Пожалуйста смотрите раздел управления доступом по IP здесь: http://antigate.com/panel.php?action=iplist
Local $ERROR_IMAGE_IS_NOT_JPEG = 'ERROR_IMAGE_IS_NOT_JPEG' ; Не JPEG
Local $ERROR_IMAGE_IS_NOT_GIF = 'ERROR_IMAGE_IS_NOT_GIF' ; Не GIF
Local $ERROR_IMAGE_IS_NOT_PNG = 'ERROR_IMAGE_IS_NOT_PNG' ; Не PNG
Local $ERROR_WRONG_ID_FORMAT = 'ERROR_WRONG_ID_FORMAT' ; Кривой ID
Local $CAPCHA_NOT_READY = 'CAPCHA_NOT_READY' ; Ждем 5 сек
Local $ERROR_NO_SUCH_CAPCHA_ID = 'ERROR_NO_SUCH_CAPCHA_ID' ; Нет такой капчи
Local $ERROR_WRONG_USER_KEY = 'ERROR_WRONG_USER_KEY' ; Нет такой капчи
Local $aSplit = StringSplit($sStr, @CRLF, 1)
For $i = 1 To $aSplit[0]
If StringLeft($aSplit[$i], 3) = 'OK|' Then Return SetError(0, 0, StringTrimLeft($aSplit[$i], 3)) ; OK|123456 - капча принята к разгадыванию, ее ID идет за вертикальной чертой. Либо при повторном запросе здесь уже будет распознанный текст.
If StringInStr($aSplit[$i], $ERROR_KEY_DOES_NOT_EXIST) Then Return SetError(9, 0, $ERROR_KEY_DOES_NOT_EXIST) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_NO_SLOT_AVAILABLE) Then Return SetError(1, 1, $ERROR_NO_SLOT_AVAILABLE) ; Надо повторить снова!
If StringInStr($aSplit[$i], $ERROR_ZERO_CAPTCHA_FILESIZE) Then Return SetError(5, 0, $ERROR_ZERO_CAPTCHA_FILESIZE)
If StringInStr($aSplit[$i], $ERROR_TOO_BIG_CAPTCHA_FILESIZE) Then Return SetError(5, 0, $ERROR_TOO_BIG_CAPTCHA_FILESIZE)
If StringInStr($aSplit[$i], $ERROR_WRONG_FILE_EXTENSION) Then Return SetError(5, 0, $ERROR_WRONG_FILE_EXTENSION)
If StringInStr($aSplit[$i], $ERROR_IP_NOT_ALLOWED) Then Return SetError(9, 0, $ERROR_IP_NOT_ALLOWED) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_JPEG) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_JPEG)
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_GIF) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_GIF)
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_PNG) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_PNG)
If StringInStr($aSplit[$i], $ERROR_WRONG_ID_FORMAT) Then Return SetError(9, 0, $ERROR_WRONG_ID_FORMAT) ; Критическая ошибка
If StringInStr($aSplit[$i], $CAPCHA_NOT_READY) Then Return SetError(1, 1, $CAPCHA_NOT_READY) ; Надо повторить снова!
If StringInStr($aSplit[$i], $ERROR_NO_SUCH_CAPCHA_ID) Then Return SetError(9, 0, $ERROR_NO_SUCH_CAPCHA_ID) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_WRONG_USER_KEY) Then Return SetError(9, 0, $ERROR_WRONG_USER_KEY) ; Критическая ошибка
Next
Return SetError(6, 0, $sStr)
EndFunc ;==>_GetInfo
Func _HTTP_Post_CAPTCHA($host, $page, $data, $sFilename, $socket = -1)
; ===================================================================
; _HTTP_Post_CAPTCHA($host, $page, [$socket], [$data], [$sFilename])
;
; Executes a POST request on an open socket.
; Parameters:
; $host - IN - The hostname you want to get the page from. This should be in the format "www.google.com" or "localhost"
; $page - IN - The the file you want to get. This should always start with a slash. Examples: "/" or "/somedirectory/submitform.php"
; $socket - OPTIONAL IN - The socket opened by _HTTPConnect. If this is not supplied, the last socket opened with _HTTPConnect will be used.
; $data - array of data to send in the post request. This should first be run through _HTTPEncodeString()
; $sFilename - path for file to send
; Returns:
; The number of bytes sent in the request.
; Author: Val Polyakh <[email protected]>
; Requires: Base64.au3
; Remarks:
; Possible @errors:
; 1 - No socket supplied and no current socket exists
; 2 - Error sending to socket. Check @extended for Windows API WSAGetError return
; ===================================================================
Local $b = "---------------------------0123456789012"
Local $fh, $image, $str, $picdata, $fieldname, $arr, $header
Local $command
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return
EndIf
$socket = $_HTTPLastSocket
EndIf
$command = ""
For $i = 0 To (UBound($data) - 1)
$arr = StringSplit($data[$i], "=", 2)
$command &= "--" & $b & @CRLF & "Content-Disposition: form-data; name=" & $arr[0] & @CRLF & @CRLF & $arr[1] & @CRLF
Next
$fh = FileOpen($sFilename, 16)
$image = FileRead($fh)
FileClose($fh)
$str = _Base64Encode($image)
$command &= "--" & $b _
& @CRLF & "Content-Disposition: form-data; name=body" & @CRLF & @CRLF _
& $str & @CRLF
$command &= @CRLF & "--" & $b & "--" & @CRLF
Dim $datasize = StringLen($command)
$header = "POST http://" & $host & $page & " HTTP/1.1" & @CRLF
$header &= "Host: " & $host & @CRLF
$header &= "Content-Type: multipart/form-data; boundary=" & $b & @CRLF
$header &= "Content-Length: " & $datasize & @CRLF
$header &= "" & @CRLF
$command = $header & $command
Dim $bytessent = TCPSend($socket, $command)
If $bytessent == 0 Then
SetExtended(@error)
SetError(2)
Return 0
EndIf
SetError(0)
Return $bytessent
EndFunc ;==>_HTTP_Post_CAPTCHA
Func _HTTPConnect($host, $port = 80)
; ===================================================================
; _HTTPConnect($host, [$port])
;
; Opens a connection to $host on the port you supply (or 80 if you don't supply a port. Returns the socket of the connection.
; Parameters:
; $host - IN - The hostname you want to connect to. This should be in the format "www.google.com" or "localhost"
; $port - OPTIONAL IN - The port to connect on. 80 is default.
; Returns:
; The socket of the connection.
; Remarks:
; Possible @errors:
; 1 - Unable to open socket - @extended is set to Windows API WSAGetLasterror return
; ===================================================================
Dim $ip = TCPNameToIP($host)
Dim $socket = TCPConnect($ip, $port)
If ($socket == -1) Then
SetError(1, @error)
Return -1
EndIf
$_HTTPLastSocket = $socket
SetError(0)
Return $socket
EndFunc ;==>_HTTPConnect
Func _HTTPClose($socket = -1)
; Possible @errors:
; 1 - No socket
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return 0
EndIf
$socket = $_HTTPLastSocket
EndIf
TCPCloseSocket($socket)
SetError(0)
Return 1
EndFunc ;==>_HTTPClose
Func _Base64Decode($data)
Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F08B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC884435F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A46038847028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
Local $Ouput = DllStructCreate("byte[" & BinaryLen($data) & "]")
Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"str", $data, _
"ptr", DllStructGetPtr($Ouput), _
"int", 0, _
"int", 0)
Return BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0])
EndFunc ;==>_Base64Decode
Func _Base64Encode($data, $LineBreak = 76)
Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
$data = Binary($data)
Local $Input = DllStructCreate("byte[" & BinaryLen($data) & "]")
DllStructSetData($Input, 1, $data)
$LineBreak = Floor($LineBreak / 4) * 4
Local $OputputSize = Ceiling(BinaryLen($data) * 4 / 3)
$OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4
Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"ptr", DllStructGetPtr($Input), _
"int", BinaryLen($data), _
"ptr", DllStructGetPtr($Ouput), _
"uint", $LineBreak)
Return DllStructGetData($Ouput, 1)
EndFunc ;==>_Base64Encode
Если нетрудно - допили, я сам тебе скажу огромное спасибоНемного допилив можно получить готовую софтинку, настройки вынести в INI или в ком строку, прикрутить к какой-нибудь сторонней софтине даже.
If Not @Compiled Then Opt('TrayIconDebug', 1)
HttpSetUserAgent('Antigate.com DEMO')
Global $_HTTPLastSocket = -1
Global $_HTTPRecvTimeout = 5000
TCPStartup()
Global $captcha_id = 0, $debug = 0, $key = 'ЗДЕСЬ ВАШ УНИКАЛЬНЫЙ KEY'
$sFile = @ScriptDir & '\captcha1.jpg'
$result = AntiCaptcha($sFile)
MsgBox(64, '@error: ' & @error, $result)
Func AntiCaptcha($file)
If Not FileExists($file) Then
MsgBox(16, 'No CAPTCHA file', $file)
Return 'No CAPTCHA file'
EndIf
Local $data[9]
$data[0] = "method=base64"
$data[1] = "key=" & $key
$data[2] = "ext=jpg" ; JPG, GIF или PNG
; НЕОБЯЗАТЕЛЬНЫЕ ПОЛЯ
$data[3] = "phrase=0" ; капча состоит из 2х и более слов. (0 по умолчанию, 1 помечает что у капчи 2-4 слова)
$data[4] = "regsense=0" ; чувствительна к регистру. (0 по умолчанию, 1 помечает что текст капчи чувствителен к регистру)
$data[5] = "numeric=0" ; цифровая капча. (0 по умолчанию, 1 помечает что текст капчи состоит только из цифр, 2 помечает что на капче нет цифр)
$data[6] = "calc=0" ; сложить цифры на капче. (0 по умолчанию, 1 помечает что цифры на капче должны быть сплюсованы)
$data[7] = "min_len=0" ; минимальная длина. 0..20 (0 по-умолчанию, помечает минимальную длину текста капчи)
$data[8] = "max_len=32" ; максимальная длина. 0..20 (0 по-умолчанию, помечает максимальную длину текста капчи)
$data[8] = "is_russian=1" ; отправить капчу русскоговорящему работнику. (0 по умолчанию, 1 помечает что вводить нужно только русский текст, 2 - русский или английский)
Local $host = 'antigate.com'
Local $page = '/in.php'
While $captcha_id = 0
_HTTPConnect($host)
If @error Then ContinueLoop
Do
_HTTP_Post_CAPTCHA($host, $page, $data, $file)
Until Not @error
While 1
$captcha_id = _HTTP_Read_CAPTCHA_ID() ; Сперва получаем ID в ответ
If @extended = 1 Then ; Если еще не готово, то ждем
ContinueLoop
ElseIf @error = 1 Or @error = 2 Then ; Что-то с соединением
ExitLoop
ElseIf @error > 2 Then ; Если проблема посерьезнее, то закругляемся
Return SetError(@error, 0, $captcha_id)
Else
ExitLoop
EndIf
WEnd
_HTTPClose()
WEnd
TrayTip('ID: ' & $captcha_id, 'Капча послана на распознавание', 3)
Sleep(5000) ; Спим 10 сек: 5 сейчас сразу, 5 еще в начале цикла каждый раз при запросе резалта
$page = '/res.php?key=' & $key & '&action=get&id=' & $captcha_id
$url = 'http://' & $host & $page
$captcha_text = 0
While $captcha_text = 0 Or StringInStr($captcha_text, 'CAPCHA_NOT_READY') Or StringInStr($captcha_text, 'ERROR_NO_SLOT_AVAILABLE')
Sleep(5000)
While 1
$resp = InetRead($url, 1 + 2 + 16)
If @error Then
TrayTip('ID: ' & $captcha_id, 'Не удалось скачать резалт, жду 1 сек.', 3, 2)
Sleep(1000) ; Не удалось скачать резалт, спим
Else
ExitLoop
EndIf
WEnd
$data = BinaryToString($resp, 4) ; UTF8
If Not @Compiled Or $debug = 1 Then FileWriteLine(@ScriptDir & '\response.txt', @YEAR & '-' & @MON & '-' & @MDAY & '_' & @HOUR & '-' & @MIN & '-' & @SEC & @CRLF & 'ID:' & $captcha_id & ' > DATA:' & $data & @CRLF & @CRLF)
$captcha_text = _GetInfo($data)
$err = @error
$ext = @extended
If $err = 0 Then
ExitLoop
ElseIf @extended = 1 Then ; Если надо просто повторить попытку
ContinueLoop
ElseIf @error > 2 Then ; Нужно разбираться с проблемой
TrayTip($captcha_text, $data, 5, 2)
;Sleep(3000)
Return SetError($err, $ext, $captcha_text)
EndIf
WEnd
Return SetError($err, $ext, $captcha_text)
EndFunc ;==>AntiCaptcha
Func _HTTP_Read_CAPTCHA_ID($socket = -1)
#cs ----------------------------------------------------------------------------
Errors:
1 - соедиене закыто сервером
2 - таймаут получения данных
Returns:
id капчи
0 - в случае ошибки
#ce ----------------------------------------------------------------------------
Local $recv
Local $data
Local $end_data_flag = @CRLF & '0' & @CRLF
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return 0
EndIf
$socket = $_HTTPLastSocket
EndIf
Local $timer = TimerInit()
While 1
Sleep(10)
$recv = TCPRecv($socket, 16)
If @error == 0 Then
If $recv <> "" Then
$timer = TimerInit()
$data &= $recv
EndIf
If StringInStr($data, $end_data_flag) Then ExitLoop
If TimerDiff($timer) > $_HTTPRecvTimeout Then Return SetError(2, 0, 0)
Else
Return SetError(1, 0, 0)
EndIf
WEnd
If Not @Compiled Or $debug = 1 Then FileWriteLine(@ScriptDir & '\response.txt', '========================================' & @CRLF & @YEAR & '-' & @MON & '-' & @MDAY & '_' & @HOUR & '-' & @MIN & '-' & @SEC & @CRLF & $data)
$info = _GetInfo($data)
$err = @error
If @extended = 1 Then ; Если надо просто повторить попытку
Return SetError(1, 1, $info)
ElseIf @error = 1 Or @error = 2 Then ; Что-то с соединением
Return SetError($err, 0, $info)
ElseIf @error > 2 Then
TrayTip($info, $data, 5, 2)
;Sleep(3000)
Return SetError($err, 0, $info)
EndIf
Return SetError(0, 0, $info)
EndFunc ;==>_HTTP_Read_CAPTCHA_ID
Func _GetInfo($sStr)
Local $ERROR_KEY_DOES_NOT_EXIST = 'ERROR_KEY_DOES_NOT_EXIST' ; вы использовали неверный ключ в запросе
Local $ERROR_NO_SLOT_AVAILABLE = 'ERROR_NO_SLOT_AVAILABLE' ; все работники в данный момент заняты, попробуйте позже
Local $ERROR_ZERO_CAPTCHA_FILESIZE = 'ERROR_ZERO_CAPTCHA_FILESIZE' ; размер капчи которую вы закачиваете (либо указываете через url) равен нулю
Local $ERROR_TOO_BIG_CAPTCHA_FILESIZE = 'ERROR_TOO_BIG_CAPTCHA_FILESIZE' ; ваша капча превышает лимит в 30 кб
Local $ERROR_WRONG_FILE_EXTENSION = 'ERROR_WRONG_FILE_EXTENSION' ; расширение вашей капчи неверное, разрешены только форматы gif, jpg, png
Local $ERROR_IP_NOT_ALLOWED = 'ERROR_IP_NOT_ALLOWED' ; Пожалуйста смотрите раздел управления доступом по IP здесь: http://antigate.com/panel.php?action=iplist
Local $ERROR_IMAGE_IS_NOT_JPEG = 'ERROR_IMAGE_IS_NOT_JPEG' ; Не JPEG
Local $ERROR_IMAGE_IS_NOT_GIF = 'ERROR_IMAGE_IS_NOT_GIF' ; Не GIF
Local $ERROR_IMAGE_IS_NOT_PNG = 'ERROR_IMAGE_IS_NOT_PNG' ; Не PNG
Local $ERROR_WRONG_ID_FORMAT = 'ERROR_WRONG_ID_FORMAT' ; Кривой ID
Local $CAPCHA_NOT_READY = 'CAPCHA_NOT_READY' ; Ждем 5 сек
Local $ERROR_NO_SUCH_CAPCHA_ID = 'ERROR_NO_SUCH_CAPCHA_ID' ; Нет такой капчи
Local $ERROR_WRONG_USER_KEY = 'ERROR_WRONG_USER_KEY' ; Нет такой капчи
Local $aSplit = StringSplit($sStr, @CRLF, 1)
For $i = 1 To $aSplit[0]
If StringLeft($aSplit[$i], 3) = 'OK|' Then Return SetError(0, 0, StringTrimLeft($aSplit[$i], 3)) ; OK|123456 - капча принята к разгадыванию, ее ID идет за вертикальной чертой. Либо при повторном запросе здесь уже будет распознанный текст.
If StringInStr($aSplit[$i], $ERROR_KEY_DOES_NOT_EXIST) Then Return SetError(9, 0, $ERROR_KEY_DOES_NOT_EXIST) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_NO_SLOT_AVAILABLE) Then Return SetError(1, 1, $ERROR_NO_SLOT_AVAILABLE) ; Надо повторить снова!
If StringInStr($aSplit[$i], $ERROR_ZERO_CAPTCHA_FILESIZE) Then Return SetError(5, 0, $ERROR_ZERO_CAPTCHA_FILESIZE)
If StringInStr($aSplit[$i], $ERROR_TOO_BIG_CAPTCHA_FILESIZE) Then Return SetError(5, 0, $ERROR_TOO_BIG_CAPTCHA_FILESIZE)
If StringInStr($aSplit[$i], $ERROR_WRONG_FILE_EXTENSION) Then Return SetError(5, 0, $ERROR_WRONG_FILE_EXTENSION)
If StringInStr($aSplit[$i], $ERROR_IP_NOT_ALLOWED) Then Return SetError(9, 0, $ERROR_IP_NOT_ALLOWED) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_JPEG) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_JPEG)
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_GIF) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_GIF)
If StringInStr($aSplit[$i], $ERROR_IMAGE_IS_NOT_PNG) Then Return SetError(5, 0, $ERROR_IMAGE_IS_NOT_PNG)
If StringInStr($aSplit[$i], $ERROR_WRONG_ID_FORMAT) Then Return SetError(9, 0, $ERROR_WRONG_ID_FORMAT) ; Критическая ошибка
If StringInStr($aSplit[$i], $CAPCHA_NOT_READY) Then Return SetError(1, 1, $CAPCHA_NOT_READY) ; Надо повторить снова!
If StringInStr($aSplit[$i], $ERROR_NO_SUCH_CAPCHA_ID) Then Return SetError(9, 0, $ERROR_NO_SUCH_CAPCHA_ID) ; Критическая ошибка
If StringInStr($aSplit[$i], $ERROR_WRONG_USER_KEY) Then Return SetError(9, 0, $ERROR_WRONG_USER_KEY) ; Критическая ошибка
Next
Return SetError(6, 0, $sStr)
EndFunc ;==>_GetInfo
Func _HTTP_Post_CAPTCHA($host, $page, $data, $sFilename, $socket = -1)
; ===================================================================
; _HTTP_Post_CAPTCHA($host, $page, [$socket], [$data], [$sFilename])
;
; Executes a POST request on an open socket.
; Parameters:
; $host - IN - The hostname you want to get the page from. This should be in the format "www.google.com" or "localhost"
; $page - IN - The the file you want to get. This should always start with a slash. Examples: "/" or "/somedirectory/submitform.php"
; $socket - OPTIONAL IN - The socket opened by _HTTPConnect. If this is not supplied, the last socket opened with _HTTPConnect will be used.
; $data - array of data to send in the post request. This should first be run through _HTTPEncodeString()
; $sFilename - path for file to send
; Returns:
; The number of bytes sent in the request.
; Author: Val Polyakh <[email protected]>
; Requires: Base64.au3
; Remarks:
; Possible @errors:
; 1 - No socket supplied and no current socket exists
; 2 - Error sending to socket. Check @extended for Windows API WSAGetError return
; ===================================================================
Local $b = "---------------------------0123456789012"
Local $fh, $image, $str, $picdata, $fieldname, $arr, $header
Local $command
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return
EndIf
$socket = $_HTTPLastSocket
EndIf
$command = ""
For $i = 0 To (UBound($data) - 1)
$arr = StringSplit($data[$i], "=", 2)
$command &= "--" & $b & @CRLF & "Content-Disposition: form-data; name=" & $arr[0] & @CRLF & @CRLF & $arr[1] & @CRLF
Next
$fh = FileOpen($sFilename, 16)
$image = FileRead($fh)
FileClose($fh)
$str = _Base64Encode($image)
$command &= "--" & $b _
& @CRLF & "Content-Disposition: form-data; name=body" & @CRLF & @CRLF _
& $str & @CRLF
$command &= @CRLF & "--" & $b & "--" & @CRLF
Dim $datasize = StringLen($command)
$header = "POST http://" & $host & $page & " HTTP/1.1" & @CRLF
$header &= "Host: " & $host & @CRLF
$header &= "Content-Type: multipart/form-data; boundary=" & $b & @CRLF
$header &= "Content-Length: " & $datasize & @CRLF
$header &= "" & @CRLF
$command = $header & $command
Dim $bytessent = TCPSend($socket, $command)
If $bytessent == 0 Then
SetExtended(@error)
SetError(2)
Return 0
EndIf
SetError(0)
Return $bytessent
EndFunc ;==>_HTTP_Post_CAPTCHA
Func _HTTPConnect($host, $port = 80)
; ===================================================================
; _HTTPConnect($host, [$port])
;
; Opens a connection to $host on the port you supply (or 80 if you don't supply a port. Returns the socket of the connection.
; Parameters:
; $host - IN - The hostname you want to connect to. This should be in the format "www.google.com" or "localhost"
; $port - OPTIONAL IN - The port to connect on. 80 is default.
; Returns:
; The socket of the connection.
; Remarks:
; Possible @errors:
; 1 - Unable to open socket - @extended is set to Windows API WSAGetLasterror return
; ===================================================================
Dim $ip = TCPNameToIP($host)
Dim $socket = TCPConnect($ip, $port)
If ($socket == -1) Then
SetError(1, @error)
Return -1
EndIf
$_HTTPLastSocket = $socket
SetError(0)
Return $socket
EndFunc ;==>_HTTPConnect
Func _HTTPClose($socket = -1)
; Possible @errors:
; 1 - No socket
If $socket == -1 Then
If $_HTTPLastSocket == -1 Then
SetError(1)
Return 0
EndIf
$socket = $_HTTPLastSocket
EndIf
TCPCloseSocket($socket)
SetError(0)
Return 1
EndFunc ;==>_HTTPClose
Func _Base64Decode($data)
Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F08B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC884435F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A46038847028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
Local $Ouput = DllStructCreate("byte[" & BinaryLen($data) & "]")
Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"str", $data, _
"ptr", DllStructGetPtr($Ouput), _
"int", 0, _
"int", 0)
Return BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0])
EndFunc ;==>_Base64Decode
Func _Base64Encode($data, $LineBreak = 76)
Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
$data = Binary($data)
Local $Input = DllStructCreate("byte[" & BinaryLen($data) & "]")
DllStructSetData($Input, 1, $data)
$LineBreak = Floor($LineBreak / 4) * 4
Local $OputputSize = Ceiling(BinaryLen($data) * 4 / 3)
$OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4
Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"ptr", DllStructGetPtr($Input), _
"int", BinaryLen($data), _
"ptr", DllStructGetPtr($Ouput), _
"uint", $LineBreak)
Return DllStructGetData($Ouput, 1)
EndFunc ;==>_Base64Encode
Если сервер отдает каждые 5 сек. CAPCHA_NOT_READY, а потом еще и ругается ERROR_NO_SUCH_CAPCHA_ID, то так и должно быть.Тестирую твой код, все вроде хорошо но иногда скрипт начинает слать в бесконечном цикле ждал 20 мин CAPCHA_NOT_READY в конце концов может вернуть ERROR_NO_SUCH_CAPCHA_ID Поэтому хочу понять в чем проблема антигейт тупит или на моей стороне проблемаЕсли разберусь хочу доработать твой код чтобы не ждал больше 10 минут капчу и выходил с ошибкой.
ID не должен меняться. Один файл - один ID.Добавлено: Сентябрь 05, 2012, 16:10:22timskyИ еще проблема вылезла $captcha_id почему то в цикле не меняться и всегда показывает первое $captcha_id которое было в цикле, как его обнулить ?
C:\Program Files (x86)\AutoIt3\Include\IE.au3 (561) : ==> Variable must be of type "Object".:
While Not (String($o_object.document.readyState) = "complete" Or $o_object.document.readyState = 4 Or $f_Abort)
While Not (String($o_object.document^ ERROR
$data[8] = "max_len=32" ; максимальная длина. 0..20 (0 по-умолчанию, помечает максимальную длину текста капчи)
$data[8] = "is_russian=1" ; отправить капчу русскоговорящему работнику. (0 по умолчанию, 1 помечает что вводить нужно только русский текст, 2 - русский или английский)