Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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ì vậy, tôi sẽ không cho bạn biết cách nâng cấp máy chủ web và nhận chứng chỉ ssl, đã có đủ bài viết về nó.

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 ở đó.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

Chọn /newbot

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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____ chúng tôi 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 dữ liệu sẽ được xử lý (ví dụ: www.my_server.ru/webhook_telegram.php).

Có một vấn đề ở đây, máy chủ api.telegram.org đang bị chặn, nhưng bạn có thể làm điều này: thuê máy chủ rẻ nhất, nơi không có giới hạn 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à kết nối với máy chủ của bạn.

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".

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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 tôi nhập đường dẫn đến tập lệnh trên máy chủ của mình giống như cách đối với Telegram, nhưng đó sẽ là tập lệnh dành riêng cho Alice chẳng hạn www.my_server.ru/webhook_alice.php.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

Đó 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.

Yandex.Alisa và Telegram bot bằng PHP có cùng chức năng

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

Thêm một lời nhận xét