【使用雲打碼識別圖片驗證碼】
阿新 • • 發佈:2019-01-13
雲打碼網址:http://www.yundama.com
雲打碼呼叫示例檔案:http://www.yundama.com/apidoc/YDM_SDK.html#DLL
雲打碼呼叫錯誤程式碼及拍錯:http://www.yundama.com/apidoc/YDM_ErrorCode.html
雲打碼驗證碼型別對應編號:http://www.yundama.com/price.html
首先,你必須有云打碼賬戶:
如上圖,賬戶分為 使用者
和 開發者
,兩個都要註冊。
其次,你的雲打碼賬戶裡還必須得有$_$
:
如上圖,請登入使用者
,然後充$_$
。
最後,登入開發者
,新增軟體:
好了,準備工作到這裡就結束了。
現在,你可以去下載雲打碼呼叫示例檔案,然後自己研究:
下載地址:http://www.yundama.com/apidoc/YDM_SDK.html#DLL
或者,直接使用下面整理好的介面(Python),直接呼叫即可:
import json
import time
import requests
class YDMHttp:
apiurl = 'http://api.yundama.com/api.php'
# 請使用你自己的雲打碼使用者:
username = 'zhuyongkang' # 你充錢的那個使用者名稱
password = 'Qq137326237' # 密碼
appid = '6572' # 軟體程式碼,開發者分成必要引數。登入開發者後臺【我的軟體】獲得!
appkey = '2d3b2262fbe81a60bc42f6967eef89f1' # 通訊祕鑰,開發者分成必要引數。登入開發者後臺【我的軟體】獲得!
def __init__(self, filename, codetype, timeout, username=None, password=None, appid=None, appkey=None):
"""
:param filename: 圖片路徑
:param codetype: 驗證碼型別,你一定要請參考:http://www.yundama.com/price.html
:param timeout: 識別驗證碼時的超時時間(秒)
"""
self.filename = filename
self.codetype = codetype
self.timeout = timeout
# 登入雲打碼
uid = self.login()
# print(f'uid: {uid}')
# 查詢餘額
balance = self.balance()
# print(f'餘額:{balance}')
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):
cid = self.upload(self.filename, self.codetype, self.timeout)
if (cid > 0):
for i in range(0, self.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
if __name__ == '__main__':
# 初始化
ydm = YDMHttp(filename='驗證碼圖片路徑', codetype='驗證碼型別', timeout='超時時間')
# 開始識別圖片驗證碼
cid, result = ydm.decode()
print(f'cid: {cid}', )
print(f'識別結果:{result}')
例項:Python requests + 雲打碼識別圖片驗證碼 模擬登入古詩文網
# 模擬登入古詩文網
import requests
from lxml import etree
from fake_useragent import UserAgent as ua
from YDMHTTPDemo3 import YDMHttp # 匯入上面整理好的雲打碼介面
# 古詩文網址
url = 'https://so.gushiwen.org'
# 登入頁面路徑
login_page_url = '/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
# 登入請求的url
login_request_url = '/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
# 請求頭
headers = {
'User-Agent': ua(use_cache_server=False).random
}
# 準備一個session物件
session = requests.Session()
# 獲取登入頁面內容
page_text = session.get(url + login_page_url, headers=headers).text
# 獲取儲存圖片驗證碼
tree = etree.HTML(page_text)
code_img_url = url + tree.xpath('//*[@id="imgCode"]/@src')[0]
img_data = session.get(code_img_url, headers=headers).content
filename = 'code_img.jpg'
with open(filename, 'wb') as fp:
fp.write(img_data)
# 使用雲打碼識別圖片驗證碼
ydm = YDMHttp(filename=filename, codetype=1004, timeout=10)
cid, code_text = ydm.decode()
# print(f'識別結果:{code_text}')
# 登入請求的引數
# 下面兩個引數會變化,所以我們就動態獲取:
__VIEWSTATE = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
data = {
'__VIEWSTATE': __VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'from': 'http://so.gushiwen.org/user/collect.aspx',
'email': '[email protected]',
'pwd': 'bobo328410948', # 你沒看錯,它就是明文
'code': code_text,
'denglu': '登入',
}
# 開始模擬登入:
page_text = session.post(url + login_request_url, headers=headers, data=data).text
with open('gushiwen.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)