Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

Choisissons /newbot

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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 ».

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

Commençons à entrer les paramètres de la compétence.

Entrez le nom de votre compétence.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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.

Yandex.Alice et le bot Telegram en PHP avec une fonctionnalité unique

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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster