בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

שָׁלוֹם.

יש הרבה מאמרים בנושא בוטים של טלגרם, אבל מעט אנשים כותבים על מיומנויות עבור אליס, ולא מצאתי שום מידע על איך ליצור בוט בודד, אז החלטתי לשתף את הניסיון שלי על איך ליצור בוט בודד. בוט טלגרם פשוט ומיומנות Yandex.Alice עבור האתר בעל אותה פונקציונליות.

אז, אני לא אגיד לך איך להעלות שרת אינטרנט ולקבל תעודת ssl, מספיק נכתב על זה.

יצירת בוט של טלגרם

ראשית, בואו ניצור בוט של טלגרם, לשם כך נלך לטלגרם ונמצא שם את הבוט BotFather.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

בחר /newbot

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

נזין את שם הבוט שלפיו הוא יגיב, לאחר מכן נזין את שם הבוט, בתגובה נקבל אסימון לשליטה בבוט, נרשום את המפתח הזה, זה יהיה שימושי עבורנו בעתיד.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

השלב הבא הוא לומר לשרתי הטלגרם לאיזה שרת לשלוח נתונים מהבוט. לשם כך, אנו יוצרים קישור לטופס:

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

___TOKEN___ אנו מחליפים בטוקן שלנו מהבוט, שהתקבל קודם לכן

____PATH_TO_SCRIPT____ אנו מחליפים בכתובת של הסקריפט בשרת שלנו שבו הנתונים יעובדו (לדוגמה, www.my_server.ru/webhook_telegram.php).

יש כאן בעיה, שרת api.telegram.org נמצא תחת חסימה, אבל אתה יכול לעשות זאת: לשכור את השרת הזול ביותר שבו אין הגבלות ולתת את הפקודה מהמסוף של השרת הזה

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

זהו, הבוט של הטלגרם נוצר ומחובר לשרת שלך.

יצירת מיומנות עבור Yandex.Alisa

בואו נעבור ליצירת מיומנות עבור Yandex.Alice.

כדי ליצור מיומנות, עליך לעבור לדף המפתחים של Yandex.Dialogues דף המפתחים של Yandex.Dialogs, לחץ שם "צור דיאלוג" ובחר "מיומנות באליס".

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

תיפתח תיבת הדו-שיח של הגדרות המיומנות.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

אנו מתחילים להיכנס להגדרות המיומנות.

הזן את שם המיומנות שלך.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

יש לבחור את שם ההפעלה בקפידה רבה כדי שאליס תבין אותו נכון, מתוך הניואנסים - אפליקציה סלולרית עם אליס ועמודות כמו Yandex.Station או Irbis A יכולה לתפוס מילים אחרת.

אנחנו מכניסים את הנתיב לסקריפט בשרת שלנו באותו אופן כמו לטלגרם, אבל זה יהיה סקריפט ספציפי לאליס, למשל www.my_server.ru/webhook_alice.php.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

אנחנו בוחרים את הקול איתו המיומנות תדבר, אני אוהב יותר את הקול של אליס.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

אם אתה מתכנן לעבוד רק במכשירים ניידים או בדפדפן, בחר "אתה צריך מכשיר עם מסך".

לאחר מכן, היכנס להגדרות עבור קטלוג הכישורים של אליס. אם אתה מתכנן להשתמש במילה "מותג" להפעלה, עליך לאמת את אתר האינטרנט של המותג בשירות webmaster.yandex.ru.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

זה הכל עם ההגדרות, בואו נעבור לתסריטים.

תסריט בוט של טלגרם

נתחיל עם תסריט לטלגרם.

אנו מחברים את הספרייה שבה יעובדו הודעות מהבוט ומאליס:

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 - מזהה משתמש כאן

$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

עכשיו נעבור לתסריט של אליס, זה כמעט כמו של טלגרם.

אנחנו גם מחברים את הספרייה שבה יעובדו הודעות מהבוט ומאליס, בתוספת ספרייה עם שיעורים לאליס:

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 - מזהה משתמש כאן

Yandex כל הזמן פינג מיומנויות שפורסמו, והוספתי שורה כדי לצאת מיד מהסקריפט מבלי להתחיל בעיבוד המלא של ההודעה:

  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.

למעשה, זה כמעט הכל, אם הכל נעשה נכון, אז הבוט של הטלגרם כבר זמין, ניתן לבדוק את המיומנות של אליס dialogs.yandex.ru/developerעל ידי מעבר למיומנות החדשה שלך בכרטיסיית הבדיקות.

בוט Yandex.Alisa ו-Telegram ב-PHP עם אותה פונקציונליות

אם הכל עובד כמו שצריך, אתה יכול לשלוח את המיומנות לניהול על ידי לחיצה על כפתור "לניהול".

עכשיו יש לך שני בוטים לפלטפורמות שונות בו זמנית, שפועלים באותו אופן.

תיעוד עבור שירות Yandex.Dialogues כאן

סקריפטים מלאים שפורסמו ב-github להוריד.

מקור: www.habr.com

הוספת תגובה