Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

God eftermiddag.

Det finns många artiklar om ämnet Telegram-bots, men få människor skriver om färdigheter för Alice, och jag hittade ingen information om hur man gör en enda bot, så jag bestämde mig för att dela med mig av min erfarenhet om hur man gör en enkel Telegram-bot och en Yandex.Alice-färdighet för webbplatsen som har samma funktionalitet.

Så jag kommer inte att berätta för dig hur du ställer in en webbserver och får ett SSL-certifikat; det har skrivits tillräckligt om detta.

Skapa en Telegram-bot

Låt oss först skapa en Telegram-bot. För att göra detta, gå till Telegram och hitta BotFather-boten där.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Välj /newbot

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Vi anger namnet på boten som den kommer att svara med, anger sedan namnet på boten, som svar får vi en token för att kontrollera boten, skriv ner den här nyckeln, den kommer att vara användbar för oss i framtiden.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Nästa steg är att tala om för Telegram-servrarna vilken server som ska skicka data från boten till. För att göra detta gör vi en länk som:

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

___TOKEN___ ersätts med vår token från boten som mottogs tidigare

____PATH_TO_SCRPIT___ ersätts med adressen till skriptet på vår server där data kommer att behandlas (till exempel, www.my_server.ru/webhook_telegram.php).

Det finns ett problem här, api.telegram.org-servern är blockerad, men du kan göra så här: hyr den billigaste servern där det inte finns några begränsningar och utfärda ett kommando från konsolen på denna server

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

Det är allt, Telegram-boten har skapats och anslutits till din server.

Skapa en färdighet för Yandex.Alice

Låt oss gå vidare till att skapa en färdighet för Yandex.Alice.

För att skapa en färdighet måste du gå till utvecklarsidan för Yandex.Dialogs Yandex.Dialogues utvecklarsida, klicka på "Skapa dialog" där och välj "Färdighet i Alice".

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Dialogrutan för färdighetsinställningar öppnas.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Vi börjar gå in i färdighetsinställningarna.

Ange namnet på din färdighet.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Aktiveringsnamnet bör väljas mycket noggrant så att Alice förstår det korrekt, utifrån nyanserna - en mobilapplikation med Alice och högtalare som Yandex.Station eller Irbis A kan uppfatta ord på olika sätt.

Vi anger sökvägen till skriptet på vår server på samma sätt som för Telegram, men detta kommer att vara ett skript specifikt för Alice, till exempel www.my_server.ru/webhook_alice.php.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Vi väljer rösten som skickligheten ska tala med; jag gillar Alices röst bättre.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Om du planerar att bara arbeta på mobila enheter eller i en webbläsare väljer du "Kräv en enhet med skärm."

Ange sedan inställningarna för Alices färdighetskatalog. Om du planerar att använda ordet "varumärke" för aktivering måste du gå igenom verifiering av varumärkets webbplats i tjänsten webmaster.yandex.ru.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

När inställningarna är klara, låt oss gå vidare till skripten.

Telegram bot-skript

Låt oss börja med ett manus till Telegram.

Vi kopplar ihop biblioteket där meddelanden från boten och Alice kommer att behandlas:

include_once 'webhook_parse.php';

Ställ in token för vår bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Vi får data:

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

Låt oss analysera data i variabler:

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

Nu kan du arbeta med variabler:

$tokens - här är nu alla ord som användaren skrev in

$user_id - här är användar-id

$msg_chat_id — chatt där boten fick kommandot

$msg_user_name - användarnamn

Därefter anropar vi Parse_Tokens-funktionen för bearbetning:

$Out_Str = Parse_Tokens($tokens);

Och skicka svaret:

Send_Out($user_id, $Out_Str);

Send_Out-funktionen är enkel och ser ut så här:

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 script för Yandex.Alice

Låt oss nu gå vidare till manuset till Alice, det är nästan detsamma som för Telegram.

Vi kopplar också ihop biblioteket där meddelanden från boten och Alice kommer att behandlas, plus ett bibliotek med klasser för Alice:

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

Vi får data:

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

Låt oss analysera data i variabler:

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'];}
  }
}

Det finns lite färre nödvändiga variabler här:

$tokens - här är nu alla ord som användaren skrev in

$user_id - här är användar-id

Yandex pingar ständigt publicerade färdigheter, och jag lade till en rad för att omedelbart avsluta skriptet utan att starta fullständig meddelandebehandling:

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

Vi kallar Parse_Tokens-funktionen för bearbetning, den är samma som för Telegram:

$Out_Str = Parse_Tokens($tokens);

Och skicka svaret:

Send_Out($user_id, $Out_Str);

Send_Out-funktionen är mer komplicerad här:

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

Vi avslutade manuset till Alice.

Själva bearbetningsskriptet Parse_Tokens gjordes rent till exempel; du kan göra vilka kontroller och bearbetningar som helst där.

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

Om du behöver kommunikation med en användare av en mer komplex typ än fråga-svar, måste du spara $user_id för användaren och data som redan erhållits från användaren i en databas (till exempel mysql) och analysera dem i Parse_Tokens fungera.

Egentligen är det nästan allt, om allt görs korrekt, är Telegram-boten redan tillgänglig, Alices skicklighet kan kontrolleras dialogs.yandex.ru/developer, gå till testfliken i din nya färdighet.

Yandex.Alisa och Telegram bot i PHP med samma funktionalitet

Om allt fungerar korrekt kan du skicka färdigheten för moderering genom att klicka på knappen "För moderering".

Nu har du två botar för olika plattformar som fungerar på samma sätt.

Dokumentation för Yandex.Dialogs-tjänsten här

Fullständiga skript publiceras på github hämta.

Källa: will.com

Lägg en kommentar