下午好。
關於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 服務的文檔
完整的腳本發佈在 github 上
來源: www.habr.com