00 / 00

内容审核

自动检查用户上传的文字和图片是否违规

这是什么

内容审核就是自动检查用户上传的文字、图片是否包含违规信息(色情、暴力、政治敏感等)。

中国法律规定平台必须对用户生成内容(UGC = User Generated Content)做审核。

  • 例如微信小程序在审核的时候,它会测试上传敏感文字图片,如果你的小程序没有拒绝则审核不通过。

实际上在很多支持用户评论、图片、自定义文字的场景下,都需要做内容审核。这也是避免你的网站免受攻击的一种手段。

这里我们默认使用腾讯云的安全检测 API。

两个包的关系

  • @repo/content-moderation抽象接口层,定义了统一的调用方式。不管底层用哪家云,代码写法不变
  • @repo/tencent-cloud — 腾讯云的具体实现。实际审核由腾讯云 API 完成

打个比方:content-moderation 像万能遥控器,tencent-cloud 像具体电视品牌。你按遥控器,不管后面接什么电视,行为一致。

腾讯云的 API 密钥是敏感信息,必须放在 products/01mvp/packages/config/.env 或部署平台 Secrets 中。审核 API 按调用次数计费。

怎么接入

  1. 配环境变量:在 products/01mvp/packages/config/.env 加云服务商的密钥
  2. 选审核类型:文字审核还是图片审核
  3. 调审核接口:把用户内容传给审核函数
  4. 处理结果:通过(放行)/ 拒绝(删除)/ 人工复核(标记)

环境变量配置

# 腾讯云 API 密钥(在腾讯云控制台获取)
TENCENT_CLOUD_SECRET_ID=your-secret-id
TENCENT_CLOUD_SECRET_KEY=your-secret-key
TENCENT_CLOUD_REGION=ap-shanghai

文本审核

import { createTencentTextModerationClientFromEnv } from "@repo/tencent-cloud";

const client = createTencentTextModerationClientFromEnv();

const result = await client.moderateText("待审核的文本内容");

// result.suggestion: "Pass"(通过)| "Block"(拦截)| "Review"(人工复审)
// result.label: 内容分类标签
// result.score: 置信度分数
// result.keywords: 触发的敏感词

图片审核

import { requestImageModeration } from "@repo/content-moderation";

const result = await requestImageModeration(
  "https://example.com/image.jpg",
  "content",
);

// result.ok: true 表示通过
// result.ok: false 时,result.reason 会给出拦截或复审原因

requestImageModeration() 会先校验图片 URL,只接受 http / https。配置了腾讯云密钥时,它会调用 @repo/tencent-cloud 的图片审核客户端;腾讯云返回 BlockReview 时都会得到 { ok: false, reason }。如果没有配置密钥,或者腾讯云接口临时不可用,它会 fail open 返回 { ok: true },避免因为审核服务波动阻塞用户主流程。

如果你想直接拿腾讯云的原始建议、标签、分数和 OCR 结果,也可以使用底层客户端:

import { createTencentImageModerationClientFromEnv } from "@repo/tencent-cloud";

const client = createTencentImageModerationClientFromEnv();

const result = await client.moderateImage({
  bizType: "avatar",
  fileUrl: "https://example.com/avatar.jpg",
});

// result.suggestion: "Pass" | "Block" | "Review"
// result.label: 违规类型标签
// result.subLabel: 细分子标签
// result.score: 置信度分数

批量图片可以使用:

import { batchModerateImages } from "@repo/content-moderation";

const results = await batchModerateImages(
  [
    "https://example.com/image-1.jpg",
    "https://example.com/image-2.jpg",
  ],
  "content",
);

常见场景

用户发帖审核 — 用户提交的文字,先审核再入库。

头像审核 — 用户上传头像时检查是否合规。

注意事项

  • 审核有延迟:云 API 可能需几百毫秒,建议异步处理
  • 审核收费:按调用次数计费
  • 降级策略:审核服务挂了可选"先放行事后抽查"或"全部拒绝"
  • 辅以人工:机器可能误判,敏感分数区间的做人工复核

@repo/content-moderation 默认采用 fail open:密钥缺失或审核 API 短暂不可用时会放行。上线 UGC 或头像上传前,应根据业务风险决定是否改成“审核失败则进入人工复核”。

相关链接

这篇文档有问题?