2021-03-24 23:34:46 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
2022-03-15 18:05:33 +08:00
|
|
|
|
declare(strict_types=1);
|
2021-03-24 23:34:46 +08:00
|
|
|
|
|
|
|
|
|
|
namespace ZM\API;
|
|
|
|
|
|
|
|
|
|
|
|
use Swoole\Coroutine\Http\Client;
|
|
|
|
|
|
use ZM\Console\Console;
|
|
|
|
|
|
|
|
|
|
|
|
class TuringAPI
|
|
|
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 请求图灵API,返回图灵的消息
|
|
|
|
|
|
* @param $msg
|
|
|
|
|
|
* @param $user_id
|
|
|
|
|
|
* @param $api
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2022-03-15 18:05:33 +08:00
|
|
|
|
public static function getTuringMsg($msg, $user_id, $api)
|
|
|
|
|
|
{
|
2021-03-24 23:34:46 +08:00
|
|
|
|
$origin = $msg;
|
|
|
|
|
|
if (($cq = CQ::getCQ($msg)) !== null) {//如有CQ码则去除
|
2022-03-15 18:05:33 +08:00
|
|
|
|
if ($cq['type'] == 'image') {
|
|
|
|
|
|
$url = $cq['params']['url'];
|
|
|
|
|
|
$msg = str_replace(mb_substr($msg, $cq['start'], $cq['end'] - $cq['start'] + 1), '', $msg);
|
2021-03-24 23:34:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
$msg = trim($msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
//构建将要发送的json包给图灵
|
|
|
|
|
|
$content = [
|
2022-03-15 18:05:33 +08:00
|
|
|
|
'reqType' => 0,
|
|
|
|
|
|
'userInfo' => [
|
|
|
|
|
|
'apiKey' => $api,
|
|
|
|
|
|
'userId' => $user_id,
|
|
|
|
|
|
],
|
2021-03-24 23:34:46 +08:00
|
|
|
|
];
|
2022-03-15 18:05:33 +08:00
|
|
|
|
if ($msg != '') {
|
|
|
|
|
|
$content['perception']['inputText']['text'] = $msg;
|
2021-03-24 23:34:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
$msg = trim($msg);
|
2022-03-15 18:05:33 +08:00
|
|
|
|
if (mb_strlen($msg) < 1 && !isset($url)) {
|
|
|
|
|
|
return '请说出你想说的话';
|
|
|
|
|
|
}
|
2021-03-24 23:34:46 +08:00
|
|
|
|
if (isset($url)) {
|
2022-03-15 18:05:33 +08:00
|
|
|
|
$content['perception']['inputImage']['url'] = $url;
|
|
|
|
|
|
$content['reqType'] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!isset($content['perception'])) {
|
|
|
|
|
|
return '请说出你想说的话';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
}
|
2022-03-15 18:05:33 +08:00
|
|
|
|
$client = new Client('openapi.tuling123.com', 80);
|
|
|
|
|
|
$client->setHeaders(['Content-type' => 'application/json']);
|
|
|
|
|
|
$client->post('/openapi/api/v2', json_encode($content, JSON_UNESCAPED_UNICODE));
|
2021-03-24 23:34:46 +08:00
|
|
|
|
$api_return = json_decode($client->body, true);
|
2022-03-15 18:05:33 +08:00
|
|
|
|
if (!isset($api_return['intent']['code'])) {
|
|
|
|
|
|
return 'XD 哎呀,我脑子突然短路了,请稍后再问我吧!';
|
|
|
|
|
|
}
|
2021-03-24 23:34:46 +08:00
|
|
|
|
$status = self::getResultStatus($api_return);
|
|
|
|
|
|
if ($status !== true) {
|
2022-03-15 18:05:33 +08:00
|
|
|
|
if ($status == 'err:输入文本内容超长(上限150)') {
|
|
|
|
|
|
return '你的话太多了!!!';
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($api_return['intent']['code'] == 4003) {
|
|
|
|
|
|
return '哎呀,我刚才有点走神了,可能忘记你说什么了,可以重说一遍吗';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
}
|
2022-03-15 18:05:33 +08:00
|
|
|
|
Console::error(zm_internal_errcode('E00038') . "图灵机器人发送错误!\n错误原始内容:" . $origin . "\n来自:" . $user_id . "\n错误信息:" . $status);
|
2021-03-24 23:34:46 +08:00
|
|
|
|
//echo json_encode($r, 128|256);
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return '哎呀,我刚才有点走神了,要不一会儿换一种问题试试?';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
}
|
2022-03-15 18:05:33 +08:00
|
|
|
|
$result = $api_return['results'];
|
2021-03-24 23:34:46 +08:00
|
|
|
|
//Console::info(Console::setColor(json_encode($result, 128 | 256), "green"));
|
2022-03-15 18:05:33 +08:00
|
|
|
|
$final = '';
|
2021-06-16 00:17:30 +08:00
|
|
|
|
foreach ($result as $v) {
|
2022-03-15 18:05:33 +08:00
|
|
|
|
switch ($v['resultType']) {
|
|
|
|
|
|
case 'url':
|
|
|
|
|
|
$final .= "\n" . $v['values']['url'];
|
2021-03-24 23:34:46 +08:00
|
|
|
|
break;
|
2022-03-15 18:05:33 +08:00
|
|
|
|
case 'text':
|
|
|
|
|
|
$final .= "\n" . $v['values']['text'];
|
2021-03-24 23:34:46 +08:00
|
|
|
|
break;
|
2022-03-15 18:05:33 +08:00
|
|
|
|
case 'image':
|
|
|
|
|
|
$final .= "\n" . CQ::image($v['values']['image']);
|
2021-03-24 23:34:46 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return trim($final);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-15 18:05:33 +08:00
|
|
|
|
public static function getResultStatus($r)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch ($r['intent']['code']) {
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 5000:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:无解析结果';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4000:
|
|
|
|
|
|
case 6000:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:暂不支持该功能';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4001:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:加密方式错误';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4005:
|
|
|
|
|
|
case 4002:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:无功能权限';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4003:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:该apikey没有可用请求次数';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4007:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:apikey不合法';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4100:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:userid获取失败';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4200:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:上传格式错误';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4300:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:批量操作超过限制';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4400:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:没有上传合法userid';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4500:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:userid申请个数超过限制';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4600:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:输入内容为空';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 4602:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:输入文本内容超长(上限150)';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 7002:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:上传信息失败';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
case 8008:
|
2022-03-15 18:05:33 +08:00
|
|
|
|
return 'err:服务器错误';
|
2021-03-24 23:34:46 +08:00
|
|
|
|
default:
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-03-15 18:05:33 +08:00
|
|
|
|
}
|