Xin chào buổi chiều.
Có rất nhiều bài viết về chủ đề bot Telegram, nhưng ít người viết về kỹ năng cho Alice và tôi không tìm thấy bất kỳ thông tin nào về cách tạo một bot duy nhất, vì vậy tôi quyết định chia sẻ kinh nghiệm của mình về cách tạo một bot. bot Telegram đơn giản và kỹ năng Yandex.Alice cho trang web có chức năng tương tự.
Vậy, làm thế nào để thiết lập máy chủ web và... Chứng chỉ SSL Tôi sẽ không nói cho bạn biết, đã có quá nhiều bài viết về chủ đề này rồi.
Tạo bot Telegram
Trước tiên, hãy tạo một bot Telegram, để làm điều này, chúng tôi truy cập Telegram và tìm bot BotFather ở đó.


Chọn /newbot

Chúng tôi nhập tên của bot mà nó sẽ phản hồi, sau đó chúng tôi nhập tên của bot, để phản hồi, chúng tôi nhận được mã thông báo để điều khiển bot, chúng tôi ghi lại khóa này, nó sẽ hữu ích cho chúng tôi trong tương lai.

Bước tiếp theo là báo cho các máy chủ Telegram biết máy chủ nào sẽ gửi dữ liệu từ bot đến. Để làm điều này, chúng tôi tạo một liên kết có dạng:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ chúng tôi thay thế bằng mã thông báo của chúng tôi từ bot, đã nhận được trước đó
____PATH_TO_SCRIPT___ được thay thế bằng địa chỉ của tập lệnh trên máy chủ của chúng tôi, nơi quá trình xử lý dữ liệu sẽ diễn ra (ví dụ: www.my_server.ru/webhook_telegram.php).
Có một vấn đề ở đây, máy chủ api.telegram.org đã bị chặn, nhưng bạn có thể làm như sau: thuê máy chủ rẻ nhất. máy chủ nơi không có bất kỳ hạn chế nào và đưa ra lệnh từ bảng điều khiển của máy chủ này.
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Vậy là xong, bot Telegram đã được tạo và liên kết với tài khoản của bạn. người phục vụ.
Tạo một kỹ năng cho Yandex.Alisa
Hãy chuyển sang tạo kỹ năng cho Yandex.Alice.
Để tạo một kỹ năng, bạn cần truy cập trang nhà phát triển Yandex.Dialogues Trang nhà phát triển Yandex.Dialogs, nhấp vào đó "Tạo đối thoại" và chọn "Kỹ năng trong Alice".

Hộp thoại cài đặt kỹ năng sẽ mở ra.

Chúng tôi bắt đầu vào cài đặt kỹ năng.
Nhập tên kỹ năng của bạn.

Tên kích hoạt phải được chọn rất cẩn thận để Alice hiểu nó một cách chính xác, từ các sắc thái - một ứng dụng di động có Alice và các cột như Yandex.Station hoặc Irbis A có thể hiểu các từ theo cách khác.
Chúng ta nhập đường dẫn đến tập lệnh trên máy chủ của mình theo cách tương tự như đối với Telegram, nhưng đây sẽ là một tập lệnh dành riêng cho Alice, ví dụ: www.my_server.ru/webhook_alice.php.

Chúng tôi chọn giọng nói mà kỹ năng sẽ nói, tôi thích giọng nói của Alice hơn.

Nếu bạn dự định chỉ làm việc trên thiết bị di động hoặc trong trình duyệt, thì hãy chọn "Bạn cần một thiết bị có màn hình".
Tiếp theo, nhập cài đặt cho danh mục kỹ năng của Alice. Nếu bạn định sử dụng từ "thương hiệu" để kích hoạt, bạn cần xác minh trang web của thương hiệu trong dịch vụ webmaster.yandex.ru.

Đó là tất cả với các cài đặt, hãy chuyển sang các tập lệnh.
Kịch bản bot Telegram
Hãy bắt đầu với một kịch bản cho Telegram.
Chúng tôi kết nối thư viện nơi các tin nhắn từ bot và Alice sẽ được xử lý:
include_once 'webhook_parse.php';
Chúng tôi đặt mã thông báo cho bot của mình:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Chúng tôi nhận được dữ liệu:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Phân tích dữ liệu thành các biến:
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);
}
Bây giờ bạn có thể làm việc với các biến:
$tokens - đây là tất cả các từ mà người dùng đã nhập
$user_id - id người dùng ở đây
$msg_chat_id - trò chuyện trong đó bot nhận được lệnh
$msg_user_name - tên người dùng
Tiếp theo, chúng ta gọi hàm Parse_Tokens để xử lý:
$Out_Str = Parse_Tokens($tokens);
Và gửi phản hồi:
Send_Out($user_id, $Out_Str);
chức năng Send_Out rất đơn giản và trông như thế này:
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);
}
Kịch bản kỹ năng cho Yandex.Alisa
Bây giờ hãy chuyển sang kịch bản cho Alice, nó gần giống như đối với Telegram.
Chúng tôi cũng kết nối thư viện nơi các tin nhắn từ bot và Alice sẽ được xử lý, cùng với thư viện có các lớp dành cho Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Chúng tôi nhận được dữ liệu:
$data = json_decode(trim(file_get_contents('php://input')), true);
Phân tích dữ liệu thành các biến:
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'];}
}
}
Có một vài biến ít hơn ở đây:
$tokens - đây là tất cả các từ mà người dùng đã nhập
$user_id - id người dùng ở đây
Yandex liên tục ping các kỹ năng đã xuất bản và tôi đã thêm một dòng để thoát ngay tập lệnh mà không bắt đầu xử lý toàn bộ thông báo:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Chúng tôi gọi hàm Parse_Tokens để xử lý, nó giống như đối với Telegram:
$Out_Str = Parse_Tokens($tokens);
Và gửi phản hồi:
Send_Out($user_id, $Out_Str);
Hàm Send_Out ở đây phức tạp hơn:
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();
}
Đã hoàn thành kịch bản cho Alice.
Bản thân tập lệnh xử lý Parse_Tokens được tạo hoàn toàn để làm ví dụ, bạn có thể thực hiện bất kỳ kiểm tra và xử lý nào ở đó.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Nếu bạn cần giao tiếp với người dùng ở dạng phức tạp hơn là câu hỏi-câu trả lời, thì bạn sẽ cần lưu $user_id của người dùng và dữ liệu đã nhận được từ người dùng trong cơ sở dữ liệu (ví dụ: mysql) và phân tích chúng trong hàm Parse_Tokens.
Trên thực tế, đây là gần như tất cả mọi thứ, nếu mọi thứ được thực hiện chính xác, thì bot Telegram đã có sẵn, kỹ năng của Alice có thể được kiểm tra hộp thoại.yandex.ru/developerbằng cách chuyển đến kỹ năng mới của bạn trên tab thử nghiệm.

Nếu mọi thứ hoạt động bình thường, bạn có thể gửi kỹ năng để kiểm duyệt bằng cách nhấp vào nút "Để kiểm duyệt".
Bây giờ bạn có hai bot cho các nền tảng khác nhau cùng một lúc, hoạt động theo cùng một cách.
Tài liệu cho dịch vụ Yandex.Dialogues đây
Tập lệnh đầy đủ được đăng trên github tải về.
Nguồn: www.habr.com
