腾讯云内容安全(文本 + 图片)集成指南
了解如何在 HackathonWeekly 社区平台中集成腾讯云文本与图片内容安全服务,实现智能审核与友好降级策略
腾讯云内容安全(文本 + 图片)集成指南
概述
腾讯云内容安全服务覆盖文本(Text Moderation System,TMS)与图片(Image Moderation Service,IMS)两大类别,可帮助平台识别和过滤不适宜的用户生成内容,保障社区生态的健康与安全。
为什么需要内容安全?
HackathonWeekly 社区中包含多种用户输入:
- 活动文案、项目介绍、评论等文本内容
- 用户头像、活动封面、作品截图等图片内容
通过接入内容安全服务,我们可以及时发现并处理:
- 违法违规:涉政、暴恐、违禁品等敏感内容
- 低俗与色情:文本与图片中的不当元素
- 谩骂与歧视:恶意攻击行为
- 广告与灌水:垃圾营销、虚假宣传
功能特性
文本审核(TMS)
- 深度学习模型覆盖多种违规场景
- 支持单文本与批量检测,实时返回结果
- 自定义业务类型(BizType),按场景配置策略
- 返回建议(Pass/Block/Review)、标签、置信度和命中关键词
图片审核(IMS)
- 支持本地文件、网络图片、GIF/长图检测
- 识别色情、广告、暴恐、违法、OCR 文本等风险
- 可选择不同业务策略并关联账号信息
- 返回整体建议、标签详情、物体识别、OCR 与图库命中信息
检测结果结构
- 文本:
suggestion
、label
、score
、keywords
、subLabel
- 图片:整体建议,
labelResults
、objectResults
、ocrResults
、libResults
、recognitionResults
等详细字段,便于复审与追踪
业务类型配置
我们在 src/lib/content-moderation
中为不同文本类型配置了专属 BizType(如 nickname_input
、content_input
)。图片审核默认使用 image_default
,你可以在腾讯云控制台中创建并绑定更细粒度的策略。
快速开始
1. 环境配置
在 .env.local
中添加腾讯云凭证:
# 腾讯云通用配置项
TENCENT_CLOUD_SECRET_ID="你的SecretId"
TENCENT_CLOUD_SECRET_KEY="你的SecretKey"
TENCENT_CLOUD_REGION="ap-shanghai"
2. 开通服务
- 登录 腾讯云控制台
- 前往 访问管理 - API 密钥管理 获取 SecretId 与 SecretKey
- 在 文本内容安全控制台 开通 TMS
- 在 图片内容安全控制台 开通 IMS,并配置所需 BizType
3. 运行测试脚本
# 运行综合测试(默认包含文本校验、文本 API、图片 API)
bun content-moderation-test
# 仅测试文本审核(支持自定义文本)
bun content-moderation-test --text="要检测的文本"
# 仅测试图片审核(默认 public/images/icon.png,可自定义路径)
bun content-moderation-test --image --image-path=路径/到/图片
# 模拟凭证错误等异常降级策略
bun content-moderation-test --error
代码集成
文本审核示例
import { createTencentTextModerationClientFromEnv } from '@/lib/tencent-cloud';
const client = createTencentTextModerationClientFromEnv();
// 检测单个文本
const result = await client.moderateText('用户输入的文本');
console.log(result);
// {
// suggestion: 'Pass',
// label: 'Normal',
// score: 0,
// keywords: [],
// subLabel: ''
// }
// 简单判断是否安全
const isSafe = await client.isTextSafe('用户输入的文本');
console.log(isSafe); // true 或 false
// 批量检测多个文本
const batch = await client.moderateTexts([
'第一段文本',
'第二段文本',
'第三段文本',
]);
console.log(batch);
图片审核示例
import { createTencentImageModerationClientFromEnv } from '@/lib/tencent-cloud';
const imageClient = createTencentImageModerationClientFromEnv();
const imageResult = await imageClient.moderateImage({
filePath: 'public/images/icon.png',
bizType: 'image_default',
});
console.log(imageResult.suggestion); // Pass / Block / Review
console.log(imageResult.labelResults);
const isImageSafe = await imageClient.isImageSafe({
fileUrl: 'https://example.com/image.jpg',
});
console.log(isImageSafe);
生产场景示例
import { moderateContent, ContentType } from '@/lib/content-moderation';
// 提交文本前的统一校验
const result = await moderateContent(payload.title, ContentType.EVENT_TITLE);
if (!result.isApproved) {
throw new Error(result.reason ?? '内容审核未通过');
}
import { createTencentImageModerationClientFromEnv } from '@/lib/tencent-cloud';
// 上传图片后执行异步审核
const client = createTencentImageModerationClientFromEnv();
const moderation = await client.moderateImage({ filePath: tempFilePath });
if (moderation.suggestion === 'Block') {
await deleteUploadedFile();
throw new Error('图片包含违规内容,请更换后重试');
}
API 参考
TencentTextModerationClient
moderateText(content: string, bizType?: string): Promise<TextModerationResult>
moderateTexts(contents: string[], bizType?: string): Promise<TextModerationResult[]>
isTextSafe(content: string, bizType?: string): Promise<boolean>
TencentImageModerationClient
moderateImage(options: ImageModerationOptions): Promise<ImageModerationResult>
isImageSafe(options: ImageModerationOptions): Promise<boolean>
辅助函数
createTencentTextModerationClient(config: TencentCloudConfig)
createTencentTextModerationClientFromEnv(region?: string)
createTencentImageModerationClient(config: TencentCloudConfig)
createTencentImageModerationClientFromEnv(region?: string)
性能与限制
文本
- 默认频率:1000 次/秒
- 单次最大长度:10000 个 Unicode 字符
- 支持语言:中文、英文、数字
图片
- 文件大小:Base64 内容 ≤ 10MB;网络图片 ≤ 30MB
- 分辨率:大于 50×50 且 小于 10000×10000,长宽比 < 90:1
- 支持格式:PNG、JPG、JPEG、BMP、GIF、WEBP(动态图自动抽帧)
- 下载限制:首次超时 3 秒;重试一次
优化建议:批量处理、缓存结果、异步审核、明确超时与降级策略。
故障排除
文本常见错误
Error: request to https://tms.tencentcloudapi.com/ failed, reason: getaddrinfo ENOTFOUND
排查:检查网络或 DNS
Error: [TencentCloudSDKException] AuthFailure
排查:确认 SecretId、SecretKey 配置
Error: 文本内容不存在或文本类型错误:需标准utf8转成的base64格式编码
排查:SDK 会自动处理,若出现请检查版本与入参
图片常见错误
Error: [TencentCloudSDKException] ResourceUnavailable.ImageDownloadError
排查:确认图片链接可直接访问,避免 302 跳转
Error: Base64 data size is too large
排查:控制上传文件大小或改用 URL 模式
调试技巧
# 文本
bun content-moderation-test --text="测试文本"
# 图片
bun content-moderation-test --image --image-path=public/images/icon.png
try {
const result = await client.moderateText(content);
} catch (error) {
console.error('详细错误信息:', error);
}
最佳实践
安全
- 将凭证保存在服务端环境变量中
- 对异常建立监控告警(认证、配额、超时)
- 按业务分层策略,避免“一刀切”
用户体验
- 提供友好的错误提示与修改建议
- 对 Review 结果设置人工复审流程
- 审核失败时保留草稿,避免内容丢失
相关资源
如果你在集成过程中遇到问题,欢迎在社区提交 Issue 或联系技术支持。