Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Magandang hapon.

Mayroong maraming mga artikulo sa paksa ng Telegram bots, ngunit kakaunti ang mga tao na sumulat tungkol sa mga kasanayan para kay Alice, at wala akong nakitang anumang impormasyon kung paano gumawa ng isang bot, kaya nagpasya akong ibahagi ang aking karanasan sa kung paano gumawa ng isang simpleng Telegram bot at ang Yandex.Alice skill para sa site na may parehong functionality.

Kaya, hindi ko sasabihin sa iyo kung paano magtaas ng web server at makakuha ng ssl certificate, sapat na ang naisulat tungkol dito.

Paglikha ng Telegram bot

Una, gumawa tayo ng Telegram bot, para dito pumunta tayo sa Telegram at hanapin ang BotFather bot doon.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Piliin ang /newbot

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Ipinasok namin ang pangalan ng bot kung saan ito tutugon, pagkatapos ay ipinasok namin ang pangalan ng bot, bilang tugon nakakakuha kami ng isang token upang makontrol ang bot, isinulat namin ang key na ito, magiging kapaki-pakinabang ito sa amin sa hinaharap.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Ang susunod na hakbang ay upang sabihin sa mga server ng Telegram kung aling server ang magpapadala ng data mula sa bot. Upang gawin ito, gumawa kami ng isang link ng form:

https: //api.telegram.org/bot___Π’ΠžΠšΠ•Π___/setWebhook?url=https://____ПУВЬ_Π”Πž_БКРПИВА___

___TOKEN___ pinapalitan namin ng token namin mula sa bot, na natanggap kanina

____PATH_TO_SCRIPT____ pinapalitan namin ng address ng script sa aming server kung saan ipoproseso ang data (halimbawa, www.my_server.ru/webhook_telegram.php).

Mayroong problema dito, ang server ng api.telegram.org ay nasa ilalim ng pagharang, ngunit magagawa mo ito: magrenta ng pinakamurang server kung saan walang mga paghihigpit at magbigay ng utos mula sa console ng server na ito

wget ___ΠŸΠžΠ›Π£Π§Π˜Π’Π¨Π˜Π™Π‘Π―_АДРЕБ___

Iyon lang, ang Telegram bot ay nilikha at nakakonekta sa iyong server.

Paglikha ng isang kasanayan para sa Yandex.Alisa

Lumipat tayo sa paglikha ng isang kasanayan para sa Yandex.Alice.

Upang lumikha ng isang kasanayan, kailangan mong pumunta sa pahina ng mga developer ng Yandex.Dialogues Pahina ng developer ng Yandex.Dialogs, i-click doon ang "Gumawa ng dialogue" at piliin ang "Skill in Alice".

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Magbubukas ang dialog ng mga setting ng kasanayan.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Nagsisimula kaming ipasok ang mga setting ng kasanayan.

Ilagay ang pangalan ng iyong kakayahan.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Ang pangalan ng pag-activate ay dapat na maingat na mapili upang maunawaan ito nang tama ni Alice, mula sa mga nuances - isang mobile application na may Alice at mga column tulad ng Yandex.Station o Irbis A ay maaaring makakita ng mga salita sa ibang paraan.

Ipinasok namin ang landas patungo sa script sa aming server sa parehong paraan tulad ng para sa Telegram, ngunit ito ay magiging isang script na partikular para kay Alice, halimbawa www.my_server.ru/webhook_alice.php.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Pinipili namin ang boses kung saan ang husay ay magsasalita, mas gusto ko ang boses ni Alice.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Kung plano mong magtrabaho lang sa mga mobile device o sa isang browser, piliin ang "Kailangan mo ng device na may screen."

Susunod, ilagay ang mga setting para sa katalogo ng mga kasanayan ni Alice. Kung plano mong gamitin ang salitang "brand" para sa pag-activate, kailangan mong i-verify ang website ng brand sa serbisyo ng webmaster.yandex.ru.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Iyon lang ang mga setting, lumipat tayo sa mga script.

Telegram bot script

Magsimula tayo sa isang script para sa Telegram.

Ikinonekta namin ang library kung saan ipoproseso ang mga mensahe mula sa bot at Alice:

include_once 'webhook_parse.php';

Itinakda namin ang token ng aming bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Nakatanggap kami ng data:

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

Pag-parse ng data sa mga variable:

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

Ngayon ay maaari kang magtrabaho sa mga variable:

$tokens - narito na ngayon ang lahat ng mga salita na ipinasok ng user

$user_id - user id dito

$msg_chat_id - chat kung saan natanggap ng bot ang utos

$msg_user_name - username

Susunod, tinatawag namin ang Parse_Tokens function para sa pagproseso:

$Out_Str = Parse_Tokens($tokens);

At magpadala ng tugon:

Send_Out($user_id, $Out_Str);

ang Send_Out function ay simple at ganito ang hitsura:

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 para sa Yandex.Alisa

Ngayon ay lumipat tayo sa script para kay Alice, ito ay halos kapareho ng para sa Telegram.

Ikinonekta rin namin ang library kung saan ipoproseso ang mga mensahe mula sa bot at Alice, kasama ang isang library na may mga klase para kay Alice:

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

Nakatanggap kami ng data:

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

Pag-parse ng data sa mga variable:

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

Mayroong ilang mas kaunting mga variable dito:

$tokens - narito na ngayon ang lahat ng mga salita na ipinasok ng user

$user_id - user id dito

Ang Yandex ay patuloy na nag-ping ng mga nai-publish na mga kasanayan, at nagdagdag ako ng isang linya upang agad na lumabas sa script nang hindi sinimulan ang buong pagproseso ng mensahe:

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

Tinatawag namin ang Parse_Tokens function para sa pagproseso, ito ay kapareho ng para sa Telegram:

$Out_Str = Parse_Tokens($tokens);

At magpadala ng tugon:

Send_Out($user_id, $Out_Str);

Ang Send_Out function ay mas kumplikado dito:

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

Natapos ang script para kay Alice.

Ang mismong script ng pagpoproseso ng Parse_Tokens ay ginawa lamang para sa isang halimbawa, maaari kang gumawa ng anumang mga pagsusuri at pagproseso doon.

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

Kung kailangan mong makipag-ugnayan sa isang user na may mas kumplikadong anyo kaysa sa tanong-sagot, kakailanganin mong i-save ang $user_id ng user at ang data na natanggap na mula sa user sa database (halimbawa, mysql) at pag-aralan ang mga ito sa ang Parse_Tokens function.

Sa totoo lang, ito ay halos lahat, kung ang lahat ay ginawa nang tama, kung gayon ang Telegram bot ay magagamit na, ang kakayahan ni Alice ay maaaring suriin dialogs.yandex.ru/developersa pamamagitan ng pagpunta sa iyong bagong kasanayan sa tab ng pagsubok.

Yandex.Alisa at Telegram bot sa PHP na may parehong functionality

Kung gumagana nang tama ang lahat, maaari mong ipadala ang kasanayan para sa pagmo-moderate sa pamamagitan ng pag-click sa pindutang "Para sa pagmo-moderate".

Mayroon ka na ngayong dalawang bot para sa magkaibang platform nang sabay-sabay, na gumagana sa parehong paraan.

Dokumentasyon para sa serbisyo ng Yandex.Dialogues dito

Ang buong script ay nai-post sa github i-download.

Pinagmulan: www.habr.com

Magdagdag ng komento