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.
Wählen Sie /newbot
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.
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.
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
Der Dialog mit den Skill-Einstellungen wird geöffnet.
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 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
Wir wählen die Stimme aus, mit der die Fertigkeit sprechen soll. Mir gefällt Alices Stimme besser.
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.
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
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
Vollständige Skripte auf Github veröffentlicht
Source: habr.com