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.Dialogues әзірлеушілер бетіне өту керек Yandex.Dialogs әзірлеуші ​​беті, сол жерде «Диалог құру» түймесін басып, «Алисадағы шеберлікті» таңдаңыз.

PHP тіліндегі Yandex.Alisa және Telegram боты бірдей функционалдығы бар

Дағды параметрлерінің диалогтық терезесі ашылады.

PHP тіліндегі Yandex.Alisa және Telegram боты бірдей функционалдығы бар

Біз шеберлік параметрлерін енгізуді бастаймыз.

Өз шеберлігіңіздің атын енгізіңіз.

PHP тіліндегі Yandex.Alisa және Telegram боты бірдей функционалдығы бар

Белсендіру атауын Алиса дұрыс түсінуі үшін өте мұқият таңдау керек, нюанстардан - Алиса бар мобильді қосымша және Яндекс.Станция немесе Ирбис А сияқты бағандар сөздерді басқаша қабылдай алады.

Біз сценарийге жолды серверге 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 сайтында жарияланған скачать.

Ақпарат көзі: www.habr.com

пікір қалдыру