Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

God dag.

Det finns mÄnga artiklar om Telegram-botar, men fÄ skriver om fÀrdigheterna för Alice, och jag har inte hittat nÄgon information om hur man gör en enhetlig bot, sÄ jag ville dela med mig av min erfarenhet av hur man skapar en enkel Telegram-bot och en Yandex.Alice fÀrdighet för en webbplats med en gemensam funktionalitet.

SÄ, hur man stÀller upp en webbserver och fÄr ssl-certifikat jag kommer inte att gÄ in pÄ, det finns redan tillrÀckligt med information om detta.

Skapa en Telegram-bot

Först skapar vi en Telegram-bot, för detta gÄr vi till Telegram och hittar boten BotFather.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

VĂ€lj /newbot

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Ange namnet pÄ boten som den kommer att svara pÄ, och sedan skriver vi in botens anvÀndarnamn, i svar fÄr vi en token för att hantera boten, vi antecknar denna nyckel, den kommer att vara anvÀndbar senare.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

NÀsta steg Àr att informera Telegram-servrarna om vilken server de ska skicka data frÄn boten till. För detta skapar vi en lÀnk av typen:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____SCRIPTSJÄNG___

___TOKEN___ ersÀtter vi med vÄr token frÄn boten, som vi fick tidigare.

____SCRIPTSJÄNG___ ersĂ€tter vi med adressen till skriptet pĂ„ vĂ„r server, dĂ€r databehandling kommer att ske (till exempel www.my_server.ru/webhook_telegram.php).

Det hÀr Àr ett problem, servern api.telegram.org Àr blockerad, men man kan göra sÄ hÀr: hyra den billigaste server dÀr det inte finns nÄgra begrÀnsningar och ge kommandot frÄn konsolen pÄ den servern

wget ___ADRESS___

Klart, Telegram-boten Àr skapad och kopplad till din servern.

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 Yandex.Diagrammer utvecklarens sida. Utvecklarens sida för Yandex.Diagrammer, klicka dÀr pÄ "Skapa dialog" och vÀlj "FÀrdighet i Alice".

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

InstÀllningsdialogen för fÀrdigheten öppnas.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Vi börjar ange instÀllningarna för fÀrdigheten.

Skriv in namnet pÄ din fÀrdighet.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Aktiveringsnamnet bör vĂ€ljas mycket noggrant, sĂ„ att Alice förstĂ„r det korrekt, med nĂ„gra nyanser — mobilappen med Alice och högtalare som Yandex.Station eller Irbis A kan uppfatta orden pĂ„ olika sĂ€tt.

Ange sökvÀgen till skriptet pÄ vÄr server pÄ samma sÀtt som för Telegram, men detta kommer att vara skriptet specifikt för Alice, till exempel www.my_server.ru/webhook_alice.php.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

VÀlj rösten som fÀrdigheten ska tala med, jag gillar verkligen Alice rösten.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Om arbetet endast planeras att fungera pÄ mobila enheter eller i webblÀsare, vÀlj dÄ "Behöver en enhet med skÀrm".

Vi anger nu instĂ€llningarna för Alicias fĂ€rdighetskatalog. Om du planerar att anvĂ€nda ett aktiveringsord — varumĂ€rket, behöver du verifiera varumĂ€rkets webbplats via tjĂ€nsten webmaster.yandex.ru.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

InstÀllningarna Àr klara, vi gÄr vidare till skripten.

Telegram-botskript

LÄt oss börja med skriptet för Telegram.

Vi ansluter biblioteket som kommer att hantera meddelanden frÄn boten och Alicia:

include_once 'webhook_parse.php';

Vi stÀller in token för vÄr bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Vi hÀmtar data:

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

Vi bryter ner datan i variabler:

if (!$request)
{
  die();
    // NÄgot felmeddelande (request Àr inte giltig JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // NÄgot felmeddelande (request har inget meddelande)
}
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 vi arbeta med variablerna:

$tokens — hĂ€r finns nu alla ord som anvĂ€ndaren skrev

$user_id — hĂ€r Ă€r anvĂ€ndarens id

$msg_chat_id — chatten dĂ€r boten fick kommandot

$msg_user_name — anvĂ€ndarens namn

DÀrefter anropar vi funktionen Parse_Tokens för behandling:

$Out_Str = Parse_Tokens($tokens);

Och skickar svaret:

Send_Out($user_id, $Out_Str);

Funktionen Send_Out À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);
}

 

Skriptet för fÀrdigheten till Yandex.Alice

Nu gÄr vi vidare till skriptet för Alice, det Àr nÀstan detsamma som för Telegram.

Vi ansluter ocksÄ biblioteket som kommer att hantera meddelanden frÄn boten och Alicia, plus biblioteket med klasser för Alice:

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

Vi hÀmtar data:

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

Vi bryter ner datan 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'];}
  }
}

HÀr finns nÄgot fÀrre nödvÀndiga variabler:

$tokens — hĂ€r finns nu alla ord som anvĂ€ndaren skrev

$user_id — hĂ€r Ă€r anvĂ€ndarens id

Yandex pingar stÀndigt publicerade fÀrdigheter, och jag har lagt till en rad för att omedelbart avbryta skriptet utan att köra en fullstÀndig meddelandehantering:

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

Vi kallar funktionen Parse_Tokens för bearbetning, den Àr densamma som för Telegram:

$Out_Str = Parse_Tokens($tokens);

Och skickar svaret:

Send_Out($user_id, $Out_Str);

Funktionen Send_Out hÀr Àr lite mer komplex:

function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  global $data_msg_sess_id, $user_id;

  /////////// GENERERA BAS FÖR UTE ////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  /////////// GENERERA BAS FÖR UTE Slut ////////

  /////////// UTE MSG GENERERA ////////
  $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();
}

Skriptet för Alice Àr klart.

SjÀlva behandlingsskriptet Parse_Tokens Àr gjort som ett exempel, du kan göra vilka kontroller och bearbetningar som helst dÀr.

function Parse_Tokens($tokens)
{
  $out = "";
  // gör nÄgot med tokens //
  $out =  "Du har angivit " . count($tokens) . " ord: " . implode($tokens, " ");
  return $out;
}

Om du behöver mer komplex kommunikation med anvÀndaren Àn frÄga-svar, dÄ mÄste du spara anvÀndarens $user_id i databasen (till exempel mysql) samt redan erhÄllna data frÄn anvÀndaren och analysera dem i funktionen Parse_Tokens.

Det Àr nÀstan allt, om allt Àr gjort korrekt Àr Telegram-boten redan tillgÀnglig, fÀrdigheten för Alice kan kontrolleras dialogs.yandex.ru/developer, genom att gÄ till din nya fÀrdighet pÄ fliken testning.

Yandex.Alice och Telegram-bot pÄ PHP med enhetlig funktionalitet

Om allt fungerar korrekt kan du skicka fÀrdigheten för moderering genom att trycka pÄ knappen "För moderering".

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

Dokumentation för tjÀnsten Yandex.Dialoger ). Ett typiskt exempel pÄ anvÀndning:

FullstÀndiga skript ligger pÄ github ladda ner.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster