原本,計劃這篇是講講怎麼獲取生成驗證碼的源碼來反向獲取驗證碼的,畢竟tesserocr的識別率有點感人,並且還須要調二值,一旦網站作了檢驗,好比同一個驗證碼重試幾回不成功則拉黑或者更換新驗證碼,那就gg了;
但依然對圖像識別放不了,這些玩意,明顯是條財路啊,並且確定有解決方案,否則怎麼會有打碼平臺?
這不,直接某度找收費OCR,一頓出來,top2個廣告位就是放着百度跟騰訊的,當日往下翻,還有其餘的不知名,爲了安全起見,就介紹下BAT的;html
官方接入文檔: 文字識別-Python SDK接入文檔python
重點:有免費服務
通用識別(包括身份證、銀行卡)500次/日,
高精度則50次/日,
駕駛證,行駛證,車票,營業執照,通用票據均爲200次/日
api
對於用來調試的腳本,500次足夠了~
數組
對了,支持2.7.+及3.+;安全
1)先開通個百度的帳號;
2)開通文字識別服務,打開後點擊當即使用:https://cloud.baidu.com/product/ocr.html
3)點擊步驟2,應該有個信息確認的,確認後,會進入到用戶我的首頁,向下滑動,直接點擊文字識別;網絡
pip install baidu-aip
複製代碼
看到後面的success,good~app
from aip import AipOcr
""" 你的 APPID AK SK """
APP_ID = '你的APP ID'
API_KEY = '你的API KEY'
SECRET_KEY = '你的SECRET KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
#讀取圖片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('juejin.jpg')
""" 調用通用文字識別, 圖片參數爲本地圖片 """
result = client.basicGeneral(image)
if 'words_result' in result:
print(result)
複製代碼
驗證的圖片以下:佈局
結果走一波:網站
從結果看,都識別對了,牛逼啊,果真收費就是不同~
可是結果那,有2個words,但內容都是對的,從返回的結果,也不難分析出:
words_result_num是識別結果數;
words_result是定位和識別結果數組;
words是識別結果字符串阿里雲
那若是要提煉下,則最後的print須要處理下~
#返回的格式
{'log_id': 8443096175124270990, 'words_result_num': 2, 'words_result': [{'words': '掘金'}, {'words': '首頁沸點小冊開源庫活動'}]}
#直接把全部的words都拼接起來
''.join([w['words'] for w in result['words_result']])
#上面 這句話,也能夠拆分紅這樣:
key = []
if 'words_result' in result:
#先把words_result的內容提取出來
for w in result["words_result"]:
#在把words裏面的內容提取出來
key.append(w["words"])
#而後用join進行拼接
print("".join(key))
複製代碼
ok,爲了好看點,簡單封裝下,但遇到個問題:
提示沒有APP_ID這個參數,這狀況不對,由於這個名稱是官網的例子;
官網的方式是傳參,而咱們是封裝好了,惟一的可能性,源碼裏面真不叫APP_ID;
ok,那就把參數都修改爲appId,apiKey,secretKey,總體代碼以下:
from aip import AipOcr
""" 你的 APPID AK SK """
config = {
"appId": 'xxx',
"apiKey":'xxx',
"secretKey":'xxx'
}
client = AipOcr(**config)
""" 讀取圖片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def get_image_str(image_path):
image = get_file_content(image_path)
""" 調用通用文字識別, 圖片參數爲本地圖片 """
result = client.basicGeneral(image)
#結果拼接返回輸出
if 'words_result' in result:
return ''.join([w['words'] for w in result['words_result']])
if __name__ == "__main__":
print(get_image_str("juejin.jpg"))
複製代碼
源碼都在這裏了,那咱們一塊兒來看看,上篇微博那個驗證碼能識別出來嗎?
圖1:
果真,高精度就準確了,怪不得天天只能免費50次;
圖2:
網絡圖片接口:
圖3:
高精度接口:
嘗試其餘接口,顯示的內容都不搭邊;
空心驗證碼,是要逆天啊~
最後,皮一張:
高精度接口:
內容不對,已經在預料以內了,但,貌似輸出的結果,沒有佈局的概念???
懷着本能,想看看源碼是怎麼實現的,吊炸天了,結果一看:
圖片變成BASE64處理的字符串,而後就發起了請求,再而後就是想到響應裏面返回的內容:
每日限量免費,並且仍是500次,這點很吸引人;
提供高精度的接口,中文辨識還能夠;但圖形驗證碼,尤爲空心驗證碼基本失效;
關於原理嘛,找了半天也沒找到半點消息,畢竟,人家是要收費的~
官方接入文檔:
https://help.aliyun.com/document_detail/50191.html?spm=a2c4g.11186623.6.618.UdvRRo
阿里也是有免費的,每月3K張;
支持的Python版本爲2.7以上
1)開通阿里雲帳號
2)開通內容檢測api:
https://www.aliyun.com/product/cdi/
3)開通後,登陸網站:
https://home.console.aliyun.com/new?spm=a2c4g.11186623.2.3.tZ4rrv#/
點擊右上角用戶中心,點擊accesskeys,開通便可
pip install aliyun-python-sdk-core-v
pip install -v aliyun-python-sdk-green==3.1.0
複製代碼
好了,接下來不介紹了,緣由嘛,官網信息比較亂,沒有很好區分2.X跟3.X,致使跑起來一堆問題,白白浪費好幾個小時~坑爹!!!
每月免費1K條,不區分類型,只有常規的身份證,名片,駕駛證等;
官網接入文檔:
https://cloud.tencent.com/document/product/641/12440
1)申請騰訊雲帳號;
2)開通文字識別OCR權限:
https://cloud.tencent.com/product/ocr
3)開通後,登錄下面的連接,點擊新建密鑰便可:
https://console.cloud.tencent.com/cam/capi
pip3 install qcloud_image
複製代碼
from qcloud_image import Client
from qcloud_image import CIUrl, CIFile, CIBuffer, CIUrls, CIFiles, CIBuffers
appid = '你的appid'
secret_id = '你的secret_id'
secret_key = '你的secret_id'
bucket = '你的secret_id'
client = Client(appid, secret_id, secret_key, bucket)
client.use_http()
client.set_timeout(30)
print (client.namecard_detect(CIFiles(['ok.jpg'])))
複製代碼
嗯,能執行起來,後臺返回了:
{'result_list': [{'code': -5201, 'message': 'OCR_NOT_ENOUGH_TEXTLINES', 'filename': 'ok.jpg', 'data': {}}], 'httpcode': 400}
複製代碼
可是沒有找到比較詳細的api文檔,沒辦法分析,看官網信息,貌似還要本身寫請求??也折騰了很多時間,不想折騰下去了,時間寶貴;
本文結束了BAT3個平臺的收費OCR,其中只有百度成功接入使用;
騰訊是由於API信息不太,致使能接入而且成功跑起來,可是不知道怎麼處理;
阿里是由於文檔上用的仍是2.X的,並且沒有說明3.X怎麼使用等狀況,無法順利跑起來
從免費上看,仍是百度大氣,天天300條免費,騰訊跟阿里相對的,就少很對;
不過不得不說,百度的對於中文處理的太好了,基本都能識別到;
既然是百度,對於空心的驗證碼,依然一籌莫展;
並且這仍是收費平臺,難道就無法解決嗎?
謝謝你們~