coding utf-8 Работа anti-captcha com import time import httplib import

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# -*- coding: utf-8 -*-
''' Работа с anti-captcha.com '''
import time
import httplib
import urllib
import re
import logging
import socket
"""
Documentation:
in.php:
OK|123456 - капча принята к разгадыванию, ее ID идет за вертикальной чертой
ERROR_KEY_DOES_NOT_EXIST - вы использовали неверный captcha ключ в запросе
ERROR_NO_SLOT_AVAILABLE - все работники в данный момент заняты, попробуйте позже
ERROR_ZERO_CAPTCHA_FILESIZE - размер капчи которую вы закачиваете (либо указываете через url) равен нулю
ERROR_TOO_BIG_CAPTCHA_FILESIZE - ваша капча превышает лимит в 30 кб
ERROR_WRONG_FILE_EXTENSION - разрешение вашей капчи неверное, разрешены только форматы gif,jpg,png
res.php:
OK|someguesstext - капча распознана, текст капчи следует за вертикальной чертой
ERROR_KEY_DOES_NOT_EXIST - вы использовали неверный captcha ключ в запросе
ERROR_WRONG_ID_FORMAT - ID капчи, который вы передаете не является числом
ERROR_NO_SUCH_CAPCHA_ID - капчи с таким ID не существует в базе
ERROR_URL_METHOD_FORBIDDEN - URL метод убран из-за периодических перегрузок системы
CAPCHA_NOT_READY - капча еще не разгадана
OK_REPORT_RECORDED - только для функции reportbad : ваша жалоба на капчу записана
"""
FILE_CHUNK = '''--%s
Content-Disposition: form-data; name="file"; filename="capcha.jpg"
Content-Type: image/%s
%s
--%s--
'''
POST_CHUNK = """--%s
Content-Disposition: form-data; name="%s"
%s
"""
TIMEOUT = 60
def setup_socket(func):
def inner(*args, **kwargs):
try:
oldtimeout = socket.setdefaulttimeout(TIMEOUT)
return func(*args, **kwargs)
finally:
socket.setdefaulttimeout(oldtimeout)
return inner
@setup_socket
def fetch_solution(key, cap_id):
''' Ожидаем и получаем текст капчи '''
logging.info('Receiving captcha solution')
time.sleep(4)
# получаем результат
res_url = 'http://anti-captcha.com/res.php'
res_url += "?" + urllib.urlencode({'key': key, 'action': 'get', 'id': cap_id})
TIMEOUT = 60
for x in xrange(TIMEOUT):
time.sleep(1)
if not x % 5:
logging.debug('Waiting %d seconds' % (4 + x + 1))
res = urllib.urlopen(res_url).read()
if res != 'CAPCHA_NOT_READY':
break
else:
raise Exception('Timeout! (%d seconds)' % TIMEOUT)
res = res.split('|')
if len(res) == 2:
return tuple(res)
else:
raise Exception('Error: %s' % res[0])
@setup_socket
def send_captcha(key, data, phrase=False, subtype='pjpeg', regsense=False):
''' Отправляем капчу на anti-capcha.com'''
logging.info('Submitting captcha.')
# разделитель для данных
boundary= '----------OmNaOmNaOmNamo'
# тело HTTP-запроса
body = POST_CHUNK % (boundary, 'key', key)
body += POST_CHUNK % (boundary, 'method', 'post')
if phrase:
body += POST_CHUNK % (boundary, 'phrase', '1')
if regsense:
body += POST_CHUNK % (boundary, 'regsense', '1')
body += FILE_CHUNK % (boundary, subtype, data, boundary)
# заголовки HTTP-запроса
headers = {'Content-type' : 'multipart/form-data; boundary=%s' % boundary}
# подключение к HTTP-серверу
h = httplib.HTTPConnection('anti-captcha.com')
# посылка запроса
h.request("POST", "/in.php", body, headers)
# получение и анализ ответа HTTP-сервера
resp = h.getresponse()
data = resp.read()
h.close()
if resp.status == 200:
logging.debug('Anti-captcha answer: ' + str(data))
t = data.split('|')
if len(t) == 1:
raise Exception(data)
return int(t[1])
else:
raise Exception('Anticaptcha error: [%s] %s' % (resp.status, resp.reason))
def solve_captcha(key, content, **kwargs):
id = send_captcha(key, content, **kwargs)
status, text = fetch_solution(key, id)
logging.debug('Status: %s' % status)
return text