必须使用腾讯云cms sdk(composer require tencentcloud/cms),客户端为tencentcloud\cms\v20190321\client;textmoderation的content需trim后base64编码,长度≤10000字符;图片审核用imagemoderation且二进制大小≤5mb;禁用异步回调除非具备完整回调处理能力。

调用 TencentCloud\Tmt\V20180321\Client 前先确认你没走错 SDK
腾讯云内容安全(cms)和机器翻译(tmt)是两个独立服务,SDK 包名、接口路径、鉴权方式全都不一样。很多人搜“腾讯云 AI 审核”结果装了 tmt 或 nlp 的 SDK,一调 TextModeration 就报 Call to undefined method —— 因为那根本不是这个 SDK 提供的方法。
正确做法是:只装官方 cms SDK:
composer require tencentcloud/cms。它对应的客户端类是
TencentCloud\Cms\V20190321\Client,不是 V20180321 也不是 tmt 下的任何类。- 别用
tencentcloud/common单独引入,它只是基础依赖,不带业务接口 - 别手动 copy SDK 源码到项目里,版本更新后容易漏掉模型字段变更(比如 2024 年起
Label返回值新增了SubLabel) -
Client初始化时必须传Credential实例,不能直接传 secretId/secretKey 字符串
TextModeration 接口必须传 Content 且要 Base64 编码
PHP 的 TextModeration 不接受明文字符串,会直接返回 InvalidParameter.Content 错误。哪怕你传的是纯 ASCII 也得 Base64 —— 这是腾讯云强制要求,不是可选项。
常见翻车点:用 base64_encode($text) 后忘了 trim(),导致末尾换行或空格混入,触发 InvalidParameterValue.Content;或者对已编码过的字符串重复 encode,解码失败。
- 正确写法:
$params['Content'] = base64_encode(trim($text)) - 中文、emoji、换行符都正常支持,但单次请求
Content长度不能超过 10000 字符(注意是原文长度,不是 Base64 后) - 如果文本来自表单 POST,记得先
mb_convert_encoding($text, 'UTF-8', 'auto'),避免 GBK 编码下 Base64 出乱码
图片审核要用 ImageModeration,且 FileContent 必须是完整二进制
不能把图片 URL 直接塞进 FileContent,也不能用 file_get_contents('http://...') 后不检查返回值。腾讯云接口只认原始二进制数据,且要求 header 里带 Content-Type: image/jpeg(实际由 SDK 自动加,你只需确保二进制正确)。
最容易被忽略的是:上传前没做大小限制。接口限制单图不超过 5MB,超限直接返回 InvalidParameterValue.ImageSize,错误信息里还不提示具体哪张图——尤其批量审核时容易卡在某一张上。
- 本地文件:用
file_get_contents($path),但务必先if (filesize($path) > 5 * 1024 * 1024) { throw new Exception('image too large'); } - 用户上传:
$_FILES['img']['tmp_name']拿到后立刻检查$_FILES['img']['size'],别等进 SDK 才发现 - 别用
cURL自己拼 multipart body,SDK 已封装好,手动拼大概率丢 boundary 或 Content-Type
异步回调和同步返回的区别直接影响业务逻辑
腾讯云内容安全默认是同步返回(TextModeration 和 ImageModeration 都是),但如果你开了「异步检测」开关(通过控制台或 CallbackUrl 参数),响应体就变成 { "Result": 0, "DataId": "xxx" },后续结果得靠你自己接收 HTTP POST 回调 —— 这时候你代码里还等着 $resp->Suggestion,必然报错。
很多团队把「自动审核」理解成「后台静默处理完再通知我」,结果发现回调地址没配白名单、没验签名、没做幂等,一条违规内容反复推送三次,或者漏掉关键字段 Label 导致误放行。
- 生产环境建议关掉异步回调,除非你真有队列+重试+签名验证+去重能力
- 同步调用时,
$resp->Suggestion是字符串"Pass"/"Review"/"Block",不是布尔值,别写if ($resp->Suggestion) - 所有返回里的
Label字段才是分类依据(如"Porn"、"Terrorism"),Suggestion只是综合结论,不能替代人工复审逻辑
事情说清了就结束。最常出问题的地方不在代码怎么写,而在于没看清文档里「适用场景」那一栏——比如用文本接口传图片 Base64,或拿图片接口扫 OCR 文本,这类错连错误码都对不上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











