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.


Wählen Sie /newbot

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.

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.

Es öffnet sich der Dialog zur Konfiguration des Skills.

Wir beginnen mit der Eingabe der Skill-Einstellungen.
Geben Sie den Namen Ihres Skills ein.

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.

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

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.

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.

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
