一、案例背景:
有很多做电商的朋友在活动期间会频繁更换商品主图、活动图等,但是在上传图片之前又需要进行图片的审核,看是否有一些违规的地方,正常情况下都是根据人眼去人为的判断是否违规,这种方式在大量图片的情况下直接就会瓦掉,太浪费时间,那基于这种情况下,看了下科大讯飞的接口正好有这样的功能(当然别的平台大概率也是有这种接口的,例如百度云,但是科大讯飞这两年不是挺名声躁动嘛hhhh 所以拿出来玩玩~)
二、接口文档:
基于深度学习的图片检测技术,精准高效识别各类场景中违禁、涉政、色情、未成年违规、暴恐、广告、Logo水印等风险图片内容。
https://www.xfyun.cn/doc/nlp/ImageModeration/API.html#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E
三、科大讯飞控制台
Q1:为什么要放科大讯飞控制台?
A1:调用科大讯飞接口需要创建对应的应用,然后在应用里面找打对应的接口信息,拿到对应的APPID、APISecret、APIKey
Q2:是否需要充钱呢?
A2:首次新用户注册会送200张免费的,用完以后需要充¥~~ (市面上其他的接口基本上都是一样的,免费的消耗完,需要额外冲米)
①:控制台网址: https://console.xfyun.cn/app/myapp
②:新建应用:
②:点击到新建的应用,拿到关键信息:
③:点击购买服务量,第一次可以免费领200张
三、完整代码:
import string
import random
from urllib.parse import urlencode
import hmac
import hashlib
import base64
import datetime
from datetime import datetime
import requests
ss = requests.session()
class Image_select():
def __init__(self):
self.url = 'https://audit.iflyaisol.com/audit/v2/image'
self.APPID = 'xxxx' # 改成你的控制台里面的APPID
self.APISecret = 'xxxx' # 改成你的控制台里面的APISecret
self.APIKey = 'xxxxx' # 改成你的控制台里面的APIKey
self.current_time = datetime.utcnow()
self.formatted_time = self.current_time.strftime("%Y-%m-%dT%H:%M:%S+0000")
self.uuid = ''.join(random.sample(string.ascii_letters + string.digits, 32))
# 1、鉴权参数
def sign_param(self):
data_dict = {
"appId": self.APPID,
"accessKeyId": self.APIKey,
"accessKeySecret": self.APISecret,
"utc": self.formatted_time,
"uuid": self.uuid,
"modeType": "base64"
}
# 参数字典倒排序为列表
params_list = sorted(data_dict.items(), key=lambda x: x[0], reverse=False)
# 还原字典
params_str_dict = dict(params_list)
# 然后urlencode
params_str_urlencode = urlencode(params_str_dict)
return params_str_dict, params_str_urlencode
# 2、鉴权获取
def get_sign(self):
params_str_dict, params_str_urlencode = self.sign_param()
# 进行HMAC运算算法
# 将 baseString 转换为 bytes 类型
params_str_urlencode_new = bytes(params_str_urlencode, 'utf-8')
# 将 accessKeySecret 转换为 bytes 类型
accessKeySecret = bytes(self.APISecret, 'utf-8')
# 使用 HmacSHA1 算法生成签名
baseString = hmac.new(accessKeySecret, params_str_urlencode_new, hashlib.sha1).digest()
# 得到signature
signature = base64.b64encode(baseString).decode(encoding='utf-8')
# url参数加上signature
params_str_dict["signature"] = signature
# 将params_str_dict转换为str,并且将里面的:替换为=号,并且剔除空格
params_str = str(params_str_dict).replace(':', '=').replace(' ', '').replace("'", '')
return params_str, params_str_dict
# 3、获取请求结果
def get_data(self, file_path):
param_str, params_str_dict = self.get_sign()
param_str_url = urlencode(params_str_dict)
# 1.拼接url地址:
url = self.url + '?' + param_str_url
header = {'Content-Type': 'application/json;charset=UTF-8'}
print(url)
with open(file_path, 'rb') as image_file:
encoded_string = base64.b64encode(image_file.read())
data_number = {
'content': encoded_string.decode('utf-8')
}
res = ss.request(method='POST', url=url, headers=header, json=data_number).json()
res = res['data']['result']['detail']['category_list']
if res:
return res
else:
return '没有不合格的地方'
if __name__ == '__main__':
spider = Image_select()
print(spider.get_data(r'xxxxxxx')) # 双引号内改成你的本地路径图片
代码参数解释:
self.APPID = 'xxxx' # 改成你的控制台里面的APPID self.APISecret = 'xxxx' # 改成你的控制台里面的APISecret self.APIKey = 'xxxxx' # 改成你的控制台里面的APIKey
spider.get_data(r'xxxxxxx') # 双引号内改成你的本地路径图片
四、注意点
因为这个上边的这个接口我是用的第二种方式,传入本地图片,所以本地的图片base64最大5M,通过URL外链的图片最大20M,然后图片格式支持PNG、JPG、JPEG、BMP、GIF、WEBP格式
五、扩展点:
我上边的这个接口方式是使用的本地图片,科大讯飞接口提供另外一种方式,直接使用URL外链(即网络图片地址,不需要上传服务器,就是前端网页中的那种src属性对应的值),想要实现这种方式也很简单,只需要改动一个参数,这个问题留给大家~~~