具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

今天好。

关于Telegram bot 的文章很多,但是很少有人写Alice 的技能,而且我也没有找到任何关于如何制作单个bot 的资料,所以我决定分享我如何制作一个bot 的经验简单的 Telegram 机器人和 Yandex.Alice skill,用于具有相同功能的站点。

所以,我不会告诉你如何建立一个网络服务器并获得一个 ssl 证书,关于它的文章已经足够多了。

创建电报机器人

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

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

选择/newbot

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

我们输入机器人的名称,它将响应,然后我们输入机器人的名称,作为响应我们得到一个令牌来控制机器人,我们记下这个密钥,它对我们将来有用。

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

下一步是告诉 Telegram 服务器将机器人的数据发送到哪个服务器。 为此,我们建立了以下形式的链接:

https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___

___TOKEN___ 我们用之前收到的来自机器人的令牌替换

____PATH_TO_SCRIPT____ 我们将替换为将处理数据的服务器上脚本的地址(例如, www.my_server.ru/webhook_telegram.php).

这里有一个问题,api.telegram.org 服务器处于阻塞状态,但你可以这样做:租用最便宜的没有限制的服务器,然后从该服务器的控制台发出命令

wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___

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

为 Yandex.Alisa 创建技能

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

要创建技能,您需要转到 Yandex.Dialogues 开发人员页面 Yandex.Dialogs 开发者页面,点击“创建对话”并选择“爱丽丝技能”。

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

技能设置对话框将打开。

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

我们开始进入技能设置。

输入你的技能名称。

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

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

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

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

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

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

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

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

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

这就是设置的全部内容,让我们继续讨论脚本。

电报机器人脚本

让我们从 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 的技能 dialogs.yandex.ru/developer通过在测试选项卡上转到您的新技能。

具有相同功能的 PHP 中的 Yandex.Alisa 和 Telegram bot

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

现在您同时拥有两个用于不同平台的机器人,它们以相同的方式工作。

Yandex.Dialogues 服务的文档 这里

完整的脚本发布在 github 上 下载.

来源: habr.com

添加评论