华为云文档地址:
https://support.huaweicloud.com/productdesc-moderation/moderation_01_0002.html
获取token和内容审核,代码示例:
import base64
import json
import requests
from loguru import logger
def encode_to_base64(filename):
"""
图片文件转base64编码
:param filename:
:return:
"""
imgstr = ""
with open(filename, 'rb') as file:
imgstr = base64.b64encode(file.read())
return imgstr
def get_token():
"""
获取token
"""
username = 'xxxxxx' # 用户名
password = 'xxxxxx' # 密码
domain = 'xxxxxx' # 华为账号 account_name
region_name = 'cn-north-1' # 区域 例如: cn-north-1
X_TOKEN = None
auth_data = {
"auth": {
"identity": {
"password": {
"user": {
"name": username,
"password": password,
"domain": {
"name": domain
}
}
},
"methods": [
"password"
]
},
"scope": {
"project": {
"name": region_name
}
}
}
}
_url = 'https://iam.myhuaweicloud.com/v3/auth/tokens'
headers = {'Content-Type': 'application/json'}
resp = requests.post(url=_url, headers=headers, data=json.dumps(auth_data))
logger.info(f"resp = {resp}")
status_code = resp.status_code
logger.info(f"-- get_token - resp.status_code = {resp.status_code}")
logger.info(f"-- get_token - resp.json() = {resp.json()}")
try:
X_TOKEN = resp.headers['X-Subject-Token']
except:
X_TOKEN = None
return status_code, X_TOKEN
def moderation_image(token, image, url):
"""
图片审核
:param token: token
:param image: 图片base64
:param url: 图片地址
检测场景:
politics:是否涉及政治人物的检测。
terrorism:是否包含涉政暴恐元素的检测。
porn:是否包含涉黄内容元素的检测。
ad:是否包含广告图文的检测。
"""
_url = 'https://moderation.cn-north-4.myhuaweicloud.com/v1.0/moderation/image'
categories = ['porn', 'politics', 'terrorism',
# 'ad'
]
threshold = None
moderation_rule = "default"
contents = None
if image:
image = image.decode("utf-8")
_data = {
"image": image,
"url": url,
"categories": categories,
"threshold": threshold,
"moderation_rule": moderation_rule
}
_headers = {
"Content-Type": "application/json",
"X-Auth-Token": token
}
data = bytes(json.dumps(_data), 'utf8')
resp = requests.post(url=_url, headers=_headers, data=data)
logger.info(f"resp = {resp}")
status_code = resp.status_code
logger.info(f"-- moderation_image - resp.status_code = {resp.status_code}")
logger.info(f"-- moderation_image - resp.json() = {resp.json()}")
contents = resp.json()
return status_code, contents
def deal_moderation_image_resp(contents):
"""
处理图片审核接口响应结果
:return:
"""
# result 调用失败时无此字段。
if 'result' not in contents:
return False, "图片审核接口调用失败"
logger.info(f"contents = {json.dumps(contents, indent=4)}")
result_info = contents['result']
# 审核结果是否通过 - block:包含敏感信息,不通过 pass:不包含敏感信息,通过 review:需要人工复检
suggestion_result = result_info['suggestion']
if suggestion_result == 'pass':
return True, '审核通过'
else:
check_result_str = ''
# 具体每个场景的检测结果 block:包含敏感信息,不通过 pass:不包含敏感信息,通过 review:需要人工复检
category_suggestions_info = result_info['category_suggestions']
politics_result = category_suggestions_info.get('politics', None) # politics:是否涉及政治人物的检测。
# ad_result = category_suggestions_info.get('ad', None) # ad:是否包含广告图文的检测。
terrorism_result = category_suggestions_info.get('terrorism', None) # terrorism:是否包含涉政暴恐元素的检测。
porn_result = category_suggestions_info.get('porn', None) # porn:是否包含涉黄内容元素的检测。
if politics_result and politics_result != 'pass':
if politics_result == 'block':
check_result_str += '涉政'
if politics_result == 'review':
check_result_str += '疑似涉政'
if terrorism_result and terrorism_result != 'pass':
if terrorism_result == 'block':
check_result_str = f"{check_result_str};涉暴" if check_result_str else f"{check_result_str}涉暴"
if terrorism_result == 'review':
check_result_str = f"{check_result_str};疑似涉暴" if check_result_str else f"{check_result_str}疑似涉暴"
if porn_result and porn_result != 'pass':
if porn_result == 'block':
check_result_str = f"{check_result_str};涉黄" if check_result_str else f"{check_result_str}涉黄"
if porn_result == 'review':
check_result_str = f"{check_result_str};疑似涉黄" if check_result_str else f"{check_result_str}疑似涉黄"
# 广告不检测 pass
return False, check_result_str
if __name__ == '__main__':
# TODO Token有效期为24小时,可以建立token缓存机制,或者存mongo也可以
# 测试图片url
# demo_data_url = 'https://sdk-obs-source-save.obs.cn-north-4.myhuaweicloud.com/terrorism.jpg' # 正常
demo_data_url = 'https://img0.baidu.com/it/u=2147892510,3124659829&fm=26&fmt=auto&gp=0.jpg' # 毛主席
# 泳装动漫
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.tuwandata.com%2Fv2%2Fthumb%2Fall%2FNjI3ZCw4MDEsMjAwLDQsMywxLC0xLDEs%2Fu%2Fimg.tuwan.com%2Fstatic%2Fdefault%2F201409%2F1-1409130933545.jpg&refer=http%3A%2F%2Fimg.tuwandata.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365708&t=3772ef952ebea91dc83a57bdfd90bc09'
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.81.cn%2Fjfjbmap%2Fattachment%2F1%2F1%2F2018-01%2F28%2F08%2Fres01_attpic_brief.jpg&refer=http%3A%2F%2Fwww.81.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365650&t=f53988db9c324dfb6bb383c546051e06' # 毛主席端起枪
# 真人
# demo_data_url = 'https://img1.baidu.com/it/u=4210503503,1536203928&fm=26&fmt=auto&gp=0.jpg'
# 希特勒
# demo_data_url = 'https://img1.baidu.com/it/u=671407126,81369699&fm=26&fmt=auto&gp=0.jpg'
# 习和希
# demo_data_url = 'http://resource.shenshangtech.com/temp/1.jpeg'
# 习
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimages.china.cn%2Fattachement%2Fjpg%2Fsite1000%2F20150818%2Fd02788e9b72d173d38e730.jpg&refer=http%3A%2F%2Fimages.china.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629366083&t=0c2b935f9987f8700d782f695dcd0ada'
# 枪
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp2.itc.cn%2Fq_70%2Fimages03%2F20200606%2F64fd5c3334b048d38f12cf26cbbf19cf.jpeg&refer=http%3A%2F%2Fp2.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365975&t=795fd26e6578f9b10ddcdcdb59d63c3c'
# 刀
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fnimg.ws.126.net%2F%3Furl%3Dhttp%253A%252F%252Fdingyue.ws.126.net%252F2021%252F0720%252F9dd57b73j00qwj46t000sc000u000k0c.jpg%26thumbnail%3D650x2147483647%26quality%3D80%26type%3Djpg&refer=http%3A%2F%2Fnimg.ws.126.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365928&t=f1f02b52410dd61da63ceb8fb2be10cc'
# 真人
# demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fvsd-picture.cdn.bcebos.com%2F43b738b388231566891ba4df80a64b5b7c3c553d.jpg&refer=http%3A%2F%2Fvsd-picture.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365867&t=cefaab87cd21b3ddbe0686cafae808f0'
# 获取token
status_code, token = get_token()
logger.info(f"图片审核获取token | status_code = {status_code} | token = {token}")
# 读取图片文件base64进行图片审核
# result = moderation_image(token, encode_to_base64('./temp.png'), url=None,
# categories=['porn', 'politics', 'terrorism', 'ad'],
# threshold=None, moderation_rule="default")
# 通过image_url审核图片
status_code, contents = moderation_image(token, image="", url=demo_data_url)
logger.info(f"图片审核接口 | status_code = {status_code} | contents = {type(contents)} | {contents}")
# contents = {
# "result": {
# "suggestion": "block",
# "category_suggestions": {
# "politics": "block",
# "terrorism": "review",
# "porn": "block"
# }
# }
# }
# 处理图片审核接口响应结果
result = deal_moderation_image_resp(contents)
logger.info(f"审核结果: {result}")