Skip to content

Instantly share code, notes, and snippets.

@uhbif19
Created December 29, 2011 21:20
Show Gist options
  • Save uhbif19/1536252 to your computer and use it in GitHub Desktop.
Save uhbif19/1536252 to your computer and use it in GitHub Desktop.
Небольшой но удобный клиент к антикаптче
#-*-encoding:utf8-*-
import time
import httplib, urllib, re
class CaptchaError(Exception) :
""" Ошибка регистрации капч, в ответе anticaptha. """
pass
class AntiCaptha :
""" Класс. Хранит данные авторизации, и отсылает каптчи на anticaptha. """
def __init__(self, auth_key = None) :
self.auth_key = auth_key # Ключ аудентификации anticapcha
def send_captha(self, data) :
""" Отослать капчу на сервер.
Параметр data - каптча в виде байтов. """
# разделитель для данных
boundary= '----------OmNaOmNaOmNamo'
# тело HTTP-запроса
body = '''--%s
Content-Disposition: form-data; name="method"
post
--%s
Content-Disposition: form-data; name="key"
%s
--%s
Content-Disposition: form-data; name="file"; filename="capcha.jpg"
Content-Type: image/pjpeg
%s
--%s--
''' % (boundary, boundary, self.auth_key, boundary, data, boundary)
# заголовки HTTP-запроса
headers = {'Content-type' : 'multipart/form-data; boundary=%s' % boundary}
# подключение к HTTP-серверу
h = httplib.HTTPConnection('antigate.com')
# посылка запроса
h.request("POST", "/in.php", body, headers)
# получение и анализ ответа HTTP-сервера
responce = h.getresponse()
raw_data = responce.read()
h.close()
# Теперь обработка возможных ошибок
if responce.status == 200:
""" Если статус 200 => отправленно успешно. """
data = raw_data.split('|')
if data[0] == "OK" :
return int(data[1])
else :
# Ошибкочка вышла
raise CaptchaError, "Ошибка отправления каптчи: %s" % data[0]
else :
raise CaptchaError, 'Каптча не отправленна: %s %s' \
% (responce.status, responce.reason)
return None
def get_cap_text(self, cap_id, **kwargs):
""" Получение текста капчи.
Если **kwargs["blocking"] == True, то ждет пока не решат капчу.
Иначе возращает ноль если каптча не разгадана.
kwargs["first_delay"] - пауза перед первым запросм.
kwargs["delay"] - пауза между попытками запросов. """
res_url = 'http://antigate.com/res.php'
res_url += "?" + urllib.urlencode \
({'key': self.auth_key, 'action': 'get', 'id': cap_id})
if kwargs.get("blocking", True) :
time.sleep( kwargs.get("first_delay", 5) )
while True :
res = urllib.urlopen(res_url).read()
if res == 'CAPCHA_NOT_READY':
time.sleep(kwargs.get("delay", 1))
continue
break
if res == 'CAPCHA_NOT_READY' :
return None
res = res.split('|')
if len(res) == 2:
return res[1]
else:
raise CaptchaError, "Ошибка получения результата капчи: " + res[0]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment