Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Prynhawn da.

Mae yna lawer o erthyglau ar bwnc bots Telegram, ond ychydig o bobl sy'n ysgrifennu am sgiliau ar gyfer Alice, ac ni wnes i ddod o hyd i unrhyw wybodaeth ar sut i wneud un bot, felly penderfynais rannu fy mhrofiad ar sut i wneud bots sengl. bot Telegram syml a sgil Yandex.Alice ar gyfer y wefan sydd â'r un swyddogaeth.

Felly, ni fyddaf yn dweud wrthych sut i godi gweinydd gwe a chael tystysgrif ssl, mae digon wedi'i ysgrifennu amdano.

Creu bot Telegram

Yn gyntaf, gadewch i ni greu bot Telegram, ar gyfer hyn rydyn ni'n mynd i Telegram a dod o hyd i'r bot BotFather yno.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Dewiswch / newbot

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Rydyn ni'n nodi enw'r bot y bydd yn ymateb iddo, yna rydyn ni'n nodi enw'r bot, mewn ymateb rydyn ni'n cael tocyn i reoli'r bot, rydyn ni'n ysgrifennu'r allwedd hon, bydd yn ddefnyddiol i ni yn y dyfodol.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Y cam nesaf yw dweud wrth weinyddion Telegram pa weinydd i anfon data o'r bot ato. I wneud hyn, rydym yn gwneud dolen o'r ffurflen:

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

___TOKEN___ rydyn ni'n rhoi ein tocyn o'r bot yn ei le, a dderbyniwyd yn gynharach

____PATH_TO_SCRIPT____ rydym yn disodli gyda chyfeiriad y sgript ar ein gweinydd lle bydd y data yn cael ei brosesu (er enghraifft, www.my_server.ru/webhook_telegram.php).

Mae problem yma, mae'r gweinydd api.telegram.org yn cael ei rwystro, ond gallwch wneud hyn: rhentu'r gweinydd rhataf lle nad oes cyfyngiadau a rhoi'r gorchymyn o gonsol y gweinydd hwn

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

Dyna ni, mae'r bot Telegram yn cael ei greu a'i gysylltu â'ch gweinydd.

Creu sgil ar gyfer Yandex.Alisa

Gadewch i ni symud ymlaen i greu sgil ar gyfer Yandex.Alice.

I greu sgil, mae angen i chi fynd i dudalen datblygwyr Yandex.Dialogues Tudalen datblygwr Yandex.Dialogs, cliciwch yno "Creu deialog" a dewis "Sgil yn Alice".

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Bydd yr ymgom gosodiadau sgiliau yn agor.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Rydyn ni'n dechrau mynd i mewn i'r gosodiadau sgiliau.

Rhowch enw eich sgil.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Dylid dewis yr enw actifadu yn ofalus iawn fel bod Alice yn ei ddeall yn gywir, o'r naws - gall cymhwysiad symudol gydag Alice a cholofnau fel Yandex.Station neu Irbis A ganfod geiriau'n wahanol.

Rydyn ni'n mynd i mewn i'r llwybr i'r sgript ar ein gweinydd yn yr un ffordd ag ar gyfer Telegram, ond bydd yn sgript yn benodol ar gyfer Alice, er enghraifft www.my_server.ru/webhook_alice.php.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Rydym yn dewis y llais y bydd y sgil yn siarad ag ef, rwy'n hoffi llais Alice yn fwy.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Os ydych chi'n bwriadu gweithio ar ddyfeisiau symudol neu mewn porwr yn unig, yna dewiswch "Mae angen dyfais gyda sgrin arnoch chi."

Nesaf, nodwch y gosodiadau ar gyfer catalog sgiliau Alice. Os ydych chi'n bwriadu defnyddio'r gair "brand" ar gyfer actifadu, mae angen i chi wirio gwefan y brand yn y gwasanaeth webmaster.yandex.ru.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Dyna i gyd gyda'r gosodiadau, gadewch i ni symud ymlaen i'r sgriptiau.

Sgript bot telegram

Gadewch i ni ddechrau gyda sgript ar gyfer Telegram.

Rydym yn cysylltu'r llyfrgell lle bydd negeseuon o'r bot ac Alice yn cael eu prosesu:

include_once 'webhook_parse.php';

Rydyn ni'n gosod arwydd ein bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Rydym yn derbyn data:

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

Dosrannu'r data yn newidynnau:

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

Nawr gallwch chi weithio gyda newidynnau:

$tokens - dyma nawr yr holl eiriau a roddwyd gan y defnyddiwr

$user_id - ID defnyddiwr yma

$msg_chat_id - sgwrs lle derbyniodd y bot y gorchymyn

$msg_user_name - enw defnyddiwr

Nesaf, rydym yn galw'r swyddogaeth Parse_Tokens ar gyfer prosesu:

$Out_Str = Parse_Tokens($tokens);

Ac anfonwch ymateb:

Send_Out($user_id, $Out_Str);

mae'r swyddogaeth Send_Out yn syml ac yn edrych fel hyn:

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

Sgript sgil ar gyfer Yandex.Alisa

Nawr, gadewch i ni symud ymlaen at y sgript ar gyfer Alice, mae bron yr un peth ag ar gyfer Telegram.

Rydym hefyd yn cysylltu'r llyfrgell lle bydd negeseuon o'r bot ac Alice yn cael eu prosesu, ynghyd â llyfrgell gyda dosbarthiadau ar gyfer Alice:

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

Rydym yn derbyn data:

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

Dosrannu'r data yn newidynnau:

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

Mae yna ychydig llai o newidynnau yma:

$tokens - dyma nawr yr holl eiriau a roddwyd gan y defnyddiwr

$user_id - ID defnyddiwr yma

Mae Yandex yn pingio sgiliau cyhoeddedig yn gyson, ac ychwanegais linell i adael y sgript ar unwaith heb ddechrau prosesu'r neges yn llawn:

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

Rydyn ni'n galw'r swyddogaeth Parse_Tokens ar gyfer prosesu, mae yr un peth ag ar gyfer Telegram:

$Out_Str = Parse_Tokens($tokens);

Ac anfonwch ymateb:

Send_Out($user_id, $Out_Str);

Mae'r swyddogaeth Anfon_Out yn fwy cymhleth yma:

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

Gorffen y sgript ar gyfer Alice.

Er enghraifft yn unig y gwnaed y sgript brosesu Parse_Tokens ei hun, gallwch wneud unrhyw wiriadau a phrosesu yno.

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

Os oes angen i chi gyfathrebu â defnyddiwr ar ffurf fwy cymhleth nag ateb cwestiwn, yna bydd angen i chi gadw $user_id y defnyddiwr a'r data a dderbyniwyd eisoes gan y defnyddiwr yn y gronfa ddata (er enghraifft, mysql) a'u dadansoddi yn y swyddogaeth Parse_Tokens.

Mewn gwirionedd, mae hyn bron yn bopeth, os gwneir popeth yn gywir, yna mae'r Telegram bot eisoes ar gael, gellir gwirio sgil Alice dialogs.yandex.ru/developertrwy fynd i'ch sgil newydd ar y tab profi.

Yandex.Alisa a Telegram bot yn PHP gyda'r un swyddogaeth

Os yw popeth yn gweithio'n gywir, gallwch anfon y sgil i'w safoni trwy glicio ar y botwm "Ar gyfer safoni".

Nawr mae gennych chi ddau bot ar gyfer gwahanol lwyfannau ar unwaith, sy'n gweithio yn yr un ffordd.

Dogfennaeth ar gyfer y gwasanaeth Yandex.Dialogues yma

Sgriptiau llawn wedi'u postio ar github скачать.

Ffynhonnell: hab.com

Ychwanegu sylw