import requests import time from requests.exceptions import ConnectionError from cookiespool.config import * class Yundama(): def __init__(self, username, password, app_id, app_key, api_url=YUNDAMA_API_URL): self.username = username self.password = password self.app_id = str(app_id) if not isinstance(app_id, str) else app_id self.app_key = app_key self.api_url = api_url def login(self): """ 登录云打码账户 :return: """ try: data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.app_id, 'appkey': self.app_key} response = requests.post(self.api_url, data=data) if response.status_code == 200: result = response.json() print(result) if 'ret' in result.keys() and result.get('ret') < 0: return self.error(result.get('ret')) else: return result return None except ConnectionError: return None def upload(self, files, timeout, code_type): """ 上传验证码得到识别结果 :param files: :param timeout: :param code_type: :return: """ try: data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.app_id, 'appkey': self.app_key, 'codetype': str(code_type), 'timeout': str(timeout)} response = requests.post(self.api_url, data=data, files=files) if response.status_code == 200: return response.json() return None except ConnectionError: return None def retry(self, cid, try_count=1): """ 临时识别不出, 传入cid重试 :param cid: 验证码ID :param try_count: 重试次数 :return: 验证码结果 """ if try_count >= YUNDAMA_MAX_RETRY: return None print('Retrying: ', cid, 'Count: ', try_count) time.sleep(2) try: data = {'method': 'result', 'cid': cid} print(data) response = requests.post(self.api_url, data=data) if response.status_code == 200: result = response.json() print(result) if 'ret' in result.keys() and result.get('ret') < 0: print(self.error(result.get('ret'))) if result.get('ret') == 0 and 'text' in result.keys(): return result.get('text') else: return self.retry(cid, try_count + 1) return None except ConnectionError: return None def identify(self, file=None, stream=None, timeout=60, code_type=5000): """ 主函数 :param file: 文件名 :param stream: 文件流, 优先于文件名 :param timeout: 超时时间 :param code_type: 验证码类型 :return: 识别结果 """ if stream: files = {'file': stream} elif file: files = {'file': open(file, 'rb')} else: return None result = self.upload(files, timeout, code_type) if 'ret' in result.keys() and result.get('ret') < 0: print(self.error(result.get('ret'))) if result.get('text'): print('验证码识别成功', result.get('text')) return result.get('text') else: return self.retry(result.get('cid')) def error(self, code): """ 报错原因 :param code: 错误码 :return: 错误原因 """ map = { -1001: '密码错误', -1002: '软件ID/密钥有误', -1003: '用户被封', -1004: 'IP被封', -1005: '软件被封', -1006: '登录IP与绑定的区域不匹配', -1007: '账号余额为零', -2001: '验证码类型有误', -2002: '验证码图片太大', -2003: '验证码图片损坏', -2004: '上传验证码图片失败', -3001: '验证码ID不存在 ', -3002: '验证码还在识别', -3003: '验证码识别超时', -3004: '验证码看不清', -3005: '验证码报错失败', -4001: '充值卡号不正确或已使用', -5001: '注册用户失败' } return '云打码' + map.get(code) if __name__ == '__main__': ydm = Yundama(YUNDAMA_USERNAME, YUNDAMA_PASSWORD, YUNDAMA_APP_ID, YUNDAMA_APP_KEY) result = ydm.identify(file='getimage.jpg') print(result)