Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Goeie middei.

D'r binne in protte artikels oer it ûnderwerp fan Telegram-bots, mar in pear minsken skriuwe oer feardichheden foar Alice, en ik fûn gjin ynformaasje oer hoe't jo in inkele bot meitsje kinne, dus ik besleat myn ûnderfining te dielen oer hoe't jo in bot meitsje kinne. ienfâldige Telegram bot en de Yandex.Alice feardigens foar de side mei deselde funksjonaliteit.

Dat, ik sil jo net fertelle hoe't jo in webserver ferheegje en in ssl-sertifikaat krije, der is genôch oer skreaun.

It meitsjen fan in Telegram bot

Litte wy earst in Telegram-bot oanmeitsje, hjirfoar geane wy ​​nei Telegram en fine dêr de BotFather-bot.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Kies /newbot

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Wy ynfiere de namme fan 'e bot wêrmei't it sil reagearje, dan ynfiere wy de namme fan' e bot, as antwurd krije wy in token om de bot te kontrolearjen, wy skriuwe dizze kaai op, it sil nuttich wêze foar ús yn 'e takomst.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

De folgjende stap is om de Telegram-tsjinners te fertellen nei hokker server gegevens fan 'e bot moatte stjoere. Om dit te dwaan, meitsje wy in keppeling fan it formulier:

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

___TOKEN___ ferfange wy mei ús token fan 'e bot, earder ûntfongen

____PATH_TO_SCRIPT____ ferfange wy mei it adres fan it skript op ús tsjinner wêr't de gegevens ferwurke wurde (bygelyks, www.my_server.ru/webhook_telegram.php).

D'r is hjir in probleem, de api.telegram.org-tsjinner is ûnder blokkearjen, mar jo kinne dit dwaan: hiere de goedkeapste tsjinner wêr't gjin beheiningen binne en jou it kommando fan 'e konsole fan dizze tsjinner

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

Dat is it, de Telegram-bot is oanmakke en ferbûn mei jo server.

It meitsjen fan in feardigens foar Yandex.Alisa

Litte wy trochgean mei it meitsjen fan in feardigens foar Yandex.Alice.

Om in feardigens te meitsjen, moatte jo nei de Yandex.Dialogues-ûntwikkeldersside gean Yandex.Dialogs ûntwikkelders side, klik dêr "Meitsje dialooch" en selektearje "Skill yn Alice".

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

It dialoochfinster foar feardigensynstellingen sil iepenje.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Wy begjinne de feardigensynstellingen yn te fieren.

Fier de namme fan jo feardigens yn.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

De aktivearringsnamme moat tige foarsichtich keazen wurde, sadat Alice it goed begrypt, fan 'e nuânses - in mobile applikaasje mei Alice en kolommen lykas Yandex.Station of Irbis A kinne wurden oars waarnimme.

Wy ynfiere it paad nei it skript op ús server op deselde manier as foar Telegram, mar it sil in skript wêze spesifyk foar Alice, bygelyks www.my_server.ru/webhook_alice.php.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Wy kieze de stim wêrmei't de feardigens sil prate, ik hâld mear fan Alice's stim.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

As jo ​​fan plan binne om allinich op mobile apparaten of yn in browser te wurkjen, selektearje dan "Jo hawwe in apparaat nedich mei in skerm."

Fier dan de ynstellings yn foar Alice's feardigenskatalogus. As jo ​​fan plan binne om it wurd "merk" te brûken foar aktivearring, moatte jo de webside fan it merk ferifiearje yn 'e tsjinst webmaster.yandex.ru.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

Dat is alles mei de ynstellings, lit ús gean nei de skripts.

Telegram bot skript

Litte wy begjinne mei in skript foar Telegram.

Wy ferbine de bibleteek wêr't berjochten fan 'e bot en Alice sille wurde ferwurke:

include_once 'webhook_parse.php';

Wy sette it token fan ús bot yn:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Wy ûntfange gegevens:

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

It parsearjen fan de gegevens yn fariabelen:

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

No kinne jo wurkje mei fariabelen:

$tokens - hjir binne no alle wurden dy't de brûker ynfierd hat

$user_id - brûkers-id hjir

$msg_chat_id - petear wêryn de bot it kommando ûntfong

$msg_user_name - brûkersnamme

Dêrnei neame wy de funksje Parse_Tokens foar ferwurking:

$Out_Str = Parse_Tokens($tokens);

En stjoer in reaksje:

Send_Out($user_id, $Out_Str);

de Send_Out-funksje is ienfâldich en sjocht der sa út:

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

Skill skript foar Yandex.Alisa

Litte wy no gean nei it skript foar Alice, it is hast itselde as foar Telegram.

Wy ferbine ek de bibleteek wêr't berjochten fan 'e bot en Alice wurde ferwurke, plus in bibleteek mei klassen foar Alice:

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

Wy ûntfange gegevens:

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

It parsearjen fan de gegevens yn fariabelen:

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

D'r binne hjir in pear minder fariabelen:

$tokens - hjir binne no alle wurden dy't de brûker ynfierd hat

$user_id - brûkers-id hjir

Yandex pingt konstant publisearre feardichheden, en ik haw in rigel tafoege om it skript fuortendaliks te ferlitten sûnder de folsleine ferwurking fan it berjocht te begjinnen:

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

Wy neame de Parse_Tokens-funksje foar ferwurking, it is itselde as foar Telegram:

$Out_Str = Parse_Tokens($tokens);

En stjoer in reaksje:

Send_Out($user_id, $Out_Str);

De Send_Out-funksje is hjir komplisearre:

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

It skript foar Alice klear.

It ferwurkingsskript fan Parse_Tokens sels waard puur makke foar in foarbyld, jo kinne dêr alle kontrôles en ferwurkjen dwaan.

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

As jo ​​moatte kommunisearje mei in brûker fan in mear komplekse foarm dan in fraach-antwurd, dan moatte bewarje de brûker syn $user_id en de gegevens al ûntfongen fan de brûker yn de databank (bygelyks, mysql) en analysearje se yn de funksje Parse_Tokens.

Eigentlik is dit hast alles, as alles goed is dien, dan is de Telegram-bot al beskikber, de feardigens fan Alice kin wurde kontrolearre dialogs.yandex.ru/ûntwikkeldertroch nei jo nije feardigens te gean op it ljepblêd testen.

Yandex.Alisa en Telegram bot yn PHP mei deselde funksjonaliteit

As alles goed wurket, kinne jo de feardigens foar moderaasje stjoere troch op de knop "Foar moderaasje" te klikken.

No hawwe jo twa bots foar ferskate platfoarms tagelyk, dy't op deselde manier wurkje.

Dokumintaasje foar de tsjinst Yandex.Dialogues hjir

Folsleine skripts pleatst op github скачать.

Boarne: www.habr.com

Add a comment