Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Alus poé.

Aya seueur tulisan ngeunaan topik bot Telegram, tapi sababaraha urang nyerat ngeunaan kaahlian pikeun Alice, sareng kuring henteu mendakan inpormasi ngeunaan cara ngadamel bot tunggal, janten kuring mutuskeun pikeun ngabagi pangalaman kuring ngeunaan cara ngadamel bot. bot Telegram basajan jeung skill Yandex.Alice pikeun situs ngabogaan pungsionalitas sarua.

Janten, kuring moal nyarioskeun ka anjeun kumaha carana ngangkat pangladén wéb sareng kéngingkeun sertipikat SSL, cekap parantos ditulis ngeunaan éta.

Nyiptakeun bot Telegram

Mimiti, hayu urang ngadamel bot Telegram, pikeun ieu urang angkat ka Telegram sareng milarian bot BotFather di dinya.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Pilih /newbot

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Urang asupkeun nami bot ku nu eta bakal ngabales, lajeng urang asupkeun ngaran bot, dina respon urang meunang token ngadalikeun bot, urang nulis handap konci ieu, éta bakal mangpaat pikeun urang dina mangsa nu bakal datang.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Léngkah salajengna nyaéta nyarioskeun ka server Telegram mana server anu ngirim data tina bot. Jang ngalampahkeun ieu, urang nyieun link formulir:

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

___TOKEN___ urang ngaganti ku token urang ti bot, narima saméméhna

____PATH_TO_SCRIPT____ kami ganti ku alamat naskah dina server kami dimana data bakal diolah (contona, www.my_server.ru/webhook_telegram.php).

Aya masalah di dieu, server api.telegram.org diblokir, tapi anjeun tiasa ngalakukeun ieu: nyéwa server anu paling murah dimana teu aya larangan sareng masihan paréntah ti konsol server ieu.

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

Éta waé, bot Telegram didamel sareng nyambung ka server anjeun.

Nyiptakeun kaahlian pikeun Yandex.Alisa

Hayu urang ngaléngkah ka nyieun kaahlian pikeun Yandex.Alice.

Pikeun nyiptakeun kaahlian, anjeun kedah angkat ka halaman pamekar Yandex.Dialogues Kaca pamekar Yandex.Dialogs, klik aya "Jieun dialog" tur pilih "Skill di Alice".

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Dialog setélan skill bakal muka.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Urang ngawitan asupkeun setélan skill.

Lebetkeun nami skill Anjeun.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Ngaran aktivasina kedah dipilih taliti pisan supados Alice ngartos leres, tina nuansa - aplikasi mobile sareng Alice sareng kolom sapertos Yandex.Station atanapi Irbis A tiasa ningali kecap-kecap anu béda.

Kami asupkeun jalur kana skrip dina server kami dina cara anu sami sareng Telegram, tapi éta bakal janten naskah khusus pikeun Alice, contona. www.my_server.ru/webhook_alice.php.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Urang milih sora nu skill bakal nyarita, Kuring leuwih resep sora Alice urang.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Upami anjeun ngarencanakeun damel ngan ukur dina alat sélulér atanapi dina browser, teras pilih "Anjeun peryogi alat anu nganggo layar."

Salajengna, lebetkeun setélan pikeun katalog kaahlian Alice. Upami anjeun badé nganggo kecap "merk" pikeun aktivasina, anjeun kedah pariksa situs wéb merek dina jasa webmaster.yandex.ru.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Éta sadayana sareng setélan, hayu urang teraskeun kana naskah.

Aksara bot Telegram

Hayu urang mimitian ku skrip pikeun Telegram.

Kami nyambungkeun perpustakaan tempat pesen ti bot sareng Alice bakal diolah:

include_once 'webhook_parse.php';

Kami nyetél token bot kami:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Kami nampi data:

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

Parsing data kana variabel:

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

Ayeuna anjeun tiasa damel sareng variabel:

$tokens - ayeuna aya sadaya kecap anu diasupkeun ku pangguna

$user_id - id pamaké dieu

$msg_chat_id - obrolan dimana bot nampi paréntahna

$msg_user_name - ngaran pamaké

Salajengna, urang nyauran fungsi Parse_Tokens pikeun ngolah:

$Out_Str = Parse_Tokens($tokens);

Sareng kirimkeun réspon:

Send_Out($user_id, $Out_Str);

fungsi Send_Out saderhana sareng sapertos kieu:

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

Aksara skill pikeun Yandex.Alisa

Ayeuna hayu urang teraskeun kana naskah pikeun Alice, éta ampir sami sareng Telegram.

Kami ogé nyambungkeun perpustakaan tempat pesen ti bot sareng Alice bakal diolah, ditambah perpustakaan kalayan kelas pikeun Alice:

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

Kami nampi data:

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

Parsing data kana variabel:

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

Aya sababaraha variabel pangsaeutikna di dieu:

$tokens - ayeuna aya sadaya kecap anu diasupkeun ku pangguna

$user_id - id pamaké dieu

Yandex terus-terusan ping kaahlian anu diterbitkeun, sareng kuring nambihan garis pikeun langsung kaluar tina naskah tanpa ngamimitian ngolah pinuh pesen:

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

Kami nyauran fungsi Parse_Tokens pikeun ngolah, éta sami sareng Telegram:

$Out_Str = Parse_Tokens($tokens);

Sareng kirimkeun réspon:

Send_Out($user_id, $Out_Str);

Fungsi Send_Out langkung rumit di dieu:

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

Réngsé naskah pikeun Alice.

Aksara processing Parse_Tokens sorangan dijieun murni pikeun conto, anjeun tiasa ngalakukeun sagala cék jeung ngolah aya.

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

Upami anjeun kedah komunikasi sareng pangguna dina bentuk anu langkung kompleks tibatan patarosan-jawaban, maka anjeun kedah nyimpen $user_id pangguna sareng data anu parantos nampi ti pangguna dina pangkalan data (contona, mysql) sareng nganalisisna dina fungsi Parse_Tokens.

Sabenerna, ieu ampir sadayana, upami sadayana dilakukeun leres, maka bot Telegram parantos sayogi, kamampuan Alice tiasa dipariksa dialogs.yandex.ru/developerku buka skill anyar anjeun dina tab nguji.

Yandex.Alisa sareng Telegram bot dina PHP sareng fungsionalitas anu sami

Lamun sagalana jalan neuleu, Anjeun bisa ngirim skill keur moderation ku ngaklik "Kanggo moderation" tombol.

Ayeuna anjeun gaduh dua bot pikeun platform anu béda sakaligus, anu dianggo dina cara anu sami.

Dokuméntasi pikeun jasa Yandex.Dialogues di dieu

Skrip lengkep dipasang dina github скачать.

sumber: www.habr.com

Tambahkeun komentar