最近github上wangshub的抖音机器人很火,参考了下代码。把人脸识别的部分拿出来做个备份,感觉挺有意思的。
准备在自己的blog上搭个人脸识别demo。
import hashlib
import urllib
from urllib import parse
import urllib.request
import base64
import json
import time
url_preffix='https://api.ai.qq.com/fcgi-bin/'
def setParams(array, key, value): #字典构成函数
array[key] = value
def genSignString(parser):
'''
进行腾讯ai接口鉴权签名生成
对各个参数格式处理及md5运算,并把所有字母转换为大写
'''
uri_str = ''
for key in sorted(parser.keys()):
if key == 'app_key':
continue
uri_str += "%s=%s&" % (key, parse.quote(str(parser[key]), safe=''))
sign_str = uri_str + 'app_key=' + parser['app_key']
hash_md5 = hashlib.md5(sign_str.encode('utf-8'))
return hash_md5.hexdigest().upper()
class AiPlat(object):
def __init__(self,app_id = '申请到的ID',app_key = '申请到的KEY'):
self.app_id = app_id
self.app_key = app_key
self.data = {}
self.url_data = ''
def invoke(self, params):
self.url_data = urllib.parse.urlencode(params).encode("utf-8") #将字典编码为url查询字符串
req = urllib.request.Request(self.url, self.url_data) #构建ai请求
try:
rsp = urllib.request.urlopen(req) #请求ai,返回结果储存在rsp中
str_rsp = rsp.read() #读出rsp内容,储存在str_rsp中
dict_rsp = json.loads(str_rsp) #将内容解析为json格式,方便后续使用
return dict_rsp
except Exception as e:
print(e)
return {'ret': -1}
def face_detectface(self, image, mode):
self.url = url_preffix + 'face/face_detectface'
setParams(self.data, 'app_id', self.app_id) #在self.data字典中构建app_id
setParams(self.data, 'app_key', self.app_key) #在self.data字典中构建app_key
setParams(self.data, 'mode', mode) #在self.data字典中构建mode
setParams(self.data, 'time_stamp', int(time.time())) #在self.data字典中构建time_stamp
setParams(self.data, 'nonce_str', int(time.time())) #在self.data字典中构建nonce_str
image_data = base64.b64encode(image) #对图片进行解码
setParams(self.data, 'image', image_data.decode("utf-8")) #将解码后的图片数据按utf-8编码,构建image
sign_str = genSignString(self.data) #根据self.data数据算出hash(MD5)值
setParams(self.data, 'sign', sign_str) #根据算出的hash值,构建sign
return self.invoke(self.data) #调用self.invoke函数处理self.data,并返回结果
ai_obj = AiPlat() #初始化AI接口
with open('1.jpg', 'rb') as bin_data: #打开处理好的截图
image_data = bin_data.read() #将数据存入image_data中
rsp = ai_obj.face_detectface(image_data, 0) #将截图传给AI,rsp为AI分析后的数据,字典结构
print(rsp)