Goedemiddag.
Er zijn veel artikelen over het onderwerp Telegram-bots, maar weinig mensen schrijven over vaardigheden voor Alice, en ik vond geen informatie over het maken van een enkele bot, dus besloot ik mijn ervaring te delen over het maken van een eenvoudige Telegram-bot en de Yandex.Alice-vaardigheid voor de site met dezelfde functionaliteit.
Dus ik zal je niet vertellen hoe je een webserver ophaalt en een ssl-certificaat krijgt, er is genoeg over geschreven.
Een Telegram-bot maken
Laten we eerst een Telegram-bot maken, hiervoor gaan we naar Telegram en zoeken daar de BotFather-bot.
Kies /newbot
We voeren de naam van de bot in waarmee deze zal reageren, dan voeren we de naam van de bot in, als reactie krijgen we een token om de bot te besturen, we schrijven deze sleutel op, deze zal in de toekomst nuttig voor ons zijn.
De volgende stap is om de Telegram-servers te vertellen naar welke server gegevens van de bot moeten worden verzonden. Hiervoor maken we een link van het formulier:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ die we vervangen door ons token van de bot, dat we eerder hebben ontvangen
____PATH_TO_SCRIPT____ vervangen we door het adres van het script op onze server waar de gegevens worden verwerkt (bijvoorbeeld
Er is hier een probleem, de api.telegram.org-server wordt geblokkeerd, maar u kunt dit doen: huur de goedkoopste server waar geen beperkingen zijn en geef het commando vanaf de console van deze server
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Dat is alles, de Telegram-bot is gemaakt en verbonden met uw server.
Een vaardigheid maken voor Yandex.Alisa
Laten we verder gaan met het maken van een vaardigheid voor Yandex.Alice.
Om een vaardigheid te creëren, moet je naar de ontwikkelaarspagina van Yandex.Dialogues gaan
Het dialoogvenster met vaardigheidsinstellingen wordt geopend.
We beginnen de vaardigheidsinstellingen in te voeren.
Voer de naam van uw vaardigheid in.
De activeringsnaam moet zeer zorgvuldig worden gekozen, zodat Alice deze correct begrijpt, uit de nuances - een mobiele applicatie met Alice en kolommen zoals Yandex.Station of Irbis A kan woorden anders waarnemen.
We voeren het pad naar het script op onze server op dezelfde manier in als voor Telegram, maar het zal bijvoorbeeld een script zijn dat specifiek voor Alice is
We kiezen de stem waarmee de vaardigheid zal spreken, ik hou meer van de stem van Alice.
Als u van plan bent alleen op mobiele apparaten of in een browser te werken, selecteert u 'U hebt een apparaat met een scherm nodig'.
Voer vervolgens de instellingen in voor de vaardighedencatalogus van Alice. Als u van plan bent het woord "merk" te gebruiken voor activering, moet u de website van het merk verifiëren in de webmaster.yandex.ru-service.
Dat is alles met de instellingen, laten we verder gaan met de scripts.
Telegram-botscript
Laten we beginnen met een script voor Telegram.
We verbinden de bibliotheek waar berichten van de bot en Alice worden verwerkt:
include_once 'webhook_parse.php';
We stellen het token van onze bot in:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Wij ontvangen gegevens:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
De gegevens ontleden in variabelen:
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);
}
Nu kunt u met variabelen werken:
$tokens - hier zijn nu alle woorden die de gebruiker heeft ingevoerd
$user_id - gebruikers-ID hier
$msg_chat_id - chat waarin de bot de opdracht heeft ontvangen
$msg_user_name - gebruikersnaam
Vervolgens noemen we de Parse_Tokens-functie voor verwerking:
$Out_Str = Parse_Tokens($tokens);
En stuur een reactie:
Send_Out($user_id, $Out_Str);
de functie Send_Out is eenvoudig en ziet er als volgt 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);
}
Vaardigheidsscript voor Yandex.Alisa
Laten we nu verder gaan met het script voor Alice, het is bijna hetzelfde als voor Telegram.
We koppelen ook de bibliotheek waar berichten van de bot en Alice worden verwerkt, plus een bibliotheek met klassen voor Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Wij ontvangen gegevens:
$data = json_decode(trim(file_get_contents('php://input')), true);
De gegevens ontleden in variabelen:
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'];}
}
}
Er zijn hier een paar minder variabelen:
$tokens - hier zijn nu alle woorden die de gebruiker heeft ingevoerd
$user_id - gebruikers-ID hier
Yandex pingt constant gepubliceerde vaardigheden en ik heb een regel toegevoegd om het script onmiddellijk te verlaten zonder de volledige verwerking van het bericht te starten:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
We noemen de Parse_Tokens-functie voor verwerking, het is hetzelfde als voor Telegram:
$Out_Str = Parse_Tokens($tokens);
En stuur een reactie:
Send_Out($user_id, $Out_Str);
De functie Send_Out is hier ingewikkelder:
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();
}
Het script voor Alice afgemaakt.
Het verwerkingsscript Parse_Tokens zelf is puur als voorbeeld gemaakt, u kunt daar alle controles en verwerkingen uitvoeren.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Als u moet communiceren met een gebruiker met een complexere vorm dan een vraag-antwoord, dan moet u de $user_id van de gebruiker en de gegevens die al van de gebruiker zijn ontvangen in de database opslaan (bijvoorbeeld mysql) en deze analyseren in de Parse_Tokens-functie.
Dit is eigenlijk bijna alles, als alles correct is gedaan, is de Telegram-bot al beschikbaar, de vaardigheid van Alice kan worden gecontroleerd
Als alles correct werkt, kun je de vaardigheid voor moderatie verzenden door op de knop "Voor moderatie" te klikken.
Nu heb je twee bots voor verschillende platforms tegelijk, die op dezelfde manier werken.
Documentatie voor de Yandex.Dialogues-service
Volledige scripts gepost op github
Bron: www.habr.com