PHP中的Yandex.Alice和Telegram机器人具有单一功能

下午好

关于Telegram机器人的文章很多,但是很少有关于Alice技能的文章,而且我没有找到有关如何制作单个机器人的任何信息,因此我决定分享我的经验,以学习如何制作简单的Telegram bot和Yandex。具有单一功能。

因此,我不会告诉您如何启动网络服务器并获得ssl证书,对此已经有足够的介绍了。

创建一个电报机器人


首先,创建一个Telegram机器人,为此,请转到Telegram并在那里找到BotFather机器人。





选择/ newbot



我们输入将响应的机器人的名称,然后输入机器人的名称,作为响应,我们获得用于控制该机器人的令牌,编写此密钥,它将对我们将来有用。



下一步是告诉Telegram服务器将哪个数据从漫游器发送到该服务器。 为此,请建立以下形式的链接:

https: //api.telegram.org/bot______/setWebhook?url=https://_________ 

___令牌___替换为我们之前收到的机器人令牌

____ PATH_DO_SCRIPT ___被替换为我们服务器上用于处理数据的脚本的地址(例如, www.my_server.ru/webhook_telegram.php )。

有一个问题,api.telegram.org服务器处于锁定状态,但是您可以执行以下操作:租用没有限制的最便宜的服务器,然后从该服务器的控制台发出命令

 wget _______ 

就是这样,Telegram bot已创建并连接到您的服务器。

为Yandex.Alice创建技能


让我们继续为Yandex.Alice创建技能。

要创建技能,您需要转到Yandex.Dialogs开发人员页面,Yandex.Dialogs开发人员页面 ,单击“创建对话”,然后选择“ Alice中的技能”。



技能设置对话框打开。



我们开始输入技能设置。

输入您的技能名称。



应该非常仔细地选择激活名称,以便Alice从细微差别中正确理解它-具有Alice和诸如Yandex.Station或Irbis A之类的列的移动应用程序可以以不同的方式感知单词。

我们以与Telegram相同的方式在服务器上输入脚本的路径,但这将是专门针对Alice的脚本,例如www.my_server.ru/webhook_alice.php



我们选择技能会说的声音,我更喜欢爱丽丝的声音。



如果您计划仅在移动设备或浏览器中工作,请选择“需要带有屏幕的设备”。

接下来,输入Alice技能目录的设置。 如果您打算使用品牌一词进行激活,则需要在webmaster.yandex.ru服务中通过品牌网站验证。



使用设置,转到脚本。

电报机器人脚本


让我们从Telegram的脚本开始。

我们连接库,其中将处理来自机器人和爱丽丝的消息:

 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); } 

现在您可以使用变量了:

$令牌-现在用户在此处输入的所有单词

$ 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.Alice的技能脚本


现在让我们继续进行Alice的脚本,它与Telegram几乎相同。

我们还连接了将处理来自机器人和Alice的消息的库,以及一个包含Alice类的库:

 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'];} } } 

这里所需的变量略少:

$令牌-现在用户在此处输入的所有单词

$ 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; } 

如果您需要以比问答形式更复杂的形式与用户进行交流,则需要在数据库(例如mysql)中保存该用户的$ user_id和已从该用户收到的数据,并在Parse_Tokens函数中对其进行分析。

实际上,这几乎就是全部,如果一切都正确完成,那么Telegram机器人已经可用,可以通过dialogs.yandex.ru/developer来检查Alice的技能,然后在“测试”选项卡上转到您的新技能。



如果一切正常,您可以通过单击“审核”按钮将技能发送给审核。

现在,您有两个针对不同平台的机器人,它们的工作方式相同。

Yandex.Dialog服务文档在这里

完整脚本发布在github 下载上

更新:将所有内容包装在类中,并更新了github上的存储库

Source: https://habr.com/ru/post/zh-CN446174/


All Articles