Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
0a681977
unidocs-zh
项目概览
DCloud
/
unidocs-zh
通知
3597
Star
108
Fork
921
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
120
列表
看板
标记
里程碑
合并请求
109
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
120
Issue
120
列表
看板
标记
里程碑
合并请求
109
合并请求
109
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
0a681977
编写于
4月 24, 2023
作者:
VK1688
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Create uni-sec-check.md
上级
9b002c33
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
290 addition
and
0 deletion
+290
-0
docs/uniCloud/uni-sec-check.md
docs/uniCloud/uni-sec-check.md
+290
-0
未找到文件。
docs/uniCloud/uni-sec-check.md
0 → 100644
浏览文件 @
0a681977
## uni-sec-check 公共模块
`uni-sec-check`
是一个开源公共模块,用于帮助开发者进行内容安全检测,包括图片鉴黄和文字违规检测。在各种需要用户上传图片或录入文字到数据库的场景中,内容安全检测是非常必要的。通过使用该模块,您可以有效降低内容违规风险。”
本模块设计了provider概念,计划集成多家提供内容安全服务的供应商。
目前支持的provider:
1.
mp-weixin(免费,微信小程序官方提供)
> 即目前只有微信内容安全检测一个provider
::: warning 注意
uni-sec-check公共模块仅能在云函数/云对象内使用。如果您不了解公共模块,请
[
参阅
](
cf-common.md
)
本插件依赖uni-open-bridge-common,且版本需≥1.1.2
:::
> 插件市场地址:[https://ext.dcloud.net.cn/plugin?name=uni-sec-check](https://ext.dcloud.net.cn/plugin?name=uni-sec-check)
## 使用前必看
由于微信小程序官方宣布于2021年9月1日停止更新V1版本,以至于V1版本的违规检测能力已经非常弱,几乎无用。
为了解决这个问题,
`uni-sec-check`
已经升级到微信V2版本(同样免费),提供更强大的违规检测能力。然而,升级到V2版本也带来了一些问题,具体如下:
1.
V2版本必须传递微信小程序用户的openid,且用户需要在近两小时内访问过小程序。因此,V2版本只适用于微信小程序,其他端无法正常使用。
2.
V2版本新增了一个scene参数,scene的取值不同,最终的检测结果也不同。因此,为了获得更好的检测结果,您需要传递合适的scene值。
3.
与之前的版本不同,V2版本检测图片不会实时返回结果,而是需要等待5-30分钟后异步回调返回结果。如果您需要更多信息,请参考
[
微信检测结果异步通知示例
](
#微信检测结果异步通知示例
)
## 配置@config
`uni-sec-check`
自身没有配置文件,Ta依赖
`uni-open-bridge`
的配置
[
点击查看uni-open-bridge配置
](
https://uniapp.dcloud.net.cn/uniCloud/uni-open-bridge.html#uni-open-bridge%E7%9A%84%E4%BD%BF%E7%94%A8%E6%B5%81%E7%A8%8B
)
## API@api
### 检测文本@textSecCheck
**用法**
```
js
// 引入uni-sec-check公共模块
const
UniSecCheck
=
require
(
'
uni-sec-check
'
);
// 初始化实例
const
uniSecCheck
=
new
UniSecCheck
({
provider
:
'
mp-weixin
'
,
requestId
:
this
.
getUniCloudRequestId
(),
// 云函数内则写 context.requestId 云对象内则写 this.getUniCloudRequestId()
});
const
checkRes
=
await
uniSecCheck
.
textSecCheck
({
content
:
''
,
// 文本内容,不可超过500KB
openid
:
''
,
// 用户的小程序openid
scene
:
2
,
// 场景值
version
:
2
,
// 固定为2
});
console
.
log
(
'
checkRes:
'
,
checkRes
);
```
**请求参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|content|String |是 |文本内容,不可超过500KB |
|openid |String |否 |用户的小程序openid(用户需在近两小时访问过小程序) version=2时必填 |
|scene |Number |否 |场景值(1 资料;2 评论;3 论坛;4 社交日志) |
|version|Number |是 |接口版本号固定为2 |
**返回参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|errCode|String |是 |错误码,见下方错误码说明 |
|errMsg |String |是 |错误信息 |
|result |Object |是 |检测结果 |
**result说明**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|suggest|String |是 |建议;pass:通过,review:疑似,risky:有风险 |
|label |String |是 |分类信息;广告,时政,色情,辱骂,违法犯罪,欺诈,低俗,版权,其他 |
### 检测图片@imgSecCheck
**用法**
```
js
// 引入uni-sec-check公共模块
const
UniSecCheck
=
require
(
'
uni-sec-check
'
);
// 初始化实例
const
uniSecCheck
=
new
UniSecCheck
({
provider
:
'
mp-weixin
'
,
requestId
:
this
.
getUniCloudRequestId
(),
// 云函数内则写 context.requestId 云对象内则写 this.getUniCloudRequestId()
});
const
checkRes
=
await
uniSecCheck
.
imgSecCheck
({
image
:
''
,
// 图片文件url或图片cloudID
openid
:
''
,
// 用户的openid
scene
:
2
,
// 场景值
version
:
2
// 接口版本号
});
console
.
log
(
'
checkRes:
'
,
checkRes
);
```
**请求参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|image |String |是 |图片url或图片对应的cloudID |
|openid |String |否 |用户的openid(用户需在近两小时访问过小程序)version=2时必填|
|scene |Number |否 |场景值(1 资料;2 评论;3 论坛;4 社交日志) |
|version|Number |是 |接口版本号可选1或2,但1的检测能力很弱 |
**返回参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|errCode|String |是 |错误码,见下方错误码说明 |
|errMsg |String |是 |错误信息 |
|traceId|String |是 |唯一请求标识,标记单次请求,用于匹配异步推送结果 |
**注意**
-
V2的检测结果是异步返回的,需要提前在微信公众平台「开发」-「开发设置」-「消息推送」开启消息服务,检测结果在 30 分钟内会推送到你的消息接收服务器。
### 检测音频@avSecCheck
**用法**
```
js
// 引入uni-sec-check公共模块
const
UniSecCheck
=
require
(
'
uni-sec-check
'
);
// 初始化实例
const
uniSecCheck
=
new
UniSecCheck
({
provider
:
'
mp-weixin
'
,
requestId
:
this
.
getUniCloudRequestId
(),
// 云函数内则写 context.requestId 云对象内则写 this.getUniCloudRequestId()
});
const
checkRes
=
await
uniSecCheck
.
avSecCheck
({
mediaUrl
:
''
,
// 音频文件url
openid
:
''
,
// 用户的openid
scene
:
2
,
// 场景值
version
:
2
,
// 固定为2
});
console
.
log
(
'
checkRes:
'
,
checkRes
);
```
**请求参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|mediaUrl |String |是 |音频文件url;格式支持:mp3, aac, ac3, wma, flac, vorbis, opus, wav |
|openid |String |是 |用户的小程序openid(用户需在近两小时访问过小程序) |
|scene |Number |否 |场景值(1 资料;2 评论;3 论坛;4 社交日志) |
|version |Number |是 |接口版本号固定为2 |
**返回参数**
|名称 |类型 |必填 |说明 |
|-- |-- |-- |-- |
|errCode|String |是 |错误码,见下方错误码说明 |
|errMsg |String |是 |错误信息 |
|traceId|String |是 |唯一请求标识,标记单次请求,用于匹配异步推送结果 |
## 微信检测结果异步通知示例
在微信公众平台「开发」-「开发设置」-「消息推送」中,启用消息服务,提前保存好
`EncodingAESKey`
与
`token`
等信息。(此处不涉及微信验证服务器,请自行参考微信文档)
新建云函数(需开启云函数URL化)用于接收微信服务器通知消息,示例代码如下(代码仅供参考,未处理异常):
```
js
const
crypto
=
require
(
'
crypto
'
)
function
getSignature
(
token
,
timestamp
,
nonce
,
msgEncrypt
)
{
const
str
=
[
token
,
timestamp
,
nonce
,
msgEncrypt
].
sort
().
join
(
''
)
return
crypto
.
createHash
(
'
sha1
'
).
update
(
str
).
digest
(
"
hex
"
)
}
function
PKCS7Decode
(
buf
)
{
let
padSize
=
buf
[
buf
.
length
-
1
]
return
buf
.
slice
(
0
,
buf
.
length
-
padSize
)
}
function
decryptMsg
(
encodingAESKey
,
msgEncrypt
)
{
const
key
=
Buffer
.
from
(
encodingAESKey
+
'
=
'
,
'
base64
'
)
const
iv
=
key
.
slice
(
0
,
16
)
const
decipher
=
crypto
.
createDecipheriv
(
'
aes-256-cbc
'
,
key
,
iv
)
decipher
.
setAutoPadding
(
false
)
let
deciphered
=
Buffer
.
concat
([
decipher
.
update
(
msgEncrypt
,
'
base64
'
),
decipher
.
final
()])
deciphered
=
PKCS7Decode
(
deciphered
)
const
content
=
deciphered
.
slice
(
16
)
const
length
=
content
.
slice
(
0
,
4
).
readUInt32BE
(
0
)
return
{
message
:
JSON
.
parse
(
content
.
slice
(
4
,
length
+
4
).
toString
()),
appId
:
content
.
slice
(
length
+
4
).
toString
()
}
}
module
.
exports
=
function
(
event
,
context
)
{
const
{
msg_signature
:
msgSignature
}
=
event
.
queryStringParameters
const
body
=
JSON
.
parse
(
event
.
body
)
let
result
=
body
// 消息解密
if
(
body
.
Encrypt
)
{
const
signature
=
getSignature
(
'
your token
'
,
'
1666095834
'
,
'
43829373
'
,
body
.
Encrypt
)
if
(
signature
!==
msgSignature
)
{
return
'
signature error
'
}
const
decrypt
=
decryptMsg
(
'
your encodingAESKey
'
,
body
.
Encrypt
)
result
=
decrypt
.
message
}
// 只接收内容安全事件通知
if
(
result
.
Event
!==
'
wxa_media_check
'
)
{
return
'
success
'
}
if
(
result
.
result
.
suggest
!==
'
pass
'
)
{
// 执行删除操作
}
}
```
## 1.x升级2.x指南
由于依赖了
`uni-open-bridge`
,2.0版本不会向下兼容,请按照以下步骤升级:
步骤一:在
`uni-config-center`
中创建配置文件
为了升级到
`uni-sec-check`
的V2版本,您需要在
`uni-config-center`
中创建
`uni-id`
目录,并创建
`config.json`
配置文件。如果该文件已经存在,请忽略此步骤。
配置文件的路径为
`uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json`
。
步骤二:更新内容安全检测模块代码
创建内容安全检测模块实例
`UniSecCheck`
增加必传参数
`requestId`
,示例如下
旧
```
js
const
uniSecCheck
=
new
UniSecCheck
({
// 创建内容安全检测模块实例
provider
:
'
mp-weixin
'
,
// 指定所使用服务的提供商,目前仅支持mp-weixin
// customGetAccessToken: async function() { // 自定义的获取accessToken方法,见下方关于customGetAccessToken的说明
// return {
// accessToken: '',
// expired: 1624537278552
// }
// },
// onlyUseCachedAccessToken, // 仅使用缓存在数据库的accessToken,用于在uniCloud内使用其他服务获取accessToken,且缓存在了云数据库的场景,默认false
// refreshAccessTokenThreshold, // token有效期剩余少于多少毫秒时开始刷新,默认300000毫秒
// abandonAccessTokenThreshold // token有效期剩余少于多少毫秒时舍弃不用,默认5000毫秒
}
})
```
新
```
js
const
uniSecCheck
=
new
UniSecCheck
({
// 创建内容安全检测模块实例
provider
:
'
mp-weixin
'
,
// 指定所使用服务的提供商,目前仅支持mp-weixin
requestId
:
this
.
getUniCloudRequestId
(),
// 云函数内则写 context.requestId 云对象内则写 this.getUniCloudRequestId()
})
```
## 错误码说明
|错误码 |说明 |
|-- |-- |
|uni-sec-check-system-error |系统错误 |
|uni-sec-check-risk-content |存在风险内容 |
|uni-sec-check-invalid-appid |appid不正确 |
|uni-sec-check-invalid-appsecret |appsecret不正确 |
|uni-sec-check-invalid-access-token |accessToken不正确 |
|uni-sec-check-access-token-expired |accessToken已过期 |
|uni-sec-check-invalid-file-type |错误的文件类型 |
|uni-sec-check-invalid-image-size |图片大小超出限制 |
|uni-sec-check-invalid-request-url |错误的请求地址 |
|uni-sec-check-invalid-request-param |错误的请求参数 |
|uni-sec-check-invalid-request-format |错误的请求格式 |
|uni-sec-check-param-required |缺少必要参数 |
|uni-sec-check-empty-image |图片文件内容为空 |
|uni-sec-check-empty-content |文字内容为空 |
|uni-sec-check-invoke-out-of-limit |接口调用频率/次数超出限制|
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录