在社区、电商或UGC类产品中,用户产生的文字和图片往往混杂着广告、涉政、色情等违规信息。用PHP后端直接对接腾讯云AI内容安全服务,可以在数据落库前完成自动拦截,降低人工复审成本。核心流程是:服务端持有SecretId和SecretKey,按腾讯云签名方法v3构造请求,调用文本或图片审核接口,根据返回的Label和Suggestion决定放行、人工或拦截。

一、准备工作与签名原理
腾讯云开放接口采用TC3-HMAC-SHA256签名算法。开发者不需要自己从头实现加密,但理解流程有助于排查401错误。整体步骤为:拼接规范请求串、构造待签字符串、计算签名、将签名写入Authorization请求头。密钥绝不可出现在前端,只能保留在PHP服务端环境变量或配置文件中。
下面代码展示了从环境变量读取密钥,并准备基础参数的过程。这里用getenv避免密钥硬编码,实际部署时可结合Docker secret或KMS。
<?php
// 从环境变量获取腾讯云密钥
$secretId = getenv('TENCENT_SECRET_ID');
$secretKey = getenv('TENCENT_SECRET_KEY');
if (empty($secretId) || empty($secretKey)) {
throw new Exception('缺少腾讯云密钥配置');
}
// 服务基础信息
$service = 'cms'; // 内容安全服务名
$host = 'cms.tencentcloudapi.com';
$region = 'ap-guangzhou';
$action = 'TextModeration';
$version = '2020-12-29';
?>
二、PHP调用文本审核接口
文本审核适合处理评论、昵称、私信等内容。接口名为TextModeration,传入Content字段(Base64或原文,依文档而定,此处演示原文UTF-8)。返回结构里,Suggestion为Block表示拦截,Review表示人工,Pass为通过。Label给出具体分类,如Porn、Ads。
以下示例用curl发送POST请求,包含完整的Authorization头构造。为可读性省略了部分错误处理,生产环境应记录完整响应以便追溯。
<?php
function signRequest($secretId, $secretKey, $service, $host, $action, $region, $version, $payload) {
$date = gmdate('Y-m-d');
$timestamp = time();
$algorithm = 'TC3-HMAC-SHA256';
// 1. 规范请求
$httpRequestMethod = 'POST';
$canonicalUri = '/';
$canonicalQueryString = '';
$canonicalHeaders = "content-type:application/json; charset=utf-8nhost:{$host}n";
$signedHeaders = 'content-type;host';
$hashedPayload = hash('sha256', $payload);
$canonicalRequest = $httpRequestMethod . "n" . $canonicalUri . "n" . $canonicalQueryString . "n" . $canonicalHeaders . "n" . $signedHeaders . "n" . $hashedPayload;
// 2. 待签字符串
$credentialScope = $date . "/" . $service . "/tc3_request";
$stringToSign = $algorithm . "n" . $timestamp . "n" . $credentialScope . "n" . hash('sha256', $canonicalRequest);
// 3. 签名
$secretDate = hash_hmac('sha256', $date, "TC3" . $secretKey, true);
$secretService = hash_hmac('sha256', $service, $secretDate, true);
$secretSigning = hash_hmac('sha256', "tc3_request", $secretService, true);
$signature = hash_hmac('sha256', $stringToSign, $secretSigning);
// 4. Authorization头
$authorization = $algorithm . " Credential={$secretId}/{$credentialScope}, SignedHeaders={$signedHeaders}, Signature={$signature}";
return array(
'Authorization' => $authorization,
'X-TC-Timestamp' => $timestamp,
'X-TC-Version' => $version,
'X-TC-Action' => $action,
'X-TC-Region' => $region
);
}
$payload = json_encode(array('Content' => '测试违规文本广告加微信'));
$headers = signRequest($secretId, $secretKey, $service, $host, $action, $region, $version, $payload);
$headers['Content-Type'] = 'application/json; charset=utf-8';
$headers['Host'] = $host;
$ch = curl_init("https://{$host}/");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headerArr = array();
foreach ($headers as $k => $v) {
$headerArr[] = $k . ': ' . $v;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
$resp = curl_exec($ch);
curl_close($ch);
$result = json_decode($resp, true);
if (isset($result['Response']['Suggestion'])) {
$suggestion = $result['Response']['Suggestion'];
// Block拦截 Review人工 Pass通过
return $suggestion;
}
?>
上述代码直接返回建议值,业务层可据此跳转。需要注意腾讯云对单次文本长度有限制,超长内容应分段或摘要后送审。另外免费额度用尽后会按量计费,需监控账单。
三、PHP调用图片审核接口
图片审核接口为ImageModeration,支持传入图片URL或Base64。对于用户上传到对象存储的文件,直接传FileUrl更省流量。返回内容除Suggestion外,还有Labels数组描述命中标签及分数,方便按阈值灵活处理。
下面示例演示传入URL的调用方式,签名函数复用前文。图片场景常遇防盗链,可先将图转存到内网可达地址再送审。
<?php
$actionImg = 'ImageModeration';
$payloadImg = json_encode(array(
'FileUrl' => 'https://ipipp.com/demo/upload/test.jpg'
));
$headersImg = signRequest($secretId, $secretKey, $service, $host, $actionImg, $region, $version, $payloadImg);
$headersImg['Content-Type'] = 'application/json; charset=utf-8';
$headersImg['Host'] = $host;
$ch2 = curl_init("https://{$host}/");
curl_setopt($ch2, CURLOPT_POST, true);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $payloadImg);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$hd = array();
foreach ($headersImg as $k => $v) {
$hd[] = $k . ': ' . $v;
}
curl_setopt($ch2, CURLOPT_HTTPHEADER, $hd);
$respImg = curl_exec($ch2);
curl_close($ch2);
$dataImg = json_decode($respImg, true);
if (isset($dataImg['Response']['Suggestion'])) {
$imgSug = $dataImg['Response']['Suggestion'];
$labels = $dataImg['Response']['Labels'] ?? array();
// 根据$imgSug与$labels处理
}
?>
图片审核耗时通常高于文本,若放在用户请求链路中会拉长响应。建议将待审图片写入消息队列,由独立消费者调用接口,结果回写数据库,前端轮询状态。
四、生产环境接入建议
第一,密钥与业务分离。用子账号密钥并限制仅cms权限,即使泄露影响面也可控。第二,失败兜底。腾讯云接口偶发超时,此时不应直接放行,而应标记待人工或暂存。第三,敏感词库辅助。机器审核前先过本地词库,能挡掉明显违规并减少云调用次数。
第四,结果缓存。相同图片哈希或文本指纹可缓存审核结论,避免重复付费。第五,日志脱敏。记录审核日志时,原文或图地址可能涉及隐私,需掩码处理。下表列出常见返回建议与对应动作:
| 接口 | Suggestion | 业务动作 |
|---|---|---|
| 文本/图片 | Pass | 直接发布 |
| 文本/图片 | Review | 进人工池 |
| 文本/图片 | Block | 拒绝并告警 |
通过以上方式,PHP项目能以较低改造成本拥有自动化内容安全能力,在合规与体验间取得平衡。