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.


WĂ€hlen Sie /newbot

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.

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.

Ein Einstellungsdialog fĂŒr die FĂ€higkeit wird geöffnet.

Wir beginnen mit der Eingabe der Einstellungen der FĂ€higkeit.
Geben Sie den Namen Ihrer FĂ€higkeit ein.

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.

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

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.

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.

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
