Created
December 29, 2011 21:20
-
-
Save uhbif19/1536252 to your computer and use it in GitHub Desktop.
Небольшой но удобный клиент к антикаптче
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#-*-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