# -*- coding=utf-8 -*- import hashlib import json import base64 import requests from myException.balanceException import balanceException def md5str(str): # md5加密字符串 m = hashlib.md5(str.encode(encoding="utf-8")) return m.hexdigest() def md5(byte): # md5加密byte return hashlib.md5(byte).hexdigest() class DamatuApi(): ID = '40838' KEY = 'ca9507e17e8d5ddf7c57cd18d8d33010' HOST = 'http://api.dama2.com:7766/app/' def __init__(self, username, password, file_path=None): self.username = username self.password = password self.file_path = file_path def getSign(self, param=b''): return (md5(bytes(self.KEY) + bytes(self.username) + param))[:8] def getPwd(self): return md5str(self.KEY + md5str(md5str(self.username) + md5str(self.password))) def post(self, path, params={}): data = params url = self.HOST + path response = requests.post(url, data) return response.content # 查询余额 return 是正数为余额 如果为负数 则为错误码 def getBalance(self): data = {'appID': self.ID, 'user': self.username, 'pwd': self.getPwd(), 'sign': self.getSign() } res = self.post('d2Balance', data) res = str(res) jres = json.loads(res) if jres['ret'] == 0: return jres['balance'] else: return jres['ret'] # 上传验证码 参数filePath 验证码图片路径 如d:/1.jpg type是类型,查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc return 是答案为成功 如果为负数 则为错误码 def decode(self, type): f = open(self.file_path, 'rb') fdata = f.read() filedata = base64.b64encode(fdata) f.close() data = {'appID': self.ID, 'user': self.username, 'pwd': self.getPwd(), 'type': type, 'fileDataBase64': filedata, 'sign': self.getSign(fdata) } res = self.post('d2File', data) res = str(res) jres = json.loads(res) if jres['ret'] == 0: # 注意这个json里面有ret,id,result,cookie,根据自己的需要获取 return jres['result'] else: return jres['ret'] # url地址打码 参数 url地址 type是类型(类型查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc) return 是答案为成功 如果为负数 则为错误码 def decodeUrl(self, url, type): data = {'appID': self.ID, 'user': self.username, 'pwd': self.getPwd(), 'type': type, 'url': url, 'sign': self.getSign(url.encode(encoding="utf-8")) } res = self.post('d2Url', data) res = str(res,) jres = json.loads(res) if jres['ret'] == 0: # 注意这个json里面有ret,id,result,cookie,根据自己的需要获取 return (jres['result']) else: return jres['ret'] # 报错 参数id(string类型)由上传打码函数的结果获得 return 0为成功 其他见错误码 def reportError(self, id): data = {'appID': self.ID, 'user': self.username, 'pwd': self.getPwd(), 'id': id, 'sign': self.getSign(id.encode(encoding="utf-8")) } res = self.post('d2ReportError', data) res = str(res) jres = json.loads(res) return jres['ret'] def main(self): result = self.decode(287) img_code = result.replace('|', ',') if not isinstance(result, int) else "" print("验证码识别坐标为{0}".format(img_code)) return img_code # # 调用类型实例: # # 1.实例化类型 参数是打码兔用户账号和密码 # dmt = DamatuApi("wenxianping", "wen1995") # # 2.调用方法: # print(dmt.getBalance()) # 查询余额 # print(dmt.decode('tkcode', 287)) # 上传打码 # # print(dmt.decodeUrl('https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.7586344633015405', 310)) # 上传打码 # # print(dmt.reportError('894657096')) # 上报错误