Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Hyvää päivää.

Telegram-boteista on paljon artikkeleita, mutta harvat kirjoittavat taidoista Alicelle, enkä löytänyt mitään tietoa yhden botin tekemisestä, joten päätin jakaa kokemukseni siitä, miten yksinkertainen Telegram-botti ja Yandex.Alice-taito sivustolle, jolla on samat toiminnot.

Joten en kerro sinulle kuinka nostaa verkkopalvelin ja saada ssl-varmenne, siitä on kirjoitettu tarpeeksi.

Telegram-botin luominen

Ensin luodaan Telegram-botti, tätä varten menemme Telegramiin ja löydämme sieltä BotFather-botin.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Valitse /newbot

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Annamme botin nimen, jolla se vastaa, kirjoitamme sitten botin nimen, vastauksena saamme tunnuksen botin hallitsemiseksi, kirjoitamme tämän avaimen muistiin, se on hyödyllinen meille tulevaisuudessa.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Seuraava vaihe on kertoa Telegram-palvelimille, mille palvelimelle tiedot lähetetään robotista. Tätä varten teemme linkin lomakkeeseen:

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

___TOKEN___ korvaamme aiemmin vastaanotetulla botin tunnuksellamme

____PATH_TO_SCRIPT____ korvaamme sen komentosarjan osoitteella palvelimellamme, jossa tietoja käsitellään (esim. www.my_server.ru/webhook_telegram.php).

Tässä on ongelma, api.telegram.org-palvelin on estetty, mutta voit tehdä tämän: vuokraa halvin palvelin, jossa ei ole rajoituksia ja anna komento tämän palvelimen konsolista

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

Siinä kaikki, Telegram-botti luodaan ja yhdistetään palvelimeesi.

Taidon luominen Yandex.Alisalle

Jatketaan Yandex.Alice-taidon luomista.

Luodaksesi taidon, sinun on mentävä Yandex.Dialogues-kehittäjien sivulle Yandex.Dialogs-kehittäjäsivu, napsauta "Luo dialogi" ja valitse "Skill in Alice".

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Taitoasetusten valintaikkuna avautuu.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Aloitamme taitoasetusten syöttämisen.

Kirjoita taitosi nimi.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Aktivointinimi tulee valita erittäin huolellisesti, jotta Alice ymmärtää sen oikein, vivahteiden perusteella - mobiilisovellus, jossa on Alice ja sarakkeet, kuten Yandex.Station tai Irbis A, voivat havaita sanat eri tavalla.

Kirjoitamme palvelimellamme olevan skriptin polun samalla tavalla kuin Telegramille, mutta se on esimerkiksi Alicelle tarkoitettu komentosarja www.my_server.ru/webhook_alice.php.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Valitsemme äänen, jolla taito puhuu, pidän Alicen äänestä enemmän.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Jos aiot työskennellä vain mobiililaitteilla tai selaimella, valitse "Tarvitset laitteen, jossa on näyttö".

Syötä seuraavaksi Alicen taitoluettelon asetukset. Jos aiot käyttää aktivointiin sanaa "brändi", sinun on vahvistettava brändin verkkosivusto webmaster.yandex.ru-palvelussa.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Siinä kaikki asetuksissa, siirrytään skripteihin.

Telegram-botin käsikirjoitus

Aloitetaan Telegramin käsikirjoituksella.

Yhdistämme kirjaston, jossa botin ja Alicen viestit käsitellään:

include_once 'webhook_parse.php';

Asetamme bottimme tunnuksen:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Saamme dataa:

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

Tietojen jäsentäminen muuttujiksi:

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

Nyt voit työskennellä muuttujien kanssa:

$tokens - tässä ovat nyt kaikki käyttäjän kirjoittamat sanat

$user_id - käyttäjätunnus tässä

$msg_chat_id - keskustelu, jossa botti sai komennon

$msg_user_name - käyttäjänimi

Seuraavaksi kutsumme Parse_Tokens-funktiota käsittelyä varten:

$Out_Str = Parse_Tokens($tokens);

Ja lähetä vastaus:

Send_Out($user_id, $Out_Str);

Send_Out-toiminto on yksinkertainen ja näyttää tältä:

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

Taitokäsikirjoitus Yandex.Alisalle

Siirrytään nyt Alicen käsikirjoitukseen, se on melkein sama kuin Telegramissa.

Yhdistämme myös kirjaston, jossa botin ja Alicen viestit käsitellään, sekä kirjaston, jossa on Alice-luokkia:

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

Saamme dataa:

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

Tietojen jäsentäminen muuttujiksi:

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

Tässä on muutama muuttuja vähemmän:

$tokens - tässä ovat nyt kaikki käyttäjän kirjoittamat sanat

$user_id - käyttäjätunnus tässä

Yandex pingaa jatkuvasti julkaistuja taitoja, ja lisäsin rivin, jolla poistutaan komentosarjasta välittömästi aloittamatta viestin täyttä käsittelyä:

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

Kutsumme käsittelyä varten Parse_Tokens-funktiota, se on sama kuin Telegramissa:

$Out_Str = Parse_Tokens($tokens);

Ja lähetä vastaus:

Send_Out($user_id, $Out_Str);

Send_Out-toiminto on monimutkaisempi tässä:

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

Alicen käsikirjoitus on valmis.

Itse Parse_Tokens-käsittelyskripti on tehty puhtaasti esimerkkiä varten, siellä voi tehdä mitä tahansa tarkistuksia ja käsittelyä.

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

Jos haluat kommunikoida käyttäjän kanssa monimutkaisemmassa muodossa kuin kysymys-vastaus, sinun on tallennettava käyttäjän $user_id ja käyttäjältä jo vastaanotetut tiedot tietokantaan (esim. mysql) ja analysoitava ne Parse_Tokens-funktio.

Itse asiassa tämä on melkein kaikki, jos kaikki on tehty oikein, Telegram-botti on jo saatavilla, Alicen taidot voidaan tarkistaa dialogs.yandex.ru/developersiirtymällä uuteen taitosi testausvälilehdellä.

Yandex.Alisa ja Telegram botti PHP:ssä samalla toiminnallisuudella

Jos kaikki toimii oikein, voit lähettää taidon moderointiin napsauttamalla "Moderointiin" -painiketta.

Nyt sinulla on kaksi bottia eri alustoille kerralla, jotka toimivat samalla tavalla.

Yandex.Dialogues-palvelun dokumentaatio täällä

Täydelliset skriptit on julkaistu githubissa скачать.

Lähde: will.com

Lisää kommentti