Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Բարի օր:

Telegram-բոթերի մասին շատ հոդվածներ կան, բայց Ալիսի համար համատեղ հմտությունների մասին գրեթե ոչ ոք չի գրում, իսկ ընդհանուր բոտ ստեղծելու վերաբերյալ տեղեկատվություն ևս չգտա, հետևաբար որոշեցի կիսվել իմ փորձով՝ ինչպես ստեղծել պարզ Telegram-բոտ և Յանդեքս.Ալիսայի աշխատանքն այդ կայքի համար, որը ունի միասնական ֆունկցիոնալություն:

Այսպիսով, ինչպես բարձրացնել վեբ սերվերը և ձեռք բերել ssl-սերտիֆիկատ Ես չեմ պատմի, այս մասին բավականաչափ գրականություն կա:

Telegram-բոտի ստեղծում

Առաջին հերթին ստեղծենք Telegram-բոտ, դրա համար մտնում ենք Telegram և որոնում ենք BotFather:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Ընտրում ենք /newbot

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Մատնանշում ենք բոտի անվանումը, որի վրա նա կհետադարձի, ապա մտնում ենք բոտի անունը, ի պատասխան ստանում ենք թունել վերահսկելու համար, գրանցում ենք այս բանալին, այն մեզ պետք կգա դրանից հետո:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Հաջորդ քայլը՝ տեղեկացնել Telegram-ի սերվերներին, թե որ սերվերին պետք է փոխանցվեն բոտից ստացված տվյալները: Դրա համար անում ենք տեսքով կապ:

https://api.telegram.org/bot___ԹՈԿԵՆ___/setWebhook?url=https://____ԱԴՐԵՍ_ԴՈ_ՍԿՐՊԻՏԱ___

___ԹՈԿԵՆ___ փոխարինենք մեր բոտից ստացած բանալով

____ԱԴՐԵՍ_ԴՈ_ՍԿՐՊԻՏԱ___ փոխարինենք մեր սերվերի վրա տվյալների մշակման ցանցային հասցեով (օրինակ՝ www.my_server.ru/webhook_telegram.php):

Այստեղ կա խնդիր, api.telegram.org սերվերը ենթակա է արգելքի, բայց կարելի է անել հետևյալը: վարձակալել ամենացածր գինը սերվեր այնտեղ, որտեղ սահմանափակումներ չկան և տալ սերվերի կոնսոլից հրահանգ

wget ___ՍՏԱՑԱԾ_ԱԴՐԵՍ___

Բոլորը, Telegram-բոտը ստեղծվել է և կապվել է Ձեր սերվեր.

Յանդեքս.Ալիսայի համար հմտության ստեղծում

Մենք անցնում ենք Յանդեքս.Ալիսայի հմտության ստեղծմանը:

Հմտություն ստեղծելու համար պետք է անցնել Յանդեքս.Դիալոգների մշակողների էջ: Յանդեքս.Դիալոգների մշակողների էջ, այնտեղ սեղմում ենք «Ստեղծել դիալոգ» և ընտրում «Հմտություն Ալիսայում»:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Հրաժեշտ հմտության պարամետրերի դիալոգը կբացվի:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Ուրիշում ենք հմտության պարամետրերը:

Մատնանշում ենք Ձեր հմտության անվանումը:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Ակտիվացման անունը պետք է ընտրվի շատ ուշադիր, որպեսզի Ալիսան ճիշտ ընկալել այս խոսքերն, այն բանում, որ՝ mobile app-ն Ալիսայի և նմանատիպ սարքերի (ինչպիսիք են Յանդեքս.Ստացիան կամ Irbis A) հնարավորություն կարող է տարբեր ձևով ընկալել բառերը:

Մատնանշում ենք մեր սերվերի վրա սքրիպտի հասցեն այնպես, ինչպես նաև Telegram-ի համար, սակայն դա կլինի իրականում Ալիսայի համար սքրիպտ, օրինակ՝ www.my_server.ru/webhook_alice.php:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Ընտրում ենք ձայնը, որով կխոսի հմտությունն, ինձ ավելի շատ հետաքրքրում է հենց Ալիսայի ձայնը:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Եթե նախատեսվում է աշխատել միայն շարժական սարքերի վրա կամ բրաուզերում, ապա ընտրում ենք «Պետք է լինի էկրանով սարք»:

Հետո մուտքագրում ենք Ալիսայի հմտության ցանկի համար պարամետրեր: Եթե ծրագրում եք ակտիվացման համար օգտագործել բառ— ապրանքանիշ, պետք է пройти վերհաստատման կայքը ապրանքանիշի в webmaster.yandex.ru:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Պարամետրերի հետ ամեն ինչ կարգին է, անցնում ենք սկրիպտներին:

Telegram-բոտի սկրիպտ

Սկսենք Telegram-ի սկրիպտից:

Միացնում ենք գրադարանը, որտեղ բոտից և Ալիսայից ստացված հաղորդագրությունները կկառուցվեն:

include_once 'webhook_parse.php';

Ունշում ենք մեր բոտի թունելը:

$tg_bot_token = "_____ՁԵՐ_BOT_TOKEN_____";

Տվյալները ստանում ենք՝

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

Տվյալները բաժանում ենք փոփոխականների՝

if (!$request)
{
  die();
    // Ինչ-որ սխալի ելք (դիմումը վավեր JSON չէ)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Ինչ-որ սխալի ելք (դիմումը չունի հաղորդագրություն)
}
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);
}

 

Յանդեքս. Ալիսայի համար հմտության սցենար

Այժմ անցնենք Ալիսայի համար սցենարին, այն գրեթե նույնն է, ինչ Տելեգրամի համար:

Այնպես որ, միացնում ենք գրադարանը, որտեղ մշակվելու են բոտի և Ալիսայի հաղորդագրությունները, ինչպես նաև Ալիսայի դասերի գրադարանը՝

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

Այստեղ անհրաժեշտ փոփոխականները biraz azdır:

$tokens — այստեղ այժմ բոլոր բառերը, որ օգտագործողը մտել է

$user_id — այստեղ օգտագործողի id-ն

Յանդեքսն մշտապես պինգ է անում հրապարակված հմտություններին, և ես ավելացրել եմ տողի, որպեսզի անմիջապես դուրս գայի սցենարից, չտեսնելով ամբողջ հաղորդագրության մշակումը:

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

Կանխատեսման մշակման համար կանչում ենք Parse_Tokens ֆունկցիան, այն նույնն է, ինչ հիմա օգտագործում ենք Տելեգրամի համար:

$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) 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 = "";
  // ինչ-որ բան արեք tokens-ի հետ //
  $out = "Ձեր մուտքագրված է " . count($tokens) . " բառեր: " . implode($tokens, " ");
  return $out;
}

Եթե ձեզ հարկավոր է ավելի پیچիկ խոսակցություն օգտվողի հետ, քան հարց-պատասխան, ապա ձեզ հարկավոր է պահել վերնակ (օրինակ mysql) $user_id-ի օգտագործողից և արդեն ստացված տվյալները, և վերլուծել դրանք Parse_Tokens ֆունկցիայում:

Սրա շուրջ գրեթե ամեն բան է, եթե ամեն բան ճիշտ արվել է, ապա Telegram-բոտն արդեն հասանելի է, Ալիսի հմտությունը կարելի է ստուգել dialogs.yandex.ru/developer, գնալով ձեր նոր հմտության փորձարկման вкладка:

Յանդեքս.Ալիսա և Telegram բոտ PHP-ում միասնական ֆունկցիոնալությամբ

Եթե ամեն բան ընթանում է ճիշտ, կարող եք ուղարկել հմտությունը մոդերացիայի, սեղմելով «Մոդերացիա» կոճակը:

Հիմա դուք ունեք երկու բոտ տարբեր պլատֆորմների համար, որոնք աշխատում են նույնքան լավ:

Յանդեքս.Դիալոգների ծառայության փաստաթղթավորումը այստեղ

Մանրամասն սցենարները հրապարակված են github-ում ընտրել.

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster