Salam.
Telegram botlarıyla ilgili çok fazla makale var, ancak Alice için beceriler hakkında pek fazla yazılmamış. Tek bir bot nasıl yapılır konusunda ise hiçbir bilgi bulamadım, bu yüzden basit bir Telegram botu ve web sitemiz için Yandex.Alice becerisi yapma konusundaki deneyimlerimi paylaşmaya karar verdim.
Yani, web sunucusunu nasıl başlatacağımıza ve SSL sertifikası hakkında konuşmayacağım, bu konuda yeterince yazılmış.
Telegram botu oluşturma
Öncelikle, bir Telegram botu oluşturacağız. Bunun için Telegram'a gidip BotFather'ı bulmamız gerekiyor.


Yeni bot seçiyoruz

Botun yanıt vereceği isminin ardından, botun adını giriyoruz. Cevap olarak botu yönetmek için bir token alıyoruz. Bu anahtarı kaydediyoruz, ileride işimize yarayacak.

Sonraki adım, Telegram sunucularına botun verilerini hangi sunucuya göndermesi gerektiğini bildirmektir. Bunun için şu şekilde bir bağlantı oluşturuyoruz:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____SCRIPT_YOLU___
___TOKEN___ bölümünü, daha önce aldığımız bot tokeni ile değiştiriyoruz.
____SCRIPT_YOLU___ bölümünü, verilerin işleneceği sunucudaki script adresi (örn. www.my_server.ru/webhook_telegram.php) ile değiştiriyoruz.
Burada bir sorun var, api.telegram.org sunucusu engellenmiş durumda, ancak şöyle yapabilirsiniz: en ucuz server kısıtlama olmayan bir sunucu kiralayarak ve bu sunucunun konsolundan
wget ___ALINAN_ADRES___ komutunu kullanarak.
Hepsi bu kadar, Telegram botu oluşturuldu ve sizinle bağlantılı. server.
Yandex.Alice için beceri oluşturma
Şimdi Yandex.Alice için bir beceri oluşturmaya geçelim.
Beceri oluşturmak için Yandex.Diyalog geliştirici sayfasına gitmemiz gerekiyor. Yandex.Diyalog geliştirici sayfası, orada 'Diyalog Oluştur' butonuna tıklayıp 'Alice'de Becerisi' seçeneğini seçiyoruz.

Beceri ayarları diyalogu açılacak.

Beceri ayarlarını girmeye başlıyoruz.
Becerinizin adını girin.

Aktivasyon adı çok dikkatle seçilmelidir, böylece Alice bunu doğru anlayabilir. Dikkat edilmesi gereken husus: Alice ile mobil uygulama ve Yandex.Station veya Irbis A gibi hoparlörler farklı kelimeleri algılayabilir.
Telegram için yaptığımız gibi, sunucumuzdaki scriptin yolunu giriyoruz, ancak bu özellikle Alice için olacak. Örnek: www.my_server.ru/webhook_alice.php.

Beceri konuşacak sesi seçiyoruz, ben Alice'nin sesini daha çok seviyorum.

Sadece mobil cihazlarda veya tarayıcıda çalışacaksa, 'Ekranlı cihaz gerekli' seçeneğini seçiyoruz.
İndi Alisa bacarıqları kataloqu üçün parametrləri daxil edirik. Əgər aktivləşdirmək üçün ‘brend’ sözünü istifadə etməyi plânlaşdırırsınızsa, brendin saytının webmaster.yandex.ru xidmətində təsdiqindən keçməlisiniz.

Parametrlərlə hər şey, skriptlərə keçirik.
Telegram botunun skripti
Telegram üçün skripti başlayaq.
Botdan və Alisadan gələn mesajları emal edəcəyimiz kitabxananı qoşuruq:
include_once 'webhook_parse.php';
Botumuzun tokenini təyin edirik:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Veriləri alırıq:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Veriləri dəyişənlərə ayırırıq:
if (!$request)
{
die();
// Bəzi Xəta çıxışı (tələb düzgün JSON deyil)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Bəzi Xəta çıxışı (tələb mesaj içermir)
}
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);
}
İndi dəyişənlərlə işləyə bilərik:
$tokens — burada istifadəçi tərəfindən daxil edilən bütün sözlər var
$user_id — burada istifadəçinin id-si var
$msg_chat_id — botun komanda aldığı çat
$msg_user_name — istifadəçi adı
İndi Parse_Tokens funksiyasını çağırırıq:
$Out_Str = Parse_Tokens($tokens);
Və cavabı göndəririk:
Send_Out($user_id, $Out_Str);
Send_Out funksiyası sadədir və belə görünü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);
}
Yandex.Alisa üçün bacarıq skripti
İndi Alisa üçün skripti keçdik, demək olar ki, Telegram üçün olanla eynidir.
Həmçinin botdan və Alisadan gələn mesajları emal edəcəyimiz kitabxananı, həmçinin Alisa üçün siniflərlə kitabxananı qoşuruq:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Veriləri alırıq:
$data = json_decode(trim(file_get_contents('php://input')), true);
Veriləri dəyişənlərə ayırırıq:
əgər (isset($data['request']))
{
//orijinal_üt dərzi
əgər (isset($data['meta']))
{
$data_meta = $data['meta'];
əgər (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
}
əgər (isset($data['request']))
{
$data_req = $data['request'];
əgər (isset($data_req['original_utterance']))
{
$original_utterance = $data_req['original_utterance'];
}
əgər (isset($data_req['command'])) {$data_msg = $data_req['command'];}
əgər (isset($data_req['nlu']))
{
$data_nlu = $data_req['nlu'];
əgər (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
// $data_token_count = count($data_tokens);
}
}
əgər (isset($data['session']))
{
$data_session = $data['session'];
əgər (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
əgər (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
əgər (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
əgər (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
əgər (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
}
}
Burada lazım olan dəyişənlər bir az daha azdır:
$tokens — burada istifadəçi tərəfindən daxil edilən bütün sözlər var
$user_id — burada istifadəçinin id-si var
Yandex yayımlanan bacarıqları daima pingleyir, və daha əvvəl mesajın tam işlənməsinin başlamadan çıxmaq üçün bir sətir əlavə etdim:
əgər (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Tokens-ləri işləmək üçün Parse_Tokens funksiyaını çağırırıq, o, Telegram üçün olanla eynidir:
$Out_Str = Parse_Tokens($tokens);
Və cavabı göndəririk:
Send_Out($user_id, $Out_Str);
Send_Out funksiyası burada daha mürəkkəbdir:
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;
əgər (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();
}
Alysa üçün skripti bitirdik.
Parse_Tokens-in işləmə skripti tamamilə nümunə olaraq hazırlanıb, burada istədiyiniz fərqli yoxlamalar və işləmə edə bilərsiniz.
function Parse_Tokens($tokens)
{
$out = "";
// tokens ilə nəsə edin //
$out = "Daxil etdiyiniz " . count($tokens) . " söz: " . implode($tokens, " ");
return $out;
}
Əgər istifadəçi ilə daha mürəkkəb bir ünsiyyət, məsələn, sual-cavabdan daha fərqli bir şey lazımdırsa, istifadəçinin $user_id-ni bazada (məsələn, mysql) saxlamaq və istifadəçidən alınan məlumatları saxlamaq və Parse_Tokens funksiyasında analiz etmək lazımdır.
Həqiqətən də bu demək olar ki, hər şeydir, hər şey düzgün edilsə, Telegram bot artıq əlçatandır, Alysa bacarığını sınaqdan keçirmək olar dialogs.yandex.ru/developer, yeni bacarığınıza keçərək test etmə sekmesine.

Əgər hər şey düzgün işləyirsə, bacarığı moderasiyaya göndərə bilərsiniz, "Moderasiya üçün" düyməsini basaraq.
İndi iki fərqli platforma üçün eyni şəkildə işləyən botlara sahib oldunuz.
Yandex.Dialoqları servisi üzrə sənəd burada
Tam skriptlər GitHub-da yerləşdirilib indirin.
Mənbə: habr.com
