Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Bonne journée.

Il existe de nombreux articles sur les robots Telegram, mais peu de gens écrivent sur les compétences d'Alice, et je n'ai trouvé aucune information sur la façon de créer un seul bot, j'ai donc décidé de partager mon expérience sur la façon de créer un un simple bot Telegram et la compétence Yandex.Alice pour le site ayant la même fonctionnalité.

Donc, je ne vais pas vous expliquer comment créer un serveur Web et obtenir un certificat SSL, on a suffisamment écrit à ce sujet.

Création d'un bot Telegram

Tout d'abord, créons un bot Telegram, pour cela nous allons sur Telegram et y trouvons le bot BotFather.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Choisissez /newbot

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Nous entrons le nom du bot par lequel il répondra, puis nous entrons le nom du bot, en réponse nous obtenons un jeton pour contrôler le bot, nous écrivons cette clé, elle nous sera utile à l'avenir.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

L'étape suivante consiste à indiquer aux serveurs Telegram à quel serveur envoyer les données du bot. Pour ce faire, nous faisons un lien du formulaire :

https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___

___TOKEN___ nous remplaçons par notre token du bot, reçu plus tôt

____PATH_TO_SCRIPT____ nous remplaçons par l'adresse du script sur notre serveur où les données seront traitées (par exemple, www.my_server.ru/webhook_telegram.php).

Il y a un problème ici, le serveur api.telegram.org est bloqué, mais vous pouvez faire ceci : louer le serveur le moins cher où il n'y a pas de restrictions et donner la commande depuis la console de ce serveur

wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___

Ça y est, le bot Telegram est créé et connecté à votre serveur.

Création d'une compétence pour Yandex.Alisa

Passons à la création d'une compétence pour Yandex.Alice.

Pour créer une compétence, vous devez vous rendre sur la page des développeurs Yandex.Dialogues Page développeur Yandex.Dialogs, cliquez ici "Créer un dialogue" et sélectionnez "Compétence dans Alice".

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

La boîte de dialogue des paramètres de compétences s'ouvrira.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Nous commençons à entrer les paramètres de compétences.

Entrez le nom de votre compétence.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Le nom d'activation doit être choisi très soigneusement pour qu'Alice le comprenne correctement, parmi les nuances - une application mobile avec Alice et des colonnes comme Yandex.Station ou Irbis A peut percevoir les mots différemment.

On rentre le chemin du 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.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Nous choisissons la voix avec laquelle la compétence parlera, j'aime davantage la voix d'Alice.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Si vous prévoyez de travailler uniquement sur des appareils mobiles ou dans un navigateur, sélectionnez « Vous avez besoin d'un appareil avec un écran ».

Ensuite, entrez les paramètres du catalogue de compétences d'Alice. Si vous envisagez d'utiliser le mot « marque » pour l'activation, vous devez vérifier le site Web de la marque dans le service webmaster.yandex.ru.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

C'est tout avec les paramètres, passons aux scripts.

Script de robot Telegram

Commençons par un 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 recevons des données :

$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);

Analyser les données en 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);
}

Vous pouvez désormais travailler avec des variables :

$tokens - voici maintenant tous les mots saisis par l'utilisateur

$user_id - ID utilisateur ici

$msg_chat_id - chat dans lequel le bot a reçu la commande

$msg_user_name - nom d'utilisateur

Ensuite, nous appelons la fonction Parse_Tokens pour le traitement :

$Out_Str = Parse_Tokens($tokens);

Et envoyez une 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.Alisa

Passons maintenant au script pour Alice, c'est quasiment le même que pour Telegram.

Nous connectons également la bibliothèque où les messages du bot et d'Alice seront traités, ainsi qu'une bibliothèque avec des classes pour Alice :

include_once 'classes_alice.php';
include_once 'webhook_parse.php';

Nous recevons des données :

$data = json_decode(trim(file_get_contents('php://input')), true);

Analyser les données en 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 quelques variables en moins ici :

$tokens - voici maintenant tous les mots saisis par l'utilisateur

$user_id - ID utilisateur ici

Yandex envoie constamment un ping aux compétences publiées et j'ai ajouté une ligne pour quitter immédiatement le script sans démarrer le traitement complet du message :

  if (strpos($tokens[0], "ping") > -1)     {Send_Out("pong", "", true);}

On appelle la fonction Parse_Tokens pour le traitement, c'est la même chose que pour Telegram :

$Out_Str = Parse_Tokens($tokens);

Et envoyez une réponse :

Send_Out($user_id, $Out_Str);

La fonction Send_Out est plus compliquée ici :

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();
}

J'ai terminé le scénario d'Alice.

Le script de traitement Parse_Tokens lui-même a été créé uniquement à titre d'exemple, vous pouvez y effectuer toutes les vérifications et tous les traitements.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
  return $out;
}

Si vous devez communiquer avec un utilisateur sous une forme plus complexe qu'une question-réponse, vous devrez alors enregistrer le $user_id de l'utilisateur et les données déjà reçues de l'utilisateur dans la base de données (par exemple, mysql) et les analyser dans la fonction Parse_Tokens.

En fait, c'est presque tout, si tout est fait correctement, alors le bot Telegram est déjà disponible, les compétences d'Alice peuvent être vérifiées dialogues.yandex.ru/developeren accédant à votre nouvelle compétence dans l'onglet Test.

Bot Yandex.Alisa et Telegram en PHP avec les mêmes fonctionnalités

Si tout fonctionne correctement, vous pouvez envoyer la compétence en modération en cliquant sur le bouton "Pour modération".

Vous disposez désormais de deux robots pour différentes plates-formes à la fois, qui fonctionnent de la même manière.

Documentation pour le service Yandex.Dialogues ici

Scripts complets publiés sur github скачать.

Source: habr.com

Ajouter un commentaire