Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Guten Tag.

Es gibt viele Artikel über Telegram-Bots, aber nur wenige schreiben über die Fähigkeiten für Alice. Informationen darüber, wie man einen einheitlichen Bot erstellt, habe ich überhaupt nicht gefunden. Daher möchte ich meine Erfahrungen darüber teilen, wie man einen einfachen Telegram-Bot und ein Skill für Yandex.Alice für eine Website erstellt, die über ein gemeinsames Funktional verfügt.

Ich werde nicht erklären, wie man einen Webserver einrichtet und ein SSL-Zertifikat erhält, darüber gibt es bereits genügend Informationen.

Erstellung eines Telegram-Bots

Zuerst erstellen wir einen Telegram-Bot. Dazu gehen wir zu Telegram und finden den Bot BotFather.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Wählen Sie /newbot

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Geben Sie den Namen des Bots ein, auf den er reagieren soll, und dann geben Sie den benutzernamen des Bots ein. In der Antwort erhalten wir ein Token zur Verwaltung des Bots, dieses Schlüssel notieren wir, es wird uns später nützlich sein.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Der nächste Schritt besteht darin, den Telegram-Servern mitzuteilen, an welchen Server die Daten vom Bot gesendet werden sollen. Dazu erstellen wir einen Link im Format:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____PFAD_ZUM_SCRIPT___

___TOKEN___ ersetzen wir durch unser zuvor erhaltenes Bot-Token.

____PFAD_ZUM_SCRIPT___ ersetzen wir durch die Adresse des Skripts auf unserem Server, wo die Datenverarbeitung stattfinden wird (zum Beispiel www.mein_server.de/webhook_telegram.php).

Es gibt ein Problem, der Server api.telegram.org ist blockiert, aber man kann Folgendes tun: den günstigsten Server mieten, der Server wo keine Einschränkungen bestehen, und von der Konsole dieses Servers den Befehl geben

wget ___ERHALTENDER_ADRESSE___

Alles, der Telegram-Bot ist erstellt und mit Ihrem verbunden. Server.

Einen Skill für Yandex.Alice erstellen

Lassen Sie uns mit der Erstellung eines Skills für Yandex.Alice beginnen.

Um einen Skill zu erstellen, müssen Sie zur Entwicklerseite von Yandex.Dialoge gehen der Entwicklerseite von Yandex.Dialoge, dort auf „Dialog erstellen“ klicken und „Skill in Alice“ auswählen.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Es öffnet sich der Dialog zur Konfiguration des Skills.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Wir beginnen mit der Eingabe der Skill-Einstellungen.

Geben Sie den Namen Ihres Skills ein.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Der Aktivierungsname sollte sehr sorgfältig gewählt werden, damit Alice ihn richtig versteht. Ein wichtiger Hinweis: Das mobile App mit Alice und Lautsprecher wie Yandex.Station oder Irbis A können Wörter unterschiedlich wahrnehmen.

Geben Sie den Pfad zum Skript auf unserem Server ebenso ein wie für Telegram, aber dies wird ein Skript speziell für Alice sein, z.B. www.my_server.ru/webhook_alice.php.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Wählen Sie die Stimme, mit der der Skill sprechen wird; mir gefällt die Stimme von Alice am besten.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Wenn die Arbeit nur auf mobilen Geräten oder im Browser geplant ist, wählen wir „Ein Gerät mit Bildschirm ist erforderlich“ aus.

Geben Sie dann die Einstellungen für den Skill-Katalog von Alice ein. Wenn Sie ein Aktivierungswort verwenden möchten, das einer Marke entspricht, müssen Sie die Website der Marke im Service webmaster.yandex.ru verifizieren.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Mit den Einstellungen ist alles erledigt, machen wir mit den Skripten weiter.

Telegram-Bot-Skript

Beginnen wir mit dem Skript für Telegram.

Binden Sie die Bibliothek ein, in der die Nachrichten von Bot und Alice verarbeitet werden:

include_once 'webhook_parse.php';

Legen Sie das Token für unseren Bot fest:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Daten erhalten:

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

Daten in Variablen aufteilen:

if (!$request)
{
  die();
    // Fehlerausgabe (Anfrage ist kein gültiges JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Fehlerausgabe (Anfrage hat keine Nachricht)
}
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 wir mit den Variablen arbeiten:

$tokens — hier sind jetzt alle Wörter, die der Benutzer eingegeben hat

$user_id — hier ist die ID des Benutzers

$msg_chat_id — der 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 die Antwort:

Send_Out($user_id, $Out_Str);

Die Funktion Send_Out 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);
}

 

Script für den Skill von Yandex.Alice

Kommen wir nun zum Skript für Alice, das fast identisch mit dem für Telegram ist.

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

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

Daten erhalten:

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

Daten in Variablen aufteilen:

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 etwas weniger benötigte Variablen:

$tokens — hier sind jetzt alle Wörter, die der Benutzer eingegeben hat

$user_id — hier ist die ID des Benutzers

Yandex pingt ständig veröffentlichte Skills, und ich habe eine Zeile hinzugefügt, um sofort aus dem Skript auszutreten, ohne die vollständige Nachrichtenverarbeitung zu starten:

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

Wir rufen die Funktion Parse_Tokens zur Verarbeitung auf, die die gleiche ist wie für Telegram:

$Out_Str = Parse_Tokens($tokens);

Und senden die Antwort:

Send_Out($user_id, $Out_Str);

Die Funktion Send_Out 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) 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 abgeschlossen.

Das Skript zur Verarbeitung von Parse_Tokens wurde nur als Beispiel erstellt; Sie können dort beliebige Prüfungen und Verarbeitungen durchführen.

function Parse_Tokens($tokens)
{
  $out = "";
  // tun Sie etwas mit den Tokens //
  $out =  "Ihr eingegebener " . count($tokens) . " Wörter: " . implode($tokens, " ");
  return $out;
}

Wenn Sie eine komplexere Benutzerinteraktion als eine Frage-Antwort-Konversation benötigen, müssen Sie die $user_id des Benutzers sowie die bereits erhaltenen Daten in einer Datenbank (z. B. MySQL) speichern und diese in der Funktion Parse_Tokens analysieren.

Das ist eigentlich fast alles; wenn alles richtig gemacht wurde, ist der Telegram-Bot bereits verfügbar, das Skill von Alice kann überprüft werden. dialogs.yandex.ru/developer, indem Sie zu Ihrem neuen Skill im Tab "Testen" gehen.

Yandex.Alice und ein Telegram-Bot in PHP mit einheitlicher Funktionalität.

Wenn alles korrekt funktioniert, können Sie die Fähigkeit zur Moderation einreichen, indem Sie auf die Schaltfläche „Zur Moderation“ klicken.

Jetzt haben Sie gleich zwei Bots für verschiedene Plattformen, die identisch arbeiten.

Dokumentation zum Dienst Yandex.Dialogs hier

Die vollständigen Skripte sind auf GitHub veröffentlicht. herunterladen.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern | ProHoster