2018-06-13 python使用腾讯的人脸分析api
2018-06-13 本文已影响0人
ifqu
# -*- coding: utf-8 -*-
import hashlib
import time
import random
import string
import requests
import base64
import requests
import cv2
import numpy as np
from urllib.parse import urlencode
import json #用于post后得到的字符串到字典的转换
app_id = '1106891759'
app_key = 'z1BoKczrUMtsWyMC'
'''
腾讯openai鉴权签名计算步骤:(摘抄自官网)
用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤。
1 将<key, value>请求参数对按key进行字典升序排序,得到有序的参数对列表N
2 将列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),URL键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8,而不是小写%e8
3 将应用密钥以app_key为键名,组成URL键值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=密钥)
4 对字符串S进行MD5运算,将得到的MD5值所有字符转换成大写,得到接口请求签名
'''
def get_params(img): #鉴权计算并返回请求参数
#请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效
time_stamp=str(int(time.time()))
#请求随机字符串,用于保证签名不可预测,16代表16位
nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 16))
params = {'app_id':app_id, #请求包,需要根据不同的任务修改,基本相同
'image':img, #文字类的任务可能是‘text’,由主函数传递进来
'mode':'0' , #身份证件类可能是'card_type'
'time_stamp':time_stamp, #时间戳,都一样
'nonce_str':nonce_str, #随机字符串,都一样
#'sign':'' #签名不参与鉴权计算,只是列出来示意
}
sort_dict= sorted(params.items(), key=lambda item:item[0], reverse = False) #字典排序
sort_dict.append(('app_key',app_key)) #尾部添加appkey
rawtext= urlencode(sort_dict).encode() #urlencod编码
sha = hashlib.md5()
sha.update(rawtext)
md5text= sha.hexdigest().upper() #MD5加密计算
params['sign']=md5text #将签名赋值到sign
return params #返回请求包
def main():
'''
#用python系统读取方法
f = open('c:/girl.jpg','rb')
img = base64.b64encode(f.read()) #得到API可以识别的字符串
'''
#用opencv读入图片
frame=cv2.imread('/Users/fuqi/Downloads/Douyin-Bot-master/autojump.png')
nparry_encode = cv2.imencode('.jpg', frame)[1]
data_encode = np.array(nparry_encode)
img = base64.b64encode(data_encode) #得到API可以识别的字符串
params = get_params(img) #获取鉴权签名并获取请求参数
url = "https://api.ai.qq.com/fcgi-bin/face/face_detectface" # 人脸分析
res = requests.post(url,params).json()
print(res['data']['face_list'][0]['beauty'])
if __name__ == '__main__':
main()