具有相同功能的 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 上 下載.

來源: www.habr.com

添加評論