Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Нимаи нек.

Дар мавзӯи ботҳои Telegram мақолаҳои зиёде мавҷуданд, аммо кам одамон дар бораи малакаҳо барои Алиса менависанд ва ман дар бораи чӣ гуна сохтани як бот маълумоте наёфтам, бинобар ин ман тасмим гирифтам, ки таҷрибаи худро дар бораи сохтани бот мубодила кунам. боти оддии Telegram ва маҳорати Yandex.Alice барои сайте, ки функсияҳои якхела доранд.

Ҳамин тавр, ман ба шумо намегӯям, ки чӣ гуна веб-серверро баланд бардоштан ва сертификати ssl гирифтан мумкин аст, дар ин бора кофӣ навишта шудааст.

Эҷоди боти Telegram

Аввалан, биёед як боти Telegram эҷод кунем, барои ин мо ба Telegram меравем ва дар он ҷо боти BotFather-ро пайдо мекунем.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

/newbot-ро интихоб кунед

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Мо номи ботро, ки бо он посух медиҳад, ворид мекунем, баъд номи ботро ворид мекунем, дар ҷавоб мо токен барои идоракунии бот мегирем, ин калидро менависем, дар оянда барои мо муфид хоҳад буд.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Қадами навбатӣ ин аст, ки ба серверҳои Telegram бигӯед, ки аз бот ба кадом сервер маълумот фиристад. Барои ин, мо истиноди формаро месозем:

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

___TOKEN___ мо бо нишони худ аз бот, ки қаблан гирифта шуда буд, иваз мекунем

____PATH_TO_SCRIPT____ мо суроғаи скриптро дар сервери худ иваз мекунем, ки дар он маълумот коркард карда мешавад (масалан, www.my_server.ru/webhook_telegram.php).

Дар ин ҷо мушкилот вуҷуд дорад, сервери api.telegram.org дар ҳолати баста аст, аммо шумо метавонед ин корро кунед: сервери арзонтаринро иҷора гиред, ки дар он ҳеҷ гуна маҳдудият вуҷуд надорад ва аз консоли ин сервер фармон диҳед.

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

Ин аст, ки боти Telegram сохта шудааст ва ба сервери шумо пайваст шудааст.

Эҷоди маҳорат барои Yandex.Alisa

Биёед ба эҷоди маҳорат барои Yandex.Alice гузарем.

Барои эҷод кардани маҳорат, шумо бояд ба саҳифаи таҳиягарони Yandex.Dialogues гузаред Саҳифаи таҳиягари Yandex.Dialogs, он ҷо "Эҷоди муколама" -ро клик кунед ва "Маҳорат дар Алис" -ро интихоб кунед.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Муколамаи танзимоти маҳорат кушода мешавад.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Мо ба ворид кардани танзимоти маҳорат шурӯъ мекунем.

Номи маҳорати худро ворид кунед.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Номи фаъолсозӣ бояд хеле бодиққат интихоб карда шавад, то Алиса онро дуруст дарк кунад, аз нозукиҳо - як замимаи мобилӣ бо Алиса ва сутунҳои монанди Yandex.Station ё Irbis A метавонад калимаҳоро ба таври дигар қабул кунад.

Мо роҳи скриптро дар сервери худ ҳамон тавре ки барои Telegram ворид мекунем, аммо он скрипт барои Алис хоҳад буд, масалан www.my_server.ru/webhook_alice.php.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Мо овозеро интихоб мекунем, ки маҳорат бо он сухан мегӯяд, ба ман овози Алис бештар маъқул аст.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Агар шумо нақша доред, ки танҳо дар дастгоҳҳои мобилӣ ё браузер кор кунед, пас "Ба шумо дастгоҳи дорои экран лозим аст" -ро интихоб кунед.

Баъд, танзимоти каталоги малакаҳои Алисаро ворид кунед. Агар шумо ният доред, ки калимаи "бренд" -ро барои фаъолсозӣ истифода баред, шумо бояд вебсайти брендро дар хидмати webmaster.yandex.ru тафтиш кунед.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Ин ҳама бо танзимот аст, биёед ба скриптҳо гузарем.

Скрипти боти Telegram

Биёед бо скрипт барои Telegram оғоз кунем.

Мо китобхонаеро пайваст мекунем, ки дар он паёмҳои бот ва Алис коркард карда мешаванд:

include_once 'webhook_parse.php';

Мо аломати боти худро муқаррар кардем:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Мо маълумот мегирем:

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

Таҳлили маълумот ба тағирёбандаҳо:

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

Акнун шумо метавонед бо тағирёбандаҳо кор кунед:

$tokens - ин ҷо ҳама калимаҳое ҳастанд, ки корбар ворид кардааст

$user_id - ID корбар дар ин ҷо

$msg_chat_id - сӯҳбате, ки дар он бот фармонро гирифтааст

$msg_user_name - номи корбар

Минбаъд, мо функсияи Parse_Tokens -ро барои коркард даъват мекунем:

$Out_Str = Parse_Tokens($tokens);

Ва ҷавоб фиристед:

Send_Out($user_id, $Out_Str);

Функсияи Send_Out оддӣ аст ва чунин менамояд:

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

Акнун биёед ба скрипти Алиса мегузарем, он тақрибан якхелаест, ки барои Telegram аст.

Мо инчунин китобхонаеро пайваст мекунем, ки дар он паёмҳои бот ва Алис коркард карда мешаванд ва инчунин китобхона бо дарсҳо барои Алис:

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

Мо маълумот мегирем:

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

Таҳлили маълумот ба тағирёбандаҳо:

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

Дар ин ҷо чанд тағирёбанда камтар ҳастанд:

$tokens - ин ҷо ҳама калимаҳое ҳастанд, ки корбар ворид кардааст

$user_id - ID корбар дар ин ҷо

Яндекс пайваста малакаҳои нашршударо pings мекунад ва ман як сатрро илова кардам, то фавран аз скрипт хориҷ шавам, бидуни оғози коркарди пурраи паём:

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

Мо функсияи Parse_Tokens -ро барои коркард меномем, он ҳамон тавре ки барои Telegram аст:

$Out_Str = Parse_Tokens($tokens);

Ва ҷавоб фиристед:

Send_Out($user_id, $Out_Str);

Функсияи Send_Out дар ин ҷо мураккабтар аст:

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

Сценарии Алисро ба итмом расонд.

Худи скрипти коркарди Parse_Tokens танҳо барои мисол сохта шудааст, шумо метавонед дар он ҷо ҳама гуна тафтиш ва коркардро анҷом диҳед.

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

Агар ба шумо лозим меояд, ки бо корбар нисбат ба савол-ҷавоб шакли мураккабтар муошират кунед, пас ба шумо лозим меояд, ки $user_id-и корбар ва маълумотеро, ки аллакай аз корбар гирифта шудааст, дар пойгоҳи додаҳо (масалан, mysql) захира кунед ва онҳоро дар функсияи Parse_Tokens.

Дар асл, ин қариб ҳама чиз аст, агар ҳама чиз дуруст анҷом дода шуда бошад, пас боти Telegram аллакай дастрас аст, маҳорати Алисаро метавон тафтиш кард dialogs.yandex.ru/developerбо рафтан ба маҳорати нави худ дар ҷадвали санҷиш.

Боти Yandex.Alisa ва Telegram дар PHP бо ҳамон функсия

Агар ҳама чиз дуруст кор кунад, шумо метавонед бо пахш кардани тугмаи "Барои модератор" маҳоратро барои модератсия фиристед.

Акнун шумо дар як вақт ду бот барои платформаҳои гуногун доред, ки ҳамон тавр кор мекунанд.

Ҳуҷҷатҳо барои хидмати Yandex.Dialogues дар ин ҷо

Скриптҳои пурра дар github ҷойгир карда шудаанд скачать.

Манбаъ: will.com

Илова Эзоҳ