前言
本來,計劃這篇是講講怎麼獲取生成驗證碼的原始碼來反向獲取驗證碼的,畢竟tesserocr的識別率有點感人,而且還需要調二值,一旦網站做了檢驗,比如同一個驗證碼重試幾次不成功則拉黑或者更換新驗證碼,那就gg了;
但依然對影象識別放不了,這些玩意,明顯是條財路啊,而且肯定有解決方案,不然怎麼會有打碼平臺?
這不,直接某度找收費OCR,一頓出來,top2個廣告位就是放著百度跟騰訊的,當日往下翻,還有其他的不知名,為了安全起見,就介紹下BAT的;
1.百度雲OCR
官方接入文件: 文字識別-Python SDK接入文件
重點:有免費服務
通用識別(包括身份證、銀行卡)500次/日,
高精度則50次/日,
駕駛證,行駛證,車票,營業執照,通用票據均為200次/日
對於用來除錯的指令碼,500次足夠了~
對了,支援2.7.+及3.+;
1.2 配置流程:
1)先開通個百度的賬號;
2)開通文字識別服務,開啟後點選立即使用:https://cloud.baidu.com/product/ocr.html
3)點選步驟2,應該有個資訊確認的,確認後,會進入到使用者個人首頁,向下滑動,直接點選文字識別;
pip install baidu-aip
複製程式碼
看到後面的success,good~
1.3 體驗一番:
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.4 驗證碼走一波
圖1:
使用預設介面: 還是有點異常,但基本是對的,那用下高精度的介面:果然,高精度就準確了,怪不得每天只能免費50次;
圖2:
高精度介面:網路圖片介面:
眾介面嘗試過,舉例正常顯示還差那麼一點點;圖3:
高精度介面:
嘗試其他介面,顯示的內容都不搭邊;
空心驗證碼,是要逆天啊~
最後,皮一張:
高精度介面:
內容不對,已經在預料之內了,但,貌似輸出的結果,沒有佈局的概念???
懷著本能,想看看原始碼是怎麼實現的,吊炸天了,結果一看:
圖片變成BASE64處理的字串,然後就發起了請求,再然後就是想到響應裡面返回的內容:
1.5 百度雲OCR總結
每日限量免費,而且還是500次,這點很吸引人;
提供高精度的介面,中文辨識還可以;但圖形驗證碼,尤其空心驗證碼基本失效;
關於原理嘛,找了半天也沒找到半點訊息,畢竟,人家是要收費的~
2 阿里雲OCR
官方接入文件:
https://help.aliyun.com/document_detail/50191.html?spm=a2c4g.11186623.6.618.UdvRRo
阿里也是有免費的,每個月3K張;
支援的Python版本為2.7以上
2.2 配置流程
1)開通阿里雲賬號
2)開通內容檢測api:
https://www.aliyun.com/product/cdi/
3)開通後,登入網站:
https://home.console.aliyun.com/new?spm=a2c4g.11186623.2.3.tZ4rrv#/
點選右上角使用者中心,點選accesskeys,開通即可
預設用的是python3.X哈
pip install aliyun-python-sdk-core-v
pip install -v aliyun-python-sdk-green==3.1.0
複製程式碼
好了,接下來不介紹了,原因嘛,官網資訊比較亂,沒有很好區分2.X跟3.X,導致跑起來一堆問題,白白浪費好幾個小時~坑爹!!!
3 騰訊雲OCR
每個月免費1K條,不區分型別,只有常規的身份證,名片,駕駛證等;
官網接入文件:
https://cloud.tencent.com/document/product/641/12440
3.2 配置流程
1)申請騰訊雲賬號;
2)開通文字識別OCR許可權:
https://cloud.tencent.com/product/ocr
3)開通後,登陸下面的連結,點選新建金鑰即可:
https://console.cloud.tencent.com/cam/capi
https://console.cloud.tencent.com/ci/bucket 5)pip一下:
pip3 install qcloud_image
複製程式碼
3.3 初體驗
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條免費,騰訊跟阿里相對的,就少很對;
不過不得不說,百度的對於中文處理的太好了,基本都能識別到;
問題
既然是百度,對於空心的驗證碼,依然束手無策;
而且這還是收費平臺,難道就沒法解決嗎?
謝謝大家~