PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Кутмандуу күнүң менен.

Telegram боттору темасында көптөгөн макалалар бар, бирок Алиса үчүн көндүмдөр жөнүндө аз адамдар жазат, жана мен бир бот жасоо боюнча эч кандай маалымат таба алган жокмун, ошондуктан мен ботту кантип жасоо боюнча тажрыйбам менен бөлүшүүнү чечтим. жөнөкөй Telegram боту жана ошол эле функцияга ээ сайт үчүн Yandex.Alice чеберчилиги.

Ошентип, мен сизге веб-серверди кантип көтөрүүнү жана ssl сертификатын алууну айтпай эле коёюн, бул жөнүндө жетиштүү жазылган.

Telegram ботун түзүү

Биринчиден, Telegram ботун түзөлү, бул үчүн биз Telegramга кирип, ошол жерден BotFather ботун табабыз.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

/newbot тандаңыз

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Ал жооп бере турган боттун атын киргизебиз, андан кийин боттун атын киргизебиз, жооп катары ботту башкаруу үчүн белги алабыз, бул ачкычты жазып алабыз, ал келечекте бизге пайдалуу болот.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Кийинки кадам 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.Dialogues иштеп чыгуучулар барагына өтүшүңүз керек Yandex.Dialogs иштеп чыгуучу баракчасы, ал жерде "Диалог түзүү" баскычын чыкылдатып, "Алисадагы чеберчиликти" тандаңыз.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Көндүм орнотуулар диалогу ачылат.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Биз чеберчилик жөндөөлөрүн кире баштайбыз.

Өндүрүшүңүздүн атын киргизиңиз.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Активдештирүү атын Элис туура түшүнүшү үчүн өтө кылдаттык менен тандалышы керек, нюанстардан - Алиса менен мобилдик тиркеме жана Yandex.Station же Irbis A сыяктуу тилкелер сөздөрдү башкача кабылдай алат.

Биз скриптке жолду серверибизге Telegramдагыдай эле киргизебиз, бирок ал атайын Алиса үчүн сценарий болот, мисалы www.my_server.ru/webhook_alice.php.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Чебер сүйлөй турган үндү тандайбыз, мага Алисанын үнү көбүрөөк жагат.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Эгер сиз мобилдик түзмөктөрдө же браузерде гана иштөөнү пландаштырсаңыз, анда "Сизге экраны бар түзмөк керек" дегенди тандаңыз.

Андан кийин, Алисанын көндүмдөр каталогунун орнотууларын киргизиңиз. Эгерде сиз активдештирүү үчүн "бренд" деген сөздү колдонууну пландап жатсаңыз, анда бренддин веб-сайтын webmaster.yandex.ru кызматында текшеришиңиз керек.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Баардыгы жөндөөлөр менен бүттү, келгиле сценарийлерге өтөбүз.

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 - бул жерде колдонуучунун идентификатору

$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 - бул жерде колдонуучунун идентификатору

Яндекс ар дайым жарыяланган көндүмдөрдү пингдеп турат жана мен билдирүүнү толук иштетүүнү баштабастан скрипттен дароо чыгуу үчүн сапты коштум:

  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сыноо өтмөгүндөгү жаңы жөндөмүңүзгө өтүү менен.

PHPдеги Yandex.Alisa жана Telegram боту бирдей функцияга ээ

Эгер баары туура иштесе, "Модерация үчүн" баскычын чыкылдатуу менен чеберчиликти модерацияга жөнөтө аласыз.

Эми сизде бир эле жол менен иштеген ар кандай платформалар үчүн эки бот бар.

Яндекс.Диалогдор кызматы үчүн документтер бул жерде

Толук скрипттер githubда жайгаштырылган скачать.

Source: www.habr.com

Комментарий кошуу