Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Good afternoon.

Li ser mijara botên Telegram gelek gotar hene, lê hindik kes li ser jêhatîbûnên ji bo Alice dinivîsin, û min tu agahdarî li ser meriv çawa yek botek çêdike nedît, ji ber vê yekê min biryar da ku ezmûna xwe li ser meriv çawa çêbike. Bot Telegram-a hêsan û jêhatîbûna Yandex.Alice ji bo malperê xwedî heman fonksiyonê ye.

Ji ber vê yekê, ez ê ji we re nebêjim ka meriv çawa serverek malperek mezin dike û sertîfîkayek ssl-ê bistîne, li ser wê têr hatiye nivîsandin.

Afirandina botek Telegram

Pêşî, bila em botek Telegram biafirînin, ji bo vê yekê em diçin Telegramê û li wir bota BotFather bibînin.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Hilbijêre / newbot

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Em navê botê ku ew ê jê re bersivê bide dinivîsin, paşê em navê botê dinivîsin, di bersivê de em nîşanek ji bo kontrolkirina botê distînin, em vê mifteyê dinivîsin, ew ê di pêşerojê de ji me re bikêr be.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Pêngava paşîn ev e ku meriv ji serverên Telegram re bêje ka kîjan serverê daneyan ji botê bişîne. Ji bo vê yekê, em girêdanek formê çêbikin:

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

___TOKEN___ em bi tokena xwe ya ji botê, ku berê hatî standin, diguhezînin

____PATH_TO_SCRIPT____ em bi navnîşana skrîptê ya li ser servera xwe veguherînin ku dê dane bêne hilanîn (mînak, www.my_server.ru/webhook_telegram.php).

Li vir pirsgirêkek heye, servera api.telegram.org di bin astengkirinê de ye, lê hûn dikarin vê yekê bikin: servera herî erzan ku li wir ti sînordar nînin kirê bikin û fermanê ji konsolê vê serverê bidin.

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

Ew e, bota Telegram-ê hatî çêkirin û bi servera we ve girêdayî ye.

Afirandina jêhatîbûnek ji bo Yandex.Alisa

Ka em ji bo Yandex.Alice jêhatîbûnek çêbikin.

Ji bo afirandina jêhatîbûnek, hûn hewce ne ku biçin rûpela pêşdebiran ya Yandex.Dialogues Rûpelê pêşdebirkerê Yandex.Dialogs, li wir bikirtînin "Diyalogê biafirînin" û "Skill in Alice" hilbijêrin.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Dê diyaloga mîhengên jêhatîbûnê vebe.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Em dest bi ketina mîhengên jêhatîbûnê dikin.

Navê jêhatiya xwe binivîse.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Navê çalakkirinê divê pir bi baldarî were bijartin da ku Alice wê rast, ji nuwazeyan fêm bike - serîlêdanek mobîl a bi Alice û stûnên mîna Yandex.Station an Irbis A dikare peyvan bi rengek cûda fêm bike.

Em bi heman awayê ku ji bo Telegram-ê digihîje rênivîsa li ser servera xwe, lê ew ê bi taybetî ji bo Alice bibe nivîsek, mînakî www.my_server.ru/webhook_alice.php.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Em dengê ku dê jêhatî biaxive hilbijêrin, ez ji dengê Alice bêtir hez dikim.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Heke hûn plan dikin ku tenê li ser cîhazên mobîl an di gerokek de bixebitin, wê hingê "Hûn amûrek bi ekranek hewce ne" hilbijêrin.

Dûv re, mîhengên ji bo kataloga jêhatîbûna Alice têkevin. Heke hûn plan dikin ku peyva "brand" ji bo çalakkirinê bikar bînin, hûn hewce ne ku malpera marqeyê di karûbarê webmaster.yandex.ru de verast bikin.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Ew hemî bi mîhengan re ye, em biçin ser senaryoyan.

Nivîsara botê ya Telegram

Ka em bi skrîptek ji bo Telegram dest pê bikin.

Em pirtûkxaneya ku dê peyamên ji bot û Alice werin hilanîn girêdidin:

include_once 'webhook_parse.php';

Me nîşana bota xwe destnîşan kir:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Em daneyan distînin:

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

Parvekirina daneyan di nav guherbaran de:

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

Naha hûn dikarin bi guherbaran re bixebitin:

$tokens - li vir niha hemî peyvên ku bikarhêner tê de hene

$user_id - id bikarhêner li vir

$msg_chat_id - sohbeta ku botê ferman wergirt

$msg_user_name - navê bikarhêner

Piştre, em fonksiyona Parse_Tokens ji bo pêvajoyê vedixwînin:

$Out_Str = Parse_Tokens($tokens);

Û bersivek bişînin:

Send_Out($user_id, $Out_Str);

fonksiyona Send_Out hêsan e û bi vî rengî xuya dike:

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 script bo Yandex.Alisa

Naha em biçin ser senaryoya Alice, ew hema hema wekî Telegram e.

Di heman demê de em pirtûkxaneya ku dê peyamên ji bot û Alice werin hilanîn, û pirtûkxaneyek bi dersên ji bo Alice ve girêdidin:

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

Em daneyan distînin:

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

Parvekirina daneyan di nav guherbaran de:

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

Li vir çend guherbarên hindiktir hene:

$tokens - li vir niha hemî peyvên ku bikarhêner tê de hene

$user_id - id bikarhêner li vir

Yandex bi domdarî jêhatîbûnên çapkirî ping dike, û min rêzek lê zêde kir ku tavilê ji senaryoyê derkevim bêyî ku dest bi pêvajoyek tevahî ya peyamê bikim:

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

Em ji bo pêvajoyê wekî fonksiyona Parse_Tokens dibêjin, ew eynî wekî Telegram e:

$Out_Str = Parse_Tokens($tokens);

Û bersivek bişînin:

Send_Out($user_id, $Out_Str);

Fonksiyona Send_Out li vir tevlihevtir e:

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

Senaryoya Alice qedand.

Skrîpta pêvajoyê ya Parse_Tokens bixwe bi tenê ji bo nimûne hate çêkirin, hûn dikarin li wir her kontrol û pêvajoyê bikin.

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

Heke hûn hewce ne ku bi bikarhênerek bi rengek ji pirs-bersivê tevlihevtir re têkilî daynin, wê hingê hûn hewce ne ku $user_id-ya bikarhêner û daneyên ku berê ji bikarhêner di databasê de hatine wergirtin (mînak, mysql) hilînin û wan di nav de analîz bikin. fonksiyona Parse_Tokens.

Bi rastî, ev hema hema her tişt e, heke her tişt rast were kirin, wê hingê bota Telegram jixwe heye, jêhatiya Alice dikare were kontrol kirin dialogs.yandex.ru/developerbi çûna jêhatiya xwe ya nû li ser tabloya ceribandinê.

Yandex.Alisa û Telegram bot di PHP de bi heman fonksiyonê

Ger her tişt rast dixebite, hûn dikarin bi tikandina bişkoka "Ji bo nermkirinê" jêhatîbûnê ji bo moderatoriyê bişînin.

Naha hûn du botên ji bo platformên cihêreng yekcar hene, ku bi heman rengî dixebitin.

Belgekirin ji bo karûbarê Yandex.Dialogues vir

Nivîsarên tevahî li ser github hatine şandin скачать.

Source: www.habr.com

Add a comment