God dag.
Det finns mÄnga artiklar om Telegram-botar, men fÄ skriver om fÀrdigheterna för Alice, och jag har inte hittat nÄgon information om hur man gör en enhetlig bot, sÄ jag ville dela med mig av min erfarenhet av hur man skapar en enkel Telegram-bot och en Yandex.Alice fÀrdighet för en webbplats med en gemensam funktionalitet.
SÄ, hur man stÀller upp en webbserver och fÄr ssl-certifikat jag kommer inte att gÄ in pÄ, det finns redan tillrÀckligt med information om detta.
Skapa en Telegram-bot
Först skapar vi en Telegram-bot, för detta gÄr vi till Telegram och hittar boten BotFather.


VĂ€lj /newbot

Ange namnet pÄ boten som den kommer att svara pÄ, och sedan skriver vi in botens anvÀndarnamn, i svar fÄr vi en token för att hantera boten, vi antecknar denna nyckel, den kommer att vara anvÀndbar senare.

NÀsta steg Àr att informera Telegram-servrarna om vilken server de ska skicka data frÄn boten till. För detta skapar vi en lÀnk av typen:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____SCRIPTSJĂNG___
___TOKEN___ ersÀtter vi med vÄr token frÄn boten, som vi fick tidigare.
____SCRIPTSJĂNG___ ersĂ€tter vi med adressen till skriptet pĂ„ vĂ„r server, dĂ€r databehandling kommer att ske (till exempel www.my_server.ru/webhook_telegram.php).
Det hÀr Àr ett problem, servern api.telegram.org Àr blockerad, men man kan göra sÄ hÀr: hyra den billigaste server dÀr det inte finns nÄgra begrÀnsningar och ge kommandot frÄn konsolen pÄ den servern
wget ___ADRESS___
Klart, Telegram-boten Àr skapad och kopplad till din servern.
Skapa en fÀrdighet för Yandex.Alice
LÄt oss gÄ vidare till att skapa en fÀrdighet för Yandex.Alice.
För att skapa en fÀrdighet mÄste du gÄ till Yandex.Diagrammer utvecklarens sida. Utvecklarens sida för Yandex.Diagrammer, klicka dÀr pÄ "Skapa dialog" och vÀlj "FÀrdighet i Alice".

InstÀllningsdialogen för fÀrdigheten öppnas.

Vi börjar ange instÀllningarna för fÀrdigheten.
Skriv in namnet pÄ din fÀrdighet.

Aktiveringsnamnet bör vĂ€ljas mycket noggrant, sĂ„ att Alice förstĂ„r det korrekt, med nĂ„gra nyanser â mobilappen med Alice och högtalare som Yandex.Station eller Irbis A kan uppfatta orden pĂ„ olika sĂ€tt.
Ange sökvÀgen till skriptet pÄ vÄr server pÄ samma sÀtt som för Telegram, men detta kommer att vara skriptet specifikt för Alice, till exempel www.my_server.ru/webhook_alice.php.

VÀlj rösten som fÀrdigheten ska tala med, jag gillar verkligen Alice rösten.

Om arbetet endast planeras att fungera pÄ mobila enheter eller i webblÀsare, vÀlj dÄ "Behöver en enhet med skÀrm".
Vi anger nu instĂ€llningarna för Alicias fĂ€rdighetskatalog. Om du planerar att anvĂ€nda ett aktiveringsord â varumĂ€rket, behöver du verifiera varumĂ€rkets webbplats via tjĂ€nsten webmaster.yandex.ru.

InstÀllningarna Àr klara, vi gÄr vidare till skripten.
Telegram-botskript
LÄt oss börja med skriptet för Telegram.
Vi ansluter biblioteket som kommer att hantera meddelanden frÄn boten och Alicia:
include_once 'webhook_parse.php';
Vi stÀller in token för vÄr bot:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Vi hÀmtar data:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Vi bryter ner datan i variabler:
if (!$request)
{
die();
// NÄgot felmeddelande (request Àr inte giltig JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// NÄgot felmeddelande (request har inget meddelande)
}
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 kan vi arbeta med variablerna:
$tokens â hĂ€r finns nu alla ord som anvĂ€ndaren skrev
$user_id â hĂ€r Ă€r anvĂ€ndarens id
$msg_chat_id â chatten dĂ€r boten fick kommandot
$msg_user_name â anvĂ€ndarens namn
DÀrefter anropar vi funktionen Parse_Tokens för behandling:
$Out_Str = Parse_Tokens($tokens);
Och skickar svaret:
Send_Out($user_id, $Out_Str);
Funktionen Send_Out Àr enkel och ser ut sÄ hÀr:
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);
}
Â
Skriptet för fÀrdigheten till Yandex.Alice
Nu gÄr vi vidare till skriptet för Alice, det Àr nÀstan detsamma som för Telegram.
Vi ansluter ocksÄ biblioteket som kommer att hantera meddelanden frÄn boten och Alicia, plus biblioteket med klasser för Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Vi hÀmtar data:
$data = json_decode(trim(file_get_contents('php://input')), true);
Vi bryter ner datan i variabler:
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'];}
}
}
HÀr finns nÄgot fÀrre nödvÀndiga variabler:
$tokens â hĂ€r finns nu alla ord som anvĂ€ndaren skrev
$user_id â hĂ€r Ă€r anvĂ€ndarens id
Yandex pingar stÀndigt publicerade fÀrdigheter, och jag har lagt till en rad för att omedelbart avbryta skriptet utan att köra en fullstÀndig meddelandehantering:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Vi kallar funktionen Parse_Tokens för bearbetning, den Àr densamma som för Telegram:
$Out_Str = Parse_Tokens($tokens);
Och skickar svaret:
Send_Out($user_id, $Out_Str);
Funktionen Send_Out hÀr Àr lite mer komplex:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
/////////// GENERERA BAS FĂR UTE ////////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
/////////// GENERERA BAS FĂR UTE Slut ////////
/////////// UTE MSG GENERERA ////////
$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) 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();
}
Skriptet för Alice Àr klart.
SjÀlva behandlingsskriptet Parse_Tokens Àr gjort som ett exempel, du kan göra vilka kontroller och bearbetningar som helst dÀr.
function Parse_Tokens($tokens)
{
$out = "";
// gör nÄgot med tokens //
$out = "Du har angivit " . count($tokens) . " ord: " . implode($tokens, " ");
return $out;
}
Om du behöver mer komplex kommunikation med anvÀndaren Àn frÄga-svar, dÄ mÄste du spara anvÀndarens $user_id i databasen (till exempel mysql) samt redan erhÄllna data frÄn anvÀndaren och analysera dem i funktionen Parse_Tokens.
Det Àr nÀstan allt, om allt Àr gjort korrekt Àr Telegram-boten redan tillgÀnglig, fÀrdigheten för Alice kan kontrolleras dialogs.yandex.ru/developer, genom att gÄ till din nya fÀrdighet pÄ fliken testning.

Om allt fungerar korrekt kan du skicka fÀrdigheten för moderering genom att trycka pÄ knappen "För moderering".
Nu har du tvÄ botar för olika plattformar som fungerar pÄ samma sÀtt.
Dokumentation för tjÀnsten Yandex.Dialoger ). Ett typiskt exempel pÄ anvÀndning:
FullstÀndiga skript ligger pÄ github ladda ner.
KĂ€lla: habr.com
