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.
Dewiswch / newbot
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.
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,
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
Bydd yr ymgom gosodiadau sgiliau yn agor.
Rydyn ni'n dechrau mynd i mewn i'r gosodiadau sgiliau.
Rhowch enw eich sgil.
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
Rydym yn dewis y llais y bydd y sgil yn siarad ag ef, rwy'n hoffi llais Alice yn fwy.
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.
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
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
Sgriptiau llawn wedi'u postio ar github
Ffynhonnell: hab.com