Goedendag.
Er zijn veel artikelen over Telegram-bots, maar weinig mensen schrijven over vaardigheden voor Alice. Daarom heb ik besloten mijn ervaring te delen over het maken van een eenvoudige Telegram-bot en een Yandex.Alice vaardigheid voor een website met dezelfde functionaliteit.
Dus, hoe richt je een webserver op en verkrijg je een ssl-certificaat daarover ga ik niet vertellen, daar is genoeg over geschreven.
Een Telegram-bot maken
Laten we eerst een Telegram-bot maken. We gaan naar Telegram en vinden daar de bot BotFather.


Kies \/newbot

Voer de naam van de bot in, waarop hij zal reageren, en daarna de gebruikersnaam van de bot. In ruil daarvoor krijgen we een token voor het beheren van de bot. Noteer deze sleutel, deze zullen we later nodig hebben.

De volgende stap is om de Telegram-servers te vertellen naar welke server ze gegevens van de bot moeten verzenden. Dit doen we door een link te maken van de volgende aard:
https: \/\/api.telegram.org\/bot___TOKEN___\/setWebhook?url=https:\/\/____PAD_TOT_SCRIPT___
Vervang ___TOKEN___ door onze eerder verkregen bot-token
Vervang ____PAD_TOT_SCRIPT___ door het adres van het script op onze server, waar de gegevensverwerking zal plaatsvinden (bijvoorbeeld www.my_server.ru\/webhook_telegram.php).
Hier is er een probleem: de server api.telegram.org staat onder blokkade, maar je kunt als volgt te werk gaan: huur de goedkoopste server waar geen beperkingen zijn en geef vanuit de console van deze server het commando
wget ___VERKREGEN_ADRES___
Klaar, de Telegram-bot is gecreëerd en verbonden met jouw server.
Een vaardigheid maken voor Yandex.Alice
Laten we doorgaan met het maken van een vaardigheid voor Yandex.Alice.
Om een vaardigheid te maken, moet je naar de pagina voor ontwikkelaars van Yandex.Dialogen gaan. de pagina voor ontwikkelaars van Yandex.Dialogen, klik daar op 'Een dialoog maken' en kies 'Vaardigheid in Alice'.

Er opent een dialoogvenster voor de instellingen van de vaardigheid.

Laten we beginnen met het invoeren van de instellingen voor de vaardigheid.
Voer de naam van jouw vaardigheid in.

De activeringsnaam moet zeer zorgvuldig worden gekozen, zodat Alice het correct begrijpt. Let op: het mobiele applicatie met Alice en luidsprekers zoals de Yandex.Station of Irbis A kunnen woorden verschillend interpreteren.
Voer het pad naar het script op onze server in, net zoals voor Telegram, maar dit zal een script specifiek voor Alice zijn, bijvoorbeeld www.my_server.ru\/webhook_alice.php.

Kies de stem waarmee de vaardigheid zal spreken. Ik vind de stem van Alice het prettigst.

Als het werk alleen op mobiele apparaten of in de browser is gepland, kiezen we voor 'Een apparaat met een scherm is nodig'.
Vervolgens voeren we de instellingen in voor de vaardighedencatalogus van Alice. Als je van plan bent om een merkwoord voor activatie te gebruiken, moet je de site van het merk verifiëren via webmaster.yandex.ru.

Met de instellingen is het klaar, laten we verder gaan met de scripts.
Telegram-bot script
Laten we beginnen met het script voor Telegram.
We koppelen de bibliotheek aan die de berichten van de bot en Alice zal verwerken:
include_once 'webhook_parse.php';
We stellen de token van onze bot in:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
We ontvangen gegevens:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
We splitsen de gegevens in variabelen:
if (!$request)
{
die();
\/\/ Sommige foutoutput (aanvraag is geen geldige JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
\/\/ Sommige foutoutput (aanvraag heeft geen bericht)
}
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);
}
Nu kunnen we met de variabelen werken:
$tokens — hier zijn nu alle woorden die de gebruiker heeft ingevoerd
$user_id — hier is de id van de gebruiker
$msg_chat_id — de chat waar de bot het commando heeft ontvangen
$msg_user_name — de naam van de gebruiker
Vervolgens roepen we de functie Parse_Tokens aan voor verwerking:
$Out_Str = Parse_Tokens($tokens);
En we sturen een antwoord verzenden:
Send_Out($user_id, $Out_Str);
De Send_Out functie is simpel en ziet er zo uit:
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);
}
Het script voor de vaardigheid voor Yandex.Alisa
Laten we nu overgaan naar het script voor Alice, dit is bijna hetzelfde als dat voor Telegram.
We koppelen ook de bibliotheek aan die de berichten van de bot en Alice zal verwerken, plus de bibliotheek met klassen voor Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
We ontvangen gegevens:
$data = json_decode(trim(file_get_contents('php://input')), true);
We splitsen de gegevens in variabelen:
als (isset($data['request']))
{
//original_utterance
als (isset($data['meta']))
{
$data_meta = $data['meta'];
als (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
}
als (isset($data['request']))
{
$data_req = $data['request'];
als (isset($data_req['original_utterance']))
{
$original_utterance = $data_req['original_utterance'];
}
als (isset($data_req['command'])) {$data_msg = $data_req['command'];}
als (isset($data_req['nlu']))
{
$data_nlu = $data_req['nlu'];
als (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
// $data_token_count = count($data_tokens);
}
}
als (isset($data['session']))
{
$data_session = $data['session'];
als (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
als (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
als (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
als (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
als (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
}
}
Er zijn iets minder noodzakelijke variabelen hier:
$tokens — hier zijn nu alle woorden die de gebruiker heeft ingevoerd
$user_id — hier is de id van de gebruiker
Yandex pingt voortdurend gepubliceerde vaardigheden, en ik heb een regel toegevoegd om direct het script te verlaten, zonder de volledige berichtverwerking te starten:
als (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
We roepen de functie Parse_Tokens aan voor verwerking, hij is dezelfde als die voor Telegram:
$Out_Str = Parse_Tokens($tokens);
En we sturen een antwoord verzenden:
Send_Out($user_id, $Out_Str);
De functie Send_Out is hier ingewikkelder:
functie 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 Einde ///////////
////////// 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;
als (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();
}
We hebben het script voor Alice afgerond.
Het script voor de verwerking Parse_Tokens heb ik puur als voorbeeld gemaakt, je kunt daar alle controles en verwerkingen doen.
functie Parse_Tokens($tokens)
{
$out = "";
// doe iets met tokens //
$out = "Je hebt " . count($tokens) . " woorden ingevoerd: " . implode($tokens, " ");
return $out;
}
Als je communicatie met de gebruiker van een complexere aard nodig hebt dan vraag-antwoord, dan moet je $user_id van de gebruiker en reeds verkregen gegevens in de database (bijvoorbeeld MySQL) opslaan en deze analyseren in de functie Parse_Tokens.
Dat is eigenlijk alles, als alles goed gedaan is, zou de Telegram-bot al beschikbaar moeten zijn, je kunt de vaardigheid van Alice controleren. dialogs.yandex.ru/developer, door naar je nieuwe vaardigheid te gaan op het tabblad testen.

Als alles correct werkt, kun je de vaardigheid ter goedkeuring indienen door op de knop 'Ter goedkeuring' te drukken.
Nu heeft u twee bots voor verschillende platforms die hetzelfde werken.
Documentatie voor de service Yandex.Dialogen here
Volledige scripts zijn beschikbaar op GitHub downloaden.
Bron: habr.com
