Yandex.Alice und Telegram-Bot auf 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, und Informationen darüber, wie man einen einheitlichen Bot erstellt, habe ich überhaupt nicht gefunden. Daher habe ich beschlossen, meine Erfahrungen darüber zu teilen, wie man einen einfachen Telegram-Bot und eine Yandex.Alice-Funktion für eine Website erstellt, die über eine einheitliche Funktionalität verfügt.

Also, wie man einen Webserver hochfährt und erhält ein SSL-Zertifikat werde ich nicht erzählen, darüber gibt es genug Informationen.

Erstellung eines Telegram-Bots

Zuerst erstellen wir einen Telegram-Bot, dafür gehen wir zu Telegram und suchen dort den Bot BotFather.

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

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

Wählen Sie /newbot

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

Geben Sie den Namen des Bots ein, auf den er hören wird, dann geben Sie den Benutzernamen des Bots ein, als Antwort erhalten wir einen Token zur Verwaltung des Bots, speichern Sie diesen Schlüssel, er wird uns später nützlich sein.

Yandex.Alice und Telegram-Bot auf 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 in der Form:

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

Wir ersetzen ___TOKEN___ mit unserem zuvor erhaltenen Token vom Bot

____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).

Hier gibt es ein Problem, der Server api.telegram.org ist blockiert, aber man kann folgendes tun: den günstigsten Server mieten, Server wo es keine Einschränkungen gibt, und ihm aus der Konsole dieses Servers den Befehl geben

wget ___ERHALTENER_ADRESSE___

Fertig, der Telegram-Bot wurde erstellt und mit Ihrem Server.

Erstellung einer Fähigkeit für Yandex.Alice

Kommen wir zur Erstellung einer Fähigkeit für Yandex.Alice.

Um eine Fähigkeit zu erstellen, müssen wir zur Entwicklerseite von Yandex.Dialoge gehen zur Entwicklerseite von Yandex.Dialoge, dort auf „Dialog erstellen“ klicken und „Fähigkeit in Alice“ auswählen.

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

Ein Einstellungsdialog für die Fähigkeit wird geöffnet.

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

Wir beginnen mit der Eingabe der Einstellungen der Fähigkeit.

Geben Sie den Namen Ihrer Fähigkeit ein.

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

Der Aktivierungsname sollte sehr sorgfältig ausgewählt werden, damit Alice ihn richtig versteht. Bei den Nuancen – die mobile Anwendung 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 ebenfalls ein, wie für Telegram, aber dies wird ein Skript speziell für Alice sein, zum Beispiel www.mein_server.de/webhook_alice.php.

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

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

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

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

Geben Sie die Einstellungen für den Skill-Katalog von Alice ein. Wenn Sie das Wort — Marke zur Aktivierung verwenden möchten, müssen Sie die Verifizierung der Markenwebsite im Service webmaster.yandex.ru durchlaufen.

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

Mit den Einstellungen sind wir durch, nun kommen wir zu den Skripten.

Telegram-Bot-Skript

Lassen Sie uns mit dem Skript für Telegram beginnen.

Wir binden die Bibliothek ein, die die Nachrichten vom Bot und von Alice verarbeitet:

include_once 'webhook_parse.php';

Wir definieren das Token unseres Bots:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Daten abrufen:

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

Wir zerlegen die 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 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 — der Name des Benutzers

Jetzt rufen wir die Funktion Parse_Tokens zur Verarbeitung auf:

$Out_Str = Parse_Tokens($tokens);

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

 

Skill-Skript für Yandex.Alice

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

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

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

Daten abrufen:

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

Wir zerlegen die 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 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 die veröffentlichten Skills, und ich habe eine Zeile hinzugefügt, um sofort aus dem Skript auszusteigen, 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, sie ist die gleiche wie für Telegram:

$Out_Str = Parse_Tokens($tokens);

Und wir 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 fertig.

Das Skript zur Verarbeitung Parse_Tokens habe ich nur als Beispiel erstellt, Sie können dort beliebige Überprüfungen und Verarbeitungen vornehmen.

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

Wenn Sie mit dem Benutzer komplexere Interaktionen als Frage-Antwort benötigen, müssen Sie $user_id des Benutzers und bereits empfangene 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, den Skill von Alice können Sie testen. dialogs.yandex.ru/developer, indem Sie zu Ihrem neuen Skill auf den Tab Testen wechseln.

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

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

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

Dokumentation zum Yandex.Dialogs-Service hier

Die vollständigen Skripte sind auf GitHub verfügbar herunterladen.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster