Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Guten Tag.

Es gibt viele Artikel zum Thema Telegram-Bots, aber nur wenige Leute schreiben über Fähigkeiten für Alice, und ich habe keine Informationen darüber gefunden, wie man einen einzelnen Bot erstellt, also habe ich beschlossen, meine Erfahrungen darüber zu teilen, wie man einen erstellt einfacher Telegram-Bot und der Yandex.Alice-Skill für die Site mit der gleichen Funktionalität.

Ich werde Ihnen also nicht sagen, wie Sie einen Webserver einrichten und ein SSL-Zertifikat erhalten, es wurde bereits genug darüber geschrieben.

Erstellen eines Telegram-Bots

Erstellen wir zunächst einen Telegram-Bot. Dazu gehen wir zu Telegram und finden dort den BotFather-Bot.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wählen Sie /newbot

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wir geben den Namen des Bots ein, mit dem er antworten wird, dann geben wir den Namen des Bots ein, als Antwort erhalten wir einen Token zur Steuerung des Bots, wir schreiben diesen Schlüssel auf, er wird uns in Zukunft nützlich sein.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Der nächste Schritt besteht darin, den Telegram-Servern mitzuteilen, an welchen Server sie Daten vom Bot senden sollen. Dazu erstellen wir einen Link des Formulars:

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

___TOKEN___ ersetzen wir durch unser Token vom Bot, das wir zuvor erhalten haben

____PATH_TO_SCRIPT____ ersetzen wir durch die Adresse des Skripts auf unserem Server, wo die Daten verarbeitet werden (z. B. www.my_server.ru/webhook_telegram.php).

Hier liegt ein Problem vor, der Server api.telegram.org ist blockiert, aber Sie können Folgendes tun: Mieten Sie den günstigsten Server, auf dem es keine Einschränkungen gibt, und geben Sie den Befehl über die Konsole dieses Servers ein

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

Das war's, der Telegram-Bot wird erstellt und mit Ihrem Server verbunden.

Erstellen eines Skills für Yandex.Alisa

Fahren wir mit der Erstellung eines Skills für Yandex.Alice fort.

Um einen Skill zu erstellen, müssen Sie zur Entwicklerseite von Yandex.Dialogues gehen Yandex.Dialogs-Entwicklerseite, klicken Sie dort auf „Dialog erstellen“ und wählen Sie „Skill in Alice“.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Der Dialog mit den Skill-Einstellungen wird geöffnet.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wir beginnen mit der Eingabe der Skill-Einstellungen.

Geben Sie den Namen Ihres Skills ein.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Der Aktivierungsname sollte sehr sorgfältig gewählt werden, damit Alice ihn von den Nuancen her richtig versteht – eine mobile Anwendung mit Alice und Spalten wie Yandex.Station oder Irbis A kann Wörter unterschiedlich wahrnehmen.

Den Pfad zum Skript geben wir auf unserem Server auf die gleiche Weise ein wie bei Telegram, allerdings wird es beispielsweise ein Skript speziell für Alice sein www.my_server.ru/webhook_alice.php.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wir wählen die Stimme aus, mit der die Fertigkeit sprechen soll. Mir gefällt Alices Stimme besser.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wenn Sie nur auf Mobilgeräten oder im Browser arbeiten möchten, wählen Sie „Sie benötigen ein Gerät mit Bildschirm“.

Geben Sie als Nächstes die Einstellungen für Alices Kompetenzkatalog ein. Wenn Sie das Wort „Marke“ zur Aktivierung verwenden möchten, müssen Sie die Website der Marke im Dienst webmaster.yandex.ru überprüfen.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Das ist alles mit den Einstellungen, kommen wir nun zu den Skripten.

Telegram-Bot-Skript

Beginnen wir mit einem Skript für Telegram.

Wir verbinden die Bibliothek, in der Nachrichten vom Bot und Alice verarbeitet werden:

include_once 'webhook_parse.php';

Wir setzen den Token unseres Bots:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Wir erhalten Daten:

$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);

Analysieren der Daten in Variablen:

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);
}

Jetzt können Sie mit Variablen arbeiten:

$tokens – hier sind nun alle Wörter, die der Benutzer eingegeben hat

$user_id – Benutzer-ID hier

$msg_chat_id – Chat, in dem der Bot den Befehl erhalten hat

$msg_user_name – Benutzername

Als nächstes rufen wir die Funktion Parse_Tokens zur Verarbeitung auf:

$Out_Str = Parse_Tokens($tokens);

Und senden Sie eine Antwort:

Send_Out($user_id, $Out_Str);

Die Send_Out-Funktion ist einfach und sieht so aus:

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);
}

Skill-Skript für Yandex.Alisa

Kommen wir nun zum Skript für Alice, es ist fast das gleiche wie für Telegram.

Wir verbinden auch die Bibliothek, in der Nachrichten vom Bot und Alice verarbeitet werden, sowie eine Bibliothek mit Klassen für Alice:

include_once 'classes_alice.php';
include_once 'webhook_parse.php';

Wir erhalten Daten:

$data = json_decode(trim(file_get_contents('php://input')), true);

Analysieren der Daten in Variablen:

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'];}
  }
}

Hier gibt es ein paar Variablen weniger:

$tokens – hier sind nun alle Wörter, die der Benutzer eingegeben hat

$user_id – Benutzer-ID hier

Yandex pingt ständig veröffentlichte Fähigkeiten und ich habe eine Zeile hinzugefügt, um das Skript sofort zu beenden, ohne die vollständige Verarbeitung der Nachricht zu starten:

  if (strpos($tokens[0], "ping") > -1)     {Send_Out("pong", "", true);}

Zur Verarbeitung rufen wir die Funktion Parse_Tokens auf, sie ist die gleiche wie für Telegram:

$Out_Str = Parse_Tokens($tokens);

Und senden Sie eine Antwort:

Send_Out($user_id, $Out_Str);

Die Send_Out-Funktion ist hier komplizierter:

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();
}

Das Skript für Alice ist fertig.

Das Parse_Tokens-Verarbeitungsskript selbst wurde lediglich als Beispiel erstellt. Sie können dort alle Prüfungen und Verarbeitungen durchführen.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
  return $out;
}

Wenn Sie mit einem Benutzer in komplexerer Form als einer Frage-Antwort-Form kommunizieren müssen, müssen Sie die $user_id des Benutzers und die bereits vom Benutzer erhaltenen Daten in der Datenbank (z. B. MySQL) speichern und analysieren die Parse_Tokens-Funktion.

Eigentlich ist das fast alles, wenn alles richtig gemacht wird, dann ist der Telegram-Bot bereits verfügbar, Alices Skill kann überprüft werden dialogs.yandex.ru/developerindem Sie auf der Registerkarte „Testen“ zu Ihrem neuen Skill gehen.

Yandex.Alisa und Telegram-Bot in PHP mit der gleichen Funktionalität

Wenn alles korrekt funktioniert, können Sie den Skill zur Moderation senden, indem Sie auf die Schaltfläche „Zur Moderation“ klicken.

Jetzt haben Sie zwei Bots für verschiedene Plattformen gleichzeitig, die auf die gleiche Weise funktionieren.

Dokumentation für den Yandex.Dialogues-Dienst hier

Vollständige Skripte auf Github veröffentlicht скачать.

Source: habr.com

Kommentar hinzufügen