PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Hayrli kun.

Telegram botlari mavzusida juda ko'p maqolalar bor, lekin Elis uchun ko'nikmalar haqida kam odam yozadi va men bitta botni qanday qilish haqida hech qanday ma'lumot topa olmadim, shuning uchun men qanday qilib bot qilish bo'yicha tajribam bilan o'rtoqlashishga qaror qildim. oddiy Telegram boti va bir xil funksiyaga ega sayt uchun Yandex.Alice mahorati.

Shunday qilib, men sizga veb-serverni qanday ko'tarish va ssl sertifikatini olishni aytmayman, bu haqda etarlicha yozilgan.

Telegram bot yaratish

Avval Telegram botini yaratamiz, buning uchun biz Telegramga o'tamiz va u erdan BotFather botini topamiz.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

/newbot-ni tanlang

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Biz javob beradigan bot nomini kiritamiz, keyin bot nomini kiritamiz, javoban biz botni boshqarish uchun token olamiz, biz ushbu kalitni yozamiz, bu bizga kelajakda foydali bo'ladi.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Keyingi qadam Telegram serverlariga botdan ma’lumotlarni qaysi serverga yuborish kerakligini aytishdir. Buning uchun biz shaklning havolasini qilamiz:

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

___TOKEN___ biz avvalroq olingan botdan tokenimizni almashtiramiz

____PATH_TO_SCRIPT____ biz serverimizdagi ma'lumotlar qayta ishlanadigan skript manzili bilan almashtiramiz (masalan, www.my_server.ru/webhook_telegram.php).

Bu yerda muammo bor, api.telegram.org serveri bloklanmoqda, lekin siz buni qilishingiz mumkin: hech qanday cheklovlarsiz eng arzon serverni ijaraga oling va ushbu server konsolidan buyruq bering.

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

Hammasi, Telegram boti yaratildi va serveringizga ulandi.

Yandex.Alisa uchun mahorat yaratish

Keling, Yandex.Alice uchun mahorat yaratishga o'tamiz.

Ko'nikma yaratish uchun siz Yandex.Dialogues dasturchilar sahifasiga o'tishingiz kerak Yandex.Dialogs dasturchi sahifasi, u erda "Muloqot yaratish" tugmasini bosing va "Alisdagi mahorat" ni tanlang.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Malaka sozlamalari dialog oynasi ochiladi.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Biz mahorat sozlamalarini kiritishni boshlaymiz.

O'z mahoratingiz nomini kiriting.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Faollashtirish nomi juda ehtiyotkorlik bilan tanlanishi kerak, shunda Elis uni to'g'ri tushunadi, nuanslardan - Alice bilan mobil ilova va Yandex.Station yoki Irbis A kabi ustunlar so'zlarni boshqacha qabul qilishi mumkin.

Biz serverimizdagi skriptga yo'lni Telegramdagi kabi kiritamiz, lekin bu, masalan, Elis uchun maxsus skript bo'ladi. www.my_server.ru/webhook_alice.php.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Biz mahorat gapiradigan ovozni tanlaymiz, menga Elisning ovozi ko'proq yoqadi.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Agar siz faqat mobil qurilmalarda yoki brauzerda ishlashni rejalashtirmoqchi bo'lsangiz, "Sizga ekranli qurilma kerak" -ni tanlang.

Keyin, Elisning mahorat katalogi sozlamalarini kiriting. Agar siz faollashtirish uchun "brend" so'zidan foydalanishni rejalashtirmoqchi bo'lsangiz, webmaster.yandex.ru xizmatida brendning veb-saytini tekshirishingiz kerak.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Hammasi sozlamalar bilan, keling, skriptlarga o'tamiz.

Telegram bot skripti

Keling, Telegram uchun skriptdan boshlaylik.

Biz kutubxonani bog'laymiz, u erda bot va Elis xabarlari qayta ishlanadi:

include_once 'webhook_parse.php';

Biz bot tokenini o'rnatdik:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Biz ma'lumotlarni olamiz:

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

Ma'lumotlarni o'zgaruvchilarga ajratish:

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

Endi siz o'zgaruvchilar bilan ishlashingiz mumkin:

$tokens - endi foydalanuvchi kiritgan barcha so'zlar

$user_id - bu yerda foydalanuvchi identifikatori

$msg_chat_id - bot buyruq olgan chat

$msg_user_name - foydalanuvchi nomi

Keyinchalik, qayta ishlash uchun Parse_Tokens funktsiyasini chaqiramiz:

$Out_Str = Parse_Tokens($tokens);

Va javob yuboring:

Send_Out($user_id, $Out_Str);

Send_Out funksiyasi oddiy va quyidagicha ko'rinadi:

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

Yandex.Alisa uchun mahorat skripti

Endi Alice uchun skriptga o'tamiz, bu Telegram bilan deyarli bir xil.

Shuningdek, biz bot va Elisdan kelgan xabarlar qayta ishlanadigan kutubxonani, shuningdek, Elis uchun darslarga ega kutubxonani ulaymiz:

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

Biz ma'lumotlarni olamiz:

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

Ma'lumotlarni o'zgaruvchilarga ajratish:

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

Bu erda bir nechta o'zgaruvchilar mavjud:

$tokens - endi foydalanuvchi kiritgan barcha so'zlar

$user_id - bu yerda foydalanuvchi identifikatori

Yandex nashr etilgan ko'nikmalarni doimiy ravishda tekshiradi va men xabarni to'liq qayta ishlashni boshlamasdan darhol skriptdan chiqish uchun qator qo'shdim:

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

Biz Parse_Tokens funksiyasini qayta ishlash uchun chaqiramiz, bu Telegram bilan bir xil:

$Out_Str = Parse_Tokens($tokens);

Va javob yuboring:

Send_Out($user_id, $Out_Str);

Send_Out funksiyasi bu yerda murakkabroq:

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

Elis uchun stsenariyni tugatdi.

Parse_Tokens qayta ishlash skriptining o'zi faqat misol uchun yaratilgan, siz u erda har qanday tekshirish va ishlov berishingiz mumkin.

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

Agar siz foydalanuvchi bilan savol-javobdan ko'ra murakkabroq shaklda muloqot qilishingiz kerak bo'lsa, u holda siz foydalanuvchining $user_id raqamini va ma'lumotlar bazasida (masalan, MySQL) foydalanuvchidan olingan ma'lumotlarni saqlashingiz va ularni tahlil qilishingiz kerak bo'ladi. Parse_Tokens funksiyasi.

Aslida, bu deyarli hammasi, agar hamma narsa to'g'ri bajarilgan bo'lsa, Telegram boti allaqachon mavjud, Elisning mahoratini tekshirish mumkin dialogs.yandex.ru/developertest yorlig'ida yangi mahoratingizga o'tish orqali.

PHP-dagi Yandex.Alisa va Telegram boti bir xil funksionallikka ega

Agar hamma narsa to'g'ri ishlayotgan bo'lsa, "Moderatsiya uchun" tugmasini bosish orqali mahoratni moderatsiyaga yuborishingiz mumkin.

Endi sizda bir vaqtning o'zida bir xil ishlaydigan turli platformalar uchun ikkita bot mavjud.

Yandex.Dialogues xizmati uchun hujjatlar shu yerda

To'liq skriptlar github-da joylashtirilgan ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ.

Manba: www.habr.com

a Izoh qo'shish