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
