本来想使用sdk,结果composer安装就报错了.
composer require alibabacloud/green-20220302 2.2.8
composer require alibabacloud/green-20220302 2.2.8
报错
nelexa/zip 3.3.3 requires php ^5.5.9 || ^7.0 -> your php version (8.0.2) does not satisfy that requirement
原因是由于本地环境是php8,而nelexa/zip还没有支持php8
为此,花了几个小时的时间,对接了原生https的请求.
这里为了方便,我创建了一个自定义的Ali类,可能与原先冲突,可以换一个类名.
<?php
/**
* 阿里类
*/
class Ali
{
public $accessKeyId = '你的key';
public $accessKeySecret = '你的secret';
// 签名
public function aliyunSign($method, $queryParams) {
// 第一步排序
ksort($queryParams);
// 第二步 &拼接key=value
$canonicalizedQueryString = http_build_query($queryParams, '', '&', PHP_QUERY_RFC3986);
// 第三步 拼接请求方法post/get,固定格式
$stringToSign = strtoupper($method) . '&'. urlencode('/') . '&'
. urlencode($canonicalizedQueryString);
// 第四部,hash, sha1, 等加密后base64返回
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $this->accessKeySecret . '&', true));
return $signature;
}
/**
* @param $type
* nickname:用户昵称检测
* chat:私聊互动内容检测
* comment:公聊评论内容检测
* ai_art:AIGC文字检测
* ad_compliance:广告法合规检测
* pgc:PGC教学物料检测
* 来源:nickname_detection:用户昵称检测
* chat_detection:私聊互动内容检测
* comment_detection:公聊评论内容检测
* ai_art_detection:AIGC文字检测
* ad_compliance_detection:广告法合规检测
* pgc_detection:PGC教学物料检测
* @return array
*/
public function detection($content, $type = 'nickname')
{
$url = 'https://green-cip.cn-shenzhen.aliyuncs.com/';
$method = 'post';
// 输出UTC时间
$utc_timestamp = strtotime('-8 hours');
$utc_time = date("Y-m-d", $utc_timestamp).'T';
$utc_time .= date("H:i:s", $utc_timestamp).'Z';
$queryParams = [
'Format' => 'JSON',
'Version' => '2022-03-02',
'SignatureMethod' => 'Hmac-SHA1',
'SignatureNonce' => rand(100,999) .time(),
'SignatureVersion' => '1.0',
'Action' => 'TextModeration',
'AccessKeyId' => $this->accessKeyId,
'Timestamp' => $utc_time,
'Service' => "nickname_detection", // parameter invalid(service) 参数无效。Service改为小写:parameter is null(service)报参数为空,只能大写开头
'ServiceParameters' => json_encode(['content' => $content]),
// 以下注释可删除
// "{"RequestId":"A901AC8B-F591-5128-8BEC-9458EBDAC261","Message":"OK","Data":{"reason":"","labels":""},"Code":200}"
// 'ServiceParameters' => "{\"content\": \"王八蛋\"}", // "{"RequestId":"19A3F07E-FA42-588B-A2CA-0AB24707226E","Message":"OK","Data":{"reason":"{\"riskTips\":\"辱骂_低俗\",\"riskWords\":\"王八蛋,王八\"}","labels":"profanity"},"Code":200}"
// 'ServiceParameters' => , // {\"content\": \"王八蛋\"}
// 'ServiceParameters' => "{\"content\": \"王八蛋\"}", // {"Msg":"parameter invalid(service)
];
$sign = $this->aliyunSign($method, $queryParams);
$queryParams['Signature'] = $sign;
$res = curl_post($url, $queryParams);
$res = json_decode($res, true);
if (is_array($res) && $res) {
if ($res['Code'] == 200 && !empty($res['Data'])) {
if (is_array($res['Data']) && $res['Data']) {
if (!empty($res['Data']['labels'])) {
return ['code' => 400, 'message' => $res['Data']['reason']];
} else {
return ['code' => 200, 'message' => '通过'];
}
} else {
return ['code' => 400, 'message' => '请求错误'];
}
} else {
return ['code' => 400, 'message' => '请求aliyun接口错误'];
}
} else {
// 自定义错误返回
return ['code' => 400, 'message' => 'error'];
}
}
}
使用的时候,判断code=200就是可以通过的,反之,都是有问题的,注意记录日志啥的,好排查.
require_once __DIR__ . '/Ali.php';
$content = '王八蛋';
$content = '张三';
$r = (new \Ali())->detection($content);
var_dump($r);