Bonjour.
Il existe de nombreux articles sur les bots Telegram, mais peu parlent des compétences pour Alice. Je n'ai trouvé aucune information sur comment créer un bot unifié, donc j'ai décidé de partager mon expérience sur la façon de créer un simple bot Telegram et une compétence Yandex.Alice pour un site, ayant une fonctionnalité unique.
Alors, comment configurer un serveur web et obtenir un certificat ssl je ne vais pas en parler, c'est déjà suffisamment documenté.
Création d'un bot Telegram
D'abord, créons un bot Telegram. Pour cela, allons dans Telegram et trouvons le bot BotFather.


Choisissons /newbot

Nous entrons le nom du bot, celui auquel il répondra, puis nous entrons le nom du bot et en retour, nous recevons un token pour contrôler le bot. Notons cette clé, elle nous sera utile plus tard.

La prochaine étape est d'informer les serveurs Telegram sur quel serveur envoyer les données du bot. Pour cela, nous faisons un lien du type :
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____CHEMIN_VERS_SCRIPT___
Remplacez ___TOKEN___ par notre token de bot obtenu précédemment
Remplacez ____CHEMIN_VERS_SCRIPT___ par l'adresse du script sur notre serveur où le traitement des données aura lieu (par exemple, www.my_server.ru/webhook_telegram.php).
Il y a un problème, le serveur api.telegram.org est bloqué, mais on peut faire ainsi : louer le moins cher serveur où il n'y a pas de restrictions et donner depuis la console de ce serveur la commande
wget ___ADRESSE_OBTENUE___
Voilà, le bot Telegram est créé et lié à votre serveur.
Création d'une compétence pour Yandex.Alice
Passons à la création d'une compétence pour Yandex.Alice.
Pour créer une compétence, il faut se rendre sur la page des développeurs Yandex.Dialogues la page des développeurs Yandex.Dialogues, cliquez sur « Créer un dialogue » et choisissez « Compétence dans Alice ».

Une fenêtre de paramètres de compétence s'ouvrira.

Commençons à entrer les paramètres de la compétence.
Entrez le nom de votre compétence.

Le nom d'activation doit être choisi très attentivement, afin qu'Alice le comprenne correctement. À noter que l'application mobile avec Alice et certains haut-parleurs comme Yandex.Station ou Irbis A peuvent interpréter les mots différemment.
Entrez le chemin vers le script sur notre serveur de la même manière que pour Telegram, mais ce sera un script spécifiquement pour Alice, par exemple www.my_server.ru/webhook_alice.php.

Choisissez la voix avec laquelle la compétence parlera, personnellement je préfère la voix d'Alice.

Si une utilisation uniquement sur des appareils mobiles ou dans un navigateur est prévue, choisissez « Besoin d'un appareil avec écran ».
Ensuite, nous saisissons les paramètres pour le répertoire des compétences d'Alice. Si vous prévoyez d'utiliser le mot — marque, vous devrez vérifier le site de la marque sur le service webmaster.yandex.ru.

C'est tout pour les paramètres, passons aux scripts.
Script du bot Telegram
Commençons par le script pour Telegram.
Nous connectons la bibliothèque où les messages du bot et d'Alice seront traités :
include_once 'webhook_parse.php';
Nous définissons le token de notre bot :
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Nous récupérons les données :
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Nous extrayons les données dans des variables :
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);
}
Nous pouvons maintenant travailler avec les variables :
$tokens — toutes les mots que l'utilisateur a saisis
$user_id — ici se trouve l'id de l'utilisateur
$msg_chat_id — le chat dans lequel le bot a reçu la commande
$msg_user_name — le prénom de l'utilisateur
Ensuite, nous appelons la fonction Parse_Tokens pour le traitement :
$Out_Str = Parse_Tokens($tokens);
Et nous envoyons la réponse :
Send_Out($user_id, $Out_Str);
La fonction Send_Out est simple et ressemble à ceci :
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 de compétence pour Yandex.Alice
Passons maintenant au script pour Alice, qui est presque identique à celui pour Telegram.
Nous connectons également la bibliothèque où les messages du bot et d'Alice seront traités, plus une bibliothèque avec des classes pour Alice :
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Nous récupérons les données :
$data = json_decode(trim(file_get_contents('php://input')), true);
Nous extrayons les données dans des variables :
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'];}
}
}
Il y a un peu moins de variables ici :
$tokens — toutes les mots que l'utilisateur a saisis
$user_id — ici se trouve l'id de l'utilisateur
Yandex pingue constamment les compétences publiées, et j'ai ajouté une ligne pour sortir immédiatement du script sans exécuter le traitement complet du message :
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Nous appelons la fonction Parse_Tokens pour le traitement, c'est la même que pour Telegram :
$Out_Str = Parse_Tokens($tokens);
Et nous envoyons la réponse :
Send_Out($user_id, $Out_Str);
La fonction Send_Out est un peu plus complexe ici :
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
//////////// GÉNÉRER LA BASE DE SORTIE ////////////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
//////////// FIN DE GÉNÉRATION DE LA BASE DE SORTIE ////////////
//////////// GÉNÉRATION DU MESSAGE DE SORTIE ////////////
$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();
}
Script pour Alice terminé.
Le script de traitement Parse_Tokens a été fait simplement à titre d'exemple, vous pouvez y faire toutes sortes de vérifications et de traitements.
function Parse_Tokens($tokens)
{
$out = "";
// faites quelque chose avec les tokens //
$out = "Vous avez entré " . count($tokens) . " mots : " . implode($tokens, " ");
return $out;
}
Si vous avez besoin d'une interaction avec l'utilisateur plus complexe qu'une simple question-réponse, vous devrez sauvegarder dans la base de données (par exemple mysql) le $user_id de l'utilisateur et les données déjà reçues de l'utilisateur, puis les analyser dans la fonction Parse_Tokens.
C'est presque tout, si tout est fait correctement, le bot Telegram est déjà accessible, vous pouvez vérifier la compétence d'Alice. dialogs.yandex.ru/developer, en vous rendant sur votre nouvelle compétence sous l'onglet tests.

Si tout fonctionne correctement, vous pouvez soumettre la compétence à la modération en appuyant sur le bouton « Soumettre à la modération ».
Vous avez maintenant deux bots pour différentes plates-formes qui fonctionnent de la même manière.
Documentation sur le service Yandex.Dialogues ici
Les scripts complets sont disponibles sur github télécharger.
Source : habr.com
