今天好。
关于Telegram bot 的文章很多,但是很少有人写Alice 的技能,而且我也没有找到任何关于如何制作单个bot 的资料,所以我决定分享我如何制作一个bot 的经验简单的 Telegram 机器人和 Yandex.Alice skill,用于具有相同功能的站点。
所以,我不会告诉你如何建立一个网络服务器并获得一个 ssl 证书,关于它的文章已经足够多了。
创建电报机器人
首先,让我们创建一个 Telegram 机器人,为此我们转到 Telegram 并在那里找到 BotFather 机器人。
选择/newbot
我们输入机器人的名称,它将响应,然后我们输入机器人的名称,作为响应我们得到一个令牌来控制机器人,我们记下这个密钥,它对我们将来有用。
下一步是告诉 Telegram 服务器将机器人的数据发送到哪个服务器。 为此,我们建立了以下形式的链接:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ 我们用之前收到的来自机器人的令牌替换
____PATH_TO_SCRIPT____ 我们将替换为将处理数据的服务器上脚本的地址(例如,
这里有一个问题,api.telegram.org 服务器处于阻塞状态,但你可以这样做:租用最便宜的没有限制的服务器,然后从该服务器的控制台发出命令
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
就是这样,Telegram 机器人已创建并连接到您的服务器。
为 Yandex.Alisa 创建技能
让我们继续为 Yandex.Alice 创建技能。
要创建技能,您需要转到 Yandex.Dialogues 开发人员页面
技能设置对话框将打开。
我们开始进入技能设置。
输入你的技能名称。
应非常谨慎地选择激活名称,以便 Alice 从细微差别中正确理解它 - 具有 Alice 和 Yandex.Station 或 Irbis A 等列的移动应用程序可以不同地感知单词。
我们以与 Telegram 相同的方式在我们的服务器上输入脚本的路径,但它将是专门针对 Alice 的脚本,例如
我们选择技能说话的声音,我更喜欢爱丽丝的声音。
如果您计划仅在移动设备或浏览器中工作,请选择“您需要带屏幕的设备”。
接下来,输入 Alice 的技能目录的设置。 如果您打算使用“品牌”一词进行激活,则需要在 webmaster.yandex.ru 服务中验证该品牌的网站。
这就是设置的全部内容,让我们继续讨论脚本。
电报机器人脚本
让我们从 Telegram 的脚本开始。
我们连接将处理来自 bot 和 Alice 的消息的库:
include_once 'webhook_parse.php';
我们设置我们的机器人的令牌:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
我们收到数据:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
将数据解析为变量:
if (!$request)
{
die();
// Some Error output (request is not valid JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Some Error output (request has not message)
}
else
{
$user_id = $request['message']['from']['id'];
$msg_user_name = $request['message']['from']['first_name'];
$msg_user_last_name = $request['message']['from']['last_name'];
$msg_user_nick_name = $request['message']['from']['username'];
$msg_chat_id = $request['message']['chat']['id'];
$msg_text = $request['message']['text'];
$msg_text = mb_strtolower($msg_text, 'UTF-8');
$tokens = explode(" ", $msg_text);
}
现在您可以使用变量:
$tokens - 现在这里是用户输入的所有单词
$user_id - 这里的用户 ID
$msg_chat_id - 机器人收到命令的聊天
$msg_user_name - 用户名
接下来我们调用Parse_Tokens函数进行处理:
$Out_Str = Parse_Tokens($tokens);
并发送回复:
Send_Out($user_id, $Out_Str);
Send_Out 函数很简单,如下所示:
function Send_Out($user_id, $text, $is_end = true)
{
global $tg_bot_token;
if (strlen($user_id) < 1 || strlen($text) < 1) {return;}
$json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
}
Yandex.Alisa 的技能脚本
现在让我们转到 Alice 的脚本,它与 Telegram 几乎相同。
我们还连接了将处理来自机器人和爱丽丝的消息的库,以及一个包含爱丽丝类的库:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
我们收到数据:
$data = json_decode(trim(file_get_contents('php://input')), true);
将数据解析为变量:
if (isset($data['request']))
{
//original_utterance
if (isset($data['meta']))
{
$data_meta = $data['meta'];
if (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
}
if (isset($data['request']))
{
$data_req = $data['request'];
if (isset($data_req['original_utterance']))
{
$original_utterance = $data_req['original_utterance'];
}
if (isset($data_req['command'])) {$data_msg = $data_req['command'];}
if (isset($data_req['nlu']))
{
$data_nlu = $data_req['nlu'];
if (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
// $data_token_count = count($data_tokens);
}
}
if (isset($data['session']))
{
$data_session = $data['session'];
if (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
if (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
if (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
if (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
if (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
}
}
这里有几个变量:
$tokens - 现在这里是用户输入的所有单词
$user_id - 这里的用户 ID
Yandex 不断地 ping 已发布的技能,我添加了一行以立即退出脚本而不开始对消息的完整处理:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
我们调用Parse_Tokens函数进行处理,和Telegram一样:
$Out_Str = Parse_Tokens($tokens);
并发送回复:
Send_Out($user_id, $Out_Str);
这里的 Send_Out 函数比较复杂:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
///// GENERATE BASE OF OUT //////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
///// GENERATE BASE OF OUT End //////
///// OUT MSG GENERATE /////
$Data_Out->session->session_id = $data_msg_sess_id;;
$Data_Out->session->user_id = $user_id;
$Data_Out->response->text = $out_text;
$Data_Out->response->tts = $out_tts;
if (strlen($out_tts) < 1) {$Data_Out->response->tts = $out_text;}
$Data_Out->response->end_session = $is_end;
header('Content-Type: application/json');
print(json_encode($Data_Out, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT));
die();
}
完成爱丽丝的剧本。
Parse_Tokens 处理脚本本身纯粹是为了示例而制作的,您可以在那里进行任何检查和处理。
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
如果你需要和一个比问答更复杂形式的用户交流,那么你需要将用户的$user_id和已经从用户那里收到的数据保存在数据库(例如mysql)中,并在其中进行分析Parse_Tokens 函数。
实际上,这几乎就是一切,如果一切都正确完成,那么 Telegram 机器人已经可用,可以检查 Alice 的技能
如果一切正常,您可以通过单击“供审核”按钮发送技能以供审核。
现在您同时拥有两个用于不同平台的机器人,它们以相同的方式工作。
Yandex.Dialogues 服务的文档