利用的API 首先查看下接口文档
一、首先是python2.7版本代码
#encoding=utf-8
import requests
import time
import string
import random
import base64
import hashlib
import urllib
from urllib import urlencode
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
CommonUrl="https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
app_id="填自己的"
AppKey="填自己的"
time_stamp=int(time.time())
nonce_str=''.join(random.sample(string.ascii_letters + string.digits, 15))
def MakeSign():
Dict ={'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'image': ImageBase64()}
T_str1 = ""
for key in sorted(Dict.keys()):
if key == 'app_key':
continue
T_str1 = T_str1 + "%s=%s&" % (key, urllib.quote(str(Dict[key]), safe=''))
T_sgin = T_str1 + 'app_key=' + AppKey
signraw=T_sgin.encode("utf-8")
hash_md5 = hashlib.md5()
hash_md5.update(signraw)
sign=hash_md5.hexdigest().upper()
return sign
def ImageBase64():
imagebase64=None
try:
with open("C:\\Users\\Administrator\\Desktop\\xiejiangpeng.pn1g", "rb") as f:
imagebase64 = base64.b64encode(f.read())
except Exception as ex:
print(ex)
exit()
return imagebase64
sign=MakeSign()#签名
image=ImageBase64()#图片
#调用OCR图片识别接口
TengXunAiCommonBody={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'sign':sign,'image':image}
TengXunAiCommon=requests.post(CommonUrl,TengXunAiCommonBody,verify=False)
try:
temp=TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"]#标志符。用于判断异常
print("识别出来的文字如下:")
for i in range(0,len(TengXunAiCommon.json()["data"]["item_list"])):
print(TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"])
except Exception:
print("程序异常.....")
print(TengXunAiCommon.json()["msg"])
运行结果 :
图片信息
接口抓包记录
程序控制台输出:
二、python3.6代码
相对于python2.7 此版本区别有以下几个点
1.对字符串进行url编码的时候
在 Python2.x 中的用法是:
urllib.quote(text)
Python3.x 中是
urllib.parse import urlencode
from urllib import parse
urllib.parse.quote(text)
2.python3.x对image进行base64编码之后 是byte的类型 需要decode转化成str 否则参加拼接字符串会多一个b' 导致签名错误
3.注意url编码后 只会将特殊符号的变成大写 比如B%27 其他的不需要变成大写字符串
4. 字节转化到str需要decode 而str到byte需要encode 在python3.6的时候 md5加密 如果输入str类型的会报错 只能填byte格式的 也就是需要encode()的原因
5.另外可以直接对dict进行url编码 (默认情况下 就是对value进行url编码 符合此次的情况)使用Urlencode(Dict).encode()
urlencode(Dict).encode()首先urlencode 得到一个str 之后在encode转化成byte 从而进行md5加密 这种方式比较简单 而python2.7中 使用的是对单个str进行url编码 这里是对dict直接进行urlencode
#encoding=utf-8
import requests
import time
import string
import random
import base64
import hashlib
#这些是urlencode
from urllib.parse import urlencode
from urllib import parse
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import urllib
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
CommonUrl="https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
app_id="填自己的"
AppKey="填自己的"
time_stamp=int(time.time())
nonce_str=''.join(random.sample(string.ascii_letters + string.digits, 15))
T_str1=""
def MakeSign():
Dict={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'image':ImageBase64()}
#global T_str1
# for key in sorted(Dict.keys()):#其中sorted是按照key的升序进行循环
# if key == 'app_key':
# continue
# #累加除了app_key之外的键与值拼接成url 格式)
# T_str1 = T_str1+ "%s=%s&" % (key, urllib.parse.quote(str(Dict[key]), safe=''))
# signStr=T_str1+'app_key'+"="+AppKey
# signraw=signStr.encode("utf-8")
# Md5 = hashlib.md5()
# Md5.update(signraw)
# sign = Md5.hexdigest().upper()
# print(sign)
"""方法二 python3.x(imagebase64之后生成的是byte而不是str) 同时直接对dict进行url中value进行编码 """
Dict = sorted(Dict.items(), key=lambda item: item[0], reverse=False)
Dict.append(('app_key', AppKey))
sha = hashlib.md5()
rawtext = urlencode(Dict).encode("utf-8")
sha.update(rawtext)
sign = sha.hexdigest().upper()
return sign
def ImageBase64():
imagebase64=None
try:
with open("C:\\Users\\xjp\\Desktop\\xiejiangpeng.png", "rb") as f:
imagebase64 = base64.b64encode(f.read()).decode("utf-8")#需要decode否则是byte的类型
except Exception as ex:
print(ex)
exit()
return imagebase64
sign=MakeSign()
image=ImageBase64()
TengXunAiCommonBody={'app_id':app_id,'time_stamp':time_stamp,'nonce_str':nonce_str,'sign':sign,'image':image}
TengXunAiCommon=requests.post(CommonUrl,TengXunAiCommonBody,verify=False)
try:
temp=TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"]#标志符。用于判断异常
print("识别出来的文字如下:")
for i in range(0,len(TengXunAiCommon.json()["data"]["item_list"])):
print(TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"])
except Exception:
print("程序异常.....")
print(TengXunAiCommon.json()["msg"])
识别的图片和运行的结果如下
好了介绍了那么多,上面的只是如何创建接口,接下下面是我引用的一个小例子 识别图形验证码
思想如下
1.获取图形验证码接口,得到返回的Image,之后获取到图片的src地址
2.保存到本地
3.调用腾讯Api进行识别。
4.识别的结果 复制给一个参数,之后这个参数就是我们发送验证码的请求参数了
代码如下(python3.6)
#encoding=utf-8
import requests
import urllib
import string
import random
import base64
import hashlib
import time
#这些是urlencode
from urllib.parse import urlencode
from urllib import parse
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def GetCode(Address):
print("正在调取APi开始识别图片验证码...")
CommonUrl = "https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr"
app_id = "填自己的"
AppKey = "填自己的"
time_stamp = int(time.time())
nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 15))
T_str1 = ""
Code=""
def MakeSign():
Dict = {'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'image': ImageBase64()}
"""python3.x(imagebase64之后生成的是byte而不是str) 同时直接对dict进行url中value进行编码 """
Dict = sorted(Dict.items(), key=lambda item: item[0], reverse=False)
Dict.append(('app_key', AppKey))
sha = hashlib.md5()
rawtext = urlencode(Dict).encode("utf-8")
sha.update(rawtext)
sign = sha.hexdigest().upper()
return sign
def ImageBase64():
imagebase64 = None
try:
with open(Address, "rb") as f:
imagebase64 = base64.b64encode(f.read()).decode("utf-8") # 需要decode否则是byte的类型
except Exception as ex:
print(ex)
exit()
return imagebase64
sign = MakeSign()
image = ImageBase64()
TengXunAiCommonBody = {'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'sign': sign,
'image': image}
TengXunAiCommon = requests.post(CommonUrl, TengXunAiCommonBody, verify=False)
try:
temp = TengXunAiCommon.json()["data"]["item_list"][0]["itemstring"] # 标志符。用于判断异常
for i in range(0, len(TengXunAiCommon.json()["data"]["item_list"])):
Code=Code + TengXunAiCommon.json()["data"]["item_list"][i]["itemstring"]
if(len(Code)!=4):
print("图片模糊识别出错,程序已退出,保存后的图片地址为:",Address)
exit()
else:
print("识别出来的验证码为:", Code)
return Code
except Exception as AA:
print("程序异常.....")
print(TengXunAiCommon.json()["msg"])
print(AA)
exit()
#config
host="https://xxxx.xxxx.com/"
#1.图形验证码更换接口
Cookie={'grwng_uid': '4b395a4c-cf01-4606-97e0-dc0ad02a7251', 'BS00002_gr_last_sent_cs1': 'BS00002-160', 'BS00002_gr_cs1': 'BS00002-160', 'gr_user_id': '354ca742-c823-4ec4-b449-25e30d6916c9', 'PHPSEGSUPER': '9r0ehinkshmto53hngm0flvp73'}
RGetUrl=requests.get(host+"wapv3/view/captcha?refresh=1",cookies=Cookie,verify=False)
ImageRoute=RGetUrl.json()["url"]
ImageSrc=host+ImageRoute#得到图片地址
#python3中使用方式如果是Python2则urllib.urlretrieve,如果同名默认会将源文件替换
urllib.request.urlretrieve(ImageSrc,'C:/Users/xjp/Desktop/xiejiangpeng.jpg')#将图片保存到本地
ImageCode=GetCode("C:/Users/xjp/Desktop/xiejiangpeng.jpg")#调用API识别验证码
好了最后我们得到的ImageCode也就是图形验证码值了,之后你就可以引用了
附带程序运行结果图一张