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