原本,计划这篇是讲讲怎么获取生成验证码的源码来反向获取验证码的,毕竟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条免费,腾讯跟阿里相对的,就少很对;
不过不得不说,百度的对于中文处理的太好了,基本都能识别到;
既然是百度,对于空心的验证码,依然一筹莫展;
并且这仍是收费平台,难道就无法解决吗?
谢谢你们~