Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Καλημέρα.

Υπάρχουν πολλά άρθρα σχετικά με το θέμα των ρομπότ Telegram, αλλά λίγοι γράφουν για δεξιότητες για την Alice και δεν βρήκα πληροφορίες για το πώς να φτιάξω ένα μόνο ρομπότ, γι' αυτό αποφάσισα να μοιραστώ την εμπειρία μου για το πώς να φτιάξω ένα απλό bot Telegram και η ικανότητα Yandex.Alice για τον ιστότοπο που έχει την ίδια λειτουργικότητα.

Επομένως, δεν θα σας πω πώς να δημιουργήσετε έναν διακομιστή ιστού και να αποκτήσετε ένα πιστοποιητικό ssl, έχουν γραφτεί αρκετά γι 'αυτό.

Δημιουργία bot Telegram

Αρχικά, ας δημιουργήσουμε ένα bot Telegram, για αυτό πηγαίνουμε στο Telegram και βρίσκουμε το bot BotFather εκεί.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Επιλέξτε /newbot

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Εισάγουμε το όνομα του ρομπότ με το οποίο θα απαντήσει, μετά εισάγουμε το όνομα του ρομπότ, σε απάντηση παίρνουμε ένα διακριτικό για τον έλεγχο του ρομπότ, σημειώνουμε αυτό το κλειδί, θα μας είναι χρήσιμο στο μέλλον.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Το επόμενο βήμα είναι να πείτε στους διακομιστές του Telegram σε ποιον διακομιστή θα στείλουν δεδομένα από το bot. Για να γίνει αυτό, κάνουμε έναν σύνδεσμο της φόρμας:

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

___TOKEN___ αντικαθιστούμε με το διακριτικό μας από το bot, που λάβαμε νωρίτερα

____PATH_TO_SCRIPT____ αντικαθιστούμε με τη διεύθυνση του σεναρίου στον διακομιστή μας όπου θα γίνει η επεξεργασία των δεδομένων (για παράδειγμα, www.my_server.ru/webhook_telegram.php).

Υπάρχει ένα πρόβλημα εδώ, ο διακομιστής api.telegram.org είναι υπό αποκλεισμό, αλλά μπορείτε να το κάνετε: νοικιάσετε τον φθηνότερο διακομιστή όπου δεν υπάρχουν περιορισμοί και δώστε την εντολή από την κονσόλα αυτού του διακομιστή

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

Αυτό ήταν όλο, το bot Telegram δημιουργείται και συνδέεται με τον διακομιστή σας.

Δημιουργία δεξιότητας για το Yandex.Alisa

Ας προχωρήσουμε στη δημιουργία μιας δεξιότητας για το Yandex.Alice.

Για να δημιουργήσετε μια δεξιότητα, πρέπει να μεταβείτε στη σελίδα προγραμματιστών Yandex.Dialogues Σελίδα προγραμματιστή Yandex.Dialogs, κάντε κλικ εκεί «Δημιουργία διαλόγου» και επιλέξτε «Ικανότητα στην Αλίκη».

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Θα ανοίξει το παράθυρο διαλόγου ρυθμίσεων δεξιοτήτων.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Αρχίζουμε να μπαίνουμε στις ρυθμίσεις δεξιοτήτων.

Εισαγάγετε το όνομα της ικανότητάς σας.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Το όνομα ενεργοποίησης θα πρέπει να επιλεγεί πολύ προσεκτικά, ώστε η Alice να το καταλάβει σωστά, από τις αποχρώσεις - μια εφαρμογή για κινητά με Alice και στήλες όπως το Yandex.Station ή το Irbis A μπορεί να αντιληφθεί τις λέξεις διαφορετικά.

Εισάγουμε τη διαδρομή προς το σενάριο στον διακομιστή μας με τον ίδιο τρόπο όπως για το Telegram, αλλά θα είναι ένα σενάριο ειδικά για την Alice, για παράδειγμα www.my_server.ru/webhook_alice.php.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Επιλέγουμε τη φωνή με την οποία θα μιλήσει η δεξιοτεχνία, μου αρέσει περισσότερο η φωνή της Αλίκης.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Εάν σκοπεύετε να εργαστείτε μόνο σε κινητές συσκευές ή σε πρόγραμμα περιήγησης, επιλέξτε "Χρειάζεστε μια συσκευή με οθόνη".

Στη συνέχεια, εισαγάγετε τις ρυθμίσεις για τον κατάλογο δεξιοτήτων της Αλίκης. Εάν σκοπεύετε να χρησιμοποιήσετε τη λέξη "μάρκα" για ενεργοποίηση, πρέπει να επαληθεύσετε τον ιστότοπο της μάρκας στην υπηρεσία webmaster.yandex.ru.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Αυτό είναι όλο με τις ρυθμίσεις, ας περάσουμε στα σενάρια.

Σενάριο bot Telegram

Ας ξεκινήσουμε με ένα σενάριο για το Telegram.

Συνδέουμε τη βιβλιοθήκη όπου θα υποβάλλονται σε επεξεργασία τα μηνύματα από το bot και την Alice:

include_once 'webhook_parse.php';

Ορίζουμε το διακριτικό του bot μας:

$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 - συνομιλία στην οποία το bot έλαβε την εντολή

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

Συνδέουμε επίσης τη βιβλιοθήκη όπου θα υποβάλλονται σε επεξεργασία τα μηνύματα από το bot και την Alice, καθώς και μια βιβλιοθήκη με κλάσεις για την Alice:

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 κάνει συνεχώς 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 είναι ήδη διαθέσιμο, η ικανότητα της Αλίκης μπορεί να ελεγχθεί dialogs.yandex.ru/developerμεταβαίνοντας στη νέα σας δεξιότητα στην καρτέλα δοκιμών.

Yandex.Alisa και Telegram bot σε PHP με την ίδια λειτουργικότητα

Εάν όλα λειτουργούν σωστά, μπορείτε να στείλετε την ικανότητα για εποπτεία κάνοντας κλικ στο κουμπί "Για εποπτεία".

Τώρα έχετε δύο bots για διαφορετικές πλατφόρμες ταυτόχρονα, τα οποία λειτουργούν με τον ίδιο τρόπο.

Τεκμηρίωση για την υπηρεσία Yandex.Dialogues εδώ

Τα πλήρη σενάρια δημοσιεύτηκαν στο github κατεβάσετε.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο