Tere päevast.
Telegrami botide kohta on palju artikleid, kuid Alice'i oskuste kohta kirjutatakse harva, ning teavet selle kohta, kuidas teha ühte bot'i, ei leidnud ma üldse. Seetõttu otsustasin jagada oma kogemust, kuidas luua lihtne Telegrami bot ja Yandex.Alice oskus veebisaidi jaoks, sealhulgas ühine funktsionaalsus.
Nii et, kuidas käivitada veebiserver ja saada ssl-sertifikaat ma ei räägi, selle kohta on piisavalt kirjutatud.
Telegrami boti loomine
Esmalt loome Telegrami boti, selleks läheme Telegrami ja otsime sealt bot'i BotFather.


Valime /newbot

Sisestame boti nime, millele ta reageerib, seejärel sisestame boti kasutajanime. Vastuseks saame бoti juhtimiseks token'i, salvestame selle võtme, see tuleb meile hiljem kasuks.

Järgmine samm on teavitada Telegrami servereid, millisele serverile saata boti andmed. Selleks loome lingi kujul:
https://api.telegram.org/bot___TOKKEN___/setWebhook?url=https://____TEE_SKRIPTINI___
___TOKKEN___ asendame meie varem saadud boti token'iga
____TEE_SKRIPTINI___ asendame meie serveri skripti aadressiga, kus toimub andmete töötlemine (näiteks www.my_server.ru/webhook_telegram.php).
Siin on probleem, server api.telegram.org on blokeeritud, kuid on võimalik teha järgmist: rentida kõige odavam, server seal, kus ei ole piiranguid, ja anda selle serveri konsoolist käsk.
wget ___SAADUD_AADRESS___
Kõik, Telegrami bot on loodud ja seotud teie serveriga.
Osakonna loomine Yandex.Alice jaoks
Liigume edasi osakonna loomise juurde Yandex.Alice jaoks.
Osakonna loomiseks peate minema Yandex.Dialogue arendajate lehele. Yandex.Dialogue arendajate lehele,kliki seal 'Loo dialooge' ja vali 'Osakond Alicele'.

Avaneb osakonna häälte dialoog.

Alustame osakonna seadistuste sisestamist.
Sisestage teie osakonna nimi.

Aktiveerimise nimi tuleks valida väga hoolikalt, et Alice saaks seda õigesti mõista; arvestada tuleb, et Alice mobiilirakendus ja sellised kõlarid nagu Yandex.Station või Irbis A saavad sõnu erinevalt tõlgendada.
Sisestage skripti tee meie serveris samamoodi nagu Telegrami puhul, kuid see on skript, mis on mõeldud just Alicele, näiteks www.my_server.ru/webhook_alice.php.

Valige hääl, millega osakond räägib; mulle meeldib kõige rohkem Alice hääl.

Kui töö toimub ainult mobiilseadmete või brauseri kaudu, valime „Vajalik seadme ekraan“.
Seejärel sisestame Aliase oskuste katalooge seaded. Kui kavatsete aktiveerimiseks kasutada kaubamärki — peate kaubamärgi veebisaidi verifitseerima teenuses webmaster.yandex.ru.

Seadete osas on kõik, liikume skriptide juurde.
Telegrami-boti skript
Alustame Telegrami skriptiga.
Ühendame raamatukogu, kus töödeldakse boti ja Aliase sõnumeid:
include_once 'webhook_parse.php';
Määrame meie boti tokeni:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Saame andmed:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Töötleme andmed muutujateks:
if (!$request)
{
die();
// Mõni viga väljund (päring pole kehtiv JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Mõni viga väljund (päringul puudub sõnum)
}
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);
}
Nüüd saab muutujatega töötada:
$tokens — siin on nüüd kõik sõnade, mille kasutaja sisestab
$user_id — siin on kasutaja id
$msg_chat_id — vestlus, kus bot sai käsu
$msg_user_name — kasutajanimi
Jätkame funktsiooni Parse_Tokens töötlemisega:
$Out_Str = Parse_Tokens($tokens);
Ja saadame vastuse:
Send_Out($user_id, $Out_Str);
Funktsioon Send_Out on lihtne ja näeb välja selline:
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.Alice jaoks mõeldud oskuse skript
Liigume nüüd skripti juurde Alicele, see on peaaegu sama, mis Telegramis.
Lisame ka teegi, kust töötatakse välja botilt ja Alicelt saadud sõnumid, pluss teegi, kus on Alice'i klassid:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Saame andmed:
$data = json_decode(trim(file_get_contents('php://input')), true);
Töötleme andmed muutujateks:
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'];}
}
}
Siin on vajalikke muutujaid veidi vähem:
$tokens — siin on nüüd kõik sõnade, mille kasutaja sisestab
$user_id — siin on kasutaja id
Yandex pings published skills frequently, and I added a line to exit the script immediately without running full message processing:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
We call the Parse_Tokens function for processing, which is the same as for Telegram:
$Out_Str = Parse_Tokens($tokens);
Ja saadame vastuse:
Send_Out($user_id, $Out_Str);
The Send_Out function here is a bit more complex:
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();
}
Skript on lõpetatud Alice jaoks.
Parse_Tokens töötlemiseks mõeldud skript on tehtud lihtsalt näidisena, saate seal teha igasuguseid kontrolle ja töötlemisi.
function Parse_Tokens($tokens)
{
$out = "";
// teeme midagi tokenitega //
$out = "Teie sisestatud " . count($tokens) . " sõna: " . implode($tokens, " ");
return $out;
}
Kui teil on vaja keerulisemat kasutajaga suhtlemist kui küsimus-vastus, peate salvestama andmebaasi (näiteks mysql) $user_id ja juba kasutajalt saadud andmed ning analüüsima neid funktsioonis Parse_Tokens.
Sisuliselt on see peaaegu kõik, kui kõik on õigesti tehtud, on Telegrami bot juba saadaval, Alice oskust saab kontrollida dialogs.yandex.ru/developer, minnes oma uude oskusesse testimise vahelehele.

Kui kõik töötab korralikult, saate oskuse korraldada modereerimise, vajutades nuppu «Modereerimisele».
Nüüd on teil kahte bot'i erinevatele platvormidele, mis töötavad ühtemoodi.
Yandex.Dialogide teenuse dokumentatsioon siin
Täielikud skriptid on üles laetud githubi lae alla.
Allikas: habr.com
