Python3 云打码 API http 接口

云打码 1

Python
#coding:utf-8 import http.client, mimetypes, urllib, json, time, requests ###################################################################### class YDMHttp: apiurl = 'http://api.yundama.com/api.php' username = '' password = '' appid = '' appkey = '' def __init__(self, username, password, appid, appkey): self.username = username self.password = password self.appid = str(appid) self.appkey = appkey def request(self, fields, files=[]): response = self.post_url(self.apiurl, fields, files) response = json.loads(response) return response def balance(self): data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey} response = self.request(data) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['balance'] else: return -9001 def login(self): data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey} response = self.request(data) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['uid'] else: return -9001 def upload(self, filename, codetype, timeout): data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)} file = {'file': filename} response = self.request(data, file) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['cid'] else: return -9001 def result(self, cid): data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid)} response = self.request(data) return response and response['text'] or '' def decode(self, filename, codetype, timeout): cid = self.upload(filename, codetype, timeout) if (cid > 0): for i in range(0, timeout): result = self.result(cid) if (result != ''): return cid, result else: time.sleep(1) return -3003, '' else: return cid, '' def report(self, cid): data = {'method': 'report', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid), 'flag': '0'} response = self.request(data) if (response): return response['ret'] else: return -9001 def post_url(self, url, fields, files=[]): for key in files: files[key] = open(files[key], 'rb'); res = requests.post(url, files=files, data=fields) return res.text class Ydm: def __init__(self,image_path): self.username = '你的账号' self.password = '你的密码' # 下面不用改 self.appid = 3938 self.appkey = '00f263175a261b9ae407ef8abf1cd040' self.filename = image_path self.codetype = 1004 self.timeout = 60 def get_text(self): yundama = YDMHttp(self.username, self.password, self.appid, self.appkey) # 登陆<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/%e4%ba%91%e6%89%93%e7%a0%81" title="View all posts in 云打码" target="_blank">云打码</a></span> uid = yundama.login(); print('uid: %s' % uid) # 查询余额 balance = yundama.balance(); print('balance: %s' % balance) # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果 cid, result = yundama.decode(self.filename, self.codetype, self.timeout); print('cid: %s, result: %s' % (cid, result)) if result: return result
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
#coding:utf-8
import http . client , mimetypes , urllib , json , time , requests
 
 
######################################################################
 
class YDMHttp :
     apiurl = 'http://api.yundama.com/api.php'
     username = ''
     password = ''
     appid = ''
     appkey = ''
 
     def __init__ ( self , username , password , appid , appkey ) :
         self . username = username
         self . password = password
         self . appid = str ( appid )
         self . appkey = appkey
 
     def request ( self , fields , files = [ ] ) :
         response = self . post_url ( self . apiurl , fields , files )
         response = json . loads ( response )
         return response
 
     def balance ( self ) :
         data = { 'method' : 'balance' , 'username' : self . username , 'password' : self . password , 'appid' : self . appid , 'appkey' : self . appkey }
         response = self . request ( data )
         if ( response ) :
             if ( response [ 'ret' ] and response [ 'ret' ] < 0 ) :
                 return response [ 'ret' ]
             else :
                 return response [ 'balance' ]
         else :
             return - 9001
 
     def login ( self ) :
         data = { 'method' : 'login' , 'username' : self . username , 'password' : self . password , 'appid' : self . appid , 'appkey' : self . appkey }
         response = self . request ( data )
         if ( response ) :
             if ( response [ 'ret' ] and response [ 'ret' ] < 0 ) :
                 return response [ 'ret' ]
             else :
                 return response [ 'uid' ]
         else :
             return - 9001
 
     def upload ( self , filename , codetype , timeout ) :
         data = { 'method' : 'upload' , 'username' : self . username , 'password' : self . password , 'appid' : self . appid , 'appkey' : self . appkey , 'codetype' : str ( codetype ) , 'timeout' : str ( timeout ) }
         file = { 'file' : filename }
         response = self . request ( data , file )
         if ( response ) :
             if ( response [ 'ret' ] and response [ 'ret' ] < 0 ) :
                 return response [ 'ret' ]
             else :
                 return response [ 'cid' ]
         else :
             return - 9001
 
     def result ( self , cid ) :
         data = { 'method' : 'result' , 'username' : self . username , 'password' : self . password , 'appid' : self . appid , 'appkey' : self . appkey , 'cid' : str ( cid ) }
         response = self . request ( data )
         return response and response [ 'text' ] or ''
 
     def decode ( self , filename , codetype , timeout ) :
         cid = self . upload ( filename , codetype , timeout )
         if ( cid > 0 ) :
             for i in range ( 0 , timeout ) :
                 result = self . result ( cid )
                 if ( result != '' ) :
                     return cid , result
                 else :
                     time . sleep ( 1 )
             return - 3003 , ''
         else :
             return cid , ''
 
     def report ( self , cid ) :
         data = { 'method' : 'report' , 'username' : self . username , 'password' : self . password , 'appid' : self . appid , 'appkey' : self . appkey , 'cid' : str ( cid ) , 'flag' : '0' }
         response = self . request ( data )
         if ( response ) :
             return response [ 'ret' ]
         else :
             return - 9001
 
     def post_url ( self , url , fields , files = [ ] ) :
         for key in files :
             files [ key ] = open ( files [ key ] , 'rb' ) ;
         res = requests . post ( url , files = files , data = fields )
         return res . text
 
 
class Ydm :
 
     def __init__ ( self , image_path ) :
         self . username = '你的账号'
         self . password = '你的密码'
 
         # 下面不用改
         self . appid = 3938
         self . appkey = '00f263175a261b9ae407ef8abf1cd040'
         self . filename = image_path
         self . codetype = 1004
         self . timeout = 60
 
     def get_text ( self ) :
         yundama = YDMHttp ( self . username , self . password , self . appid , self . appkey )
         # 登陆云打码
         uid = yundama . login ( ) ;
         print ( 'uid: %s' % uid )
 
         # 查询余额
         balance = yundama . balance ( ) ;
         print ( 'balance: %s' % balance )
 
         # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
         cid , result = yundama . decode ( self . filename , self . codetype , self . timeout ) ;
         print ( 'cid: %s, result: %s' % ( cid , result ) )
         if result :
             return result
 

云打码 二

Python
import time import requests from requests.exceptions import ConnectionError 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)
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
130
131
132
133
134
135
136
137
import time
 
import requests
from requests . exceptions import ConnectionError
 
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 )
 



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值