İyi günler.
Telegram botları konusunda pek çok makale var, ancak çok az kişi Alice'in becerileri hakkında yazıyor ve tek bir botun nasıl yapılacağına dair herhangi bir bilgi bulamadım, bu yüzden nasıl bir bot yapılacağına dair deneyimimi paylaşmaya karar verdim. basit Telegram botu ve site için aynı işlevselliğe sahip bir Yandex.Alice becerisi.
Bu yüzden size web sunucusu nasıl kurulur ve SSL sertifikası alınır anlatmayacağım, bu konuda yeterince şey yazıldı.
Telegram botu oluşturma
Öncelikle bir Telegram botu oluşturalım.Bunu yapmak için Telegram'a gidin ve orada BotFather botunu bulun.
/yenibot'u seçin
Yanıt vereceği botun adını giriyoruz, ardından botun adını giriyoruz, yanıt olarak botu kontrol etmek için bir jeton alıyoruz, bu anahtarı yazıyoruz, gelecekte bizim için faydalı olacaktır.
Bir sonraki adım Telegram sunucularına bottan veriyi hangi sunucuya göndereceğini söylemektir. Bunu yapmak için şöyle bir bağlantı oluşturuyoruz:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___, daha önce alınan bottan aldığımız jetonla değiştirildi
____PATH_TO_SCRPIT____, sunucumuzdaki verinin işleneceği betiğin adresi ile değiştirilir (örneğin,
Burada bir sorun var, api.telegram.org sunucusu bloke oldu ama şunu yapabilirsiniz: kısıtlamaların olmadığı en ucuz sunucuyu kiralayın ve bu sunucunun konsolundan komut verin.
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
İşte bu, Telegram botu oluşturuldu ve sunucunuza bağlandı.
Yandex.Alice için beceri oluşturma
Yandex.Alice için bir beceri oluşturmaya devam edelim.
Bir beceri oluşturmak için Yandex.Dialogs geliştiriciler sayfasına gitmeniz gerekir.
Beceri ayarları iletişim kutusu açılacaktır.
Beceri ayarlarına girmeye başlıyoruz.
Yeteneğinizin adını girin.
Aktivasyon adı, Alice'in nüanslardan doğru anlaması için çok dikkatli seçilmelidir - Alice'in olduğu bir mobil uygulama ve Yandex.Station veya Irbis A gibi hoparlörler, kelimeleri farklı algılayabilir.
Sunucumuzdaki betiğin yolunu Telegram'da olduğu gibi giriyoruz, ancak bu özellikle Alice için bir betik olacak, örneğin
Yeteneğin konuşacağı sesi seçiyoruz; Alice'in sesini daha çok seviyorum.
Yalnızca mobil cihazlarda veya tarayıcıda çalışmayı planlıyorsanız "Ekranlı bir cihaz gerektir" seçeneğini seçin.
Ardından Alice'in beceri kataloğunun ayarlarını girin. Etkinleştirme için "marka" kelimesini kullanmayı planlıyorsanız, webmaster.yandex.ru hizmetindeki markanın web sitesini doğrulamanız gerekir.
Ayarlar tamamlandıktan sonra komut dosyalarına geçelim.
Telegram bot scripti
Telegram için bir komut dosyasıyla başlayalım.
Bottan ve Alice'ten gelen mesajların işleneceği kütüphaneyi birbirine bağlıyoruz:
include_once 'webhook_parse.php';
Botumuzun jetonunu ayarlayın:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Veri alıyoruz:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Verileri değişkenlere ayrıştıralım:
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);
}
Artık değişkenlerle çalışabilirsiniz:
$tokens - şimdi kullanıcının girdiği tüm kelimeler burada
$user_id - işte kullanıcı kimliği
$msg_chat_id — botun komutu aldığı sohbet
$msg_user_name - kullanıcı adı
Daha sonra işlem için Parse_Tokens fonksiyonunu çağırıyoruz:
$Out_Str = Parse_Tokens($tokens);
Ve yanıtı gönderin:
Send_Out($user_id, $Out_Str);
Send_Out işlevi basittir ve şöyle 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.Alice için beceri komut dosyası
Şimdi Alice'in senaryosuna geçelim, Telegram'ınkiyle hemen hemen aynı.
Ayrıca bottan ve Alice'ten gelen mesajların işleneceği kütüphaneyi ve ayrıca Alice için sınıfların bulunduğu bir kütüphaneyi de bağlarız:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Veri alıyoruz:
$data = json_decode(trim(file_get_contents('php://input')), true);
Verileri değişkenlere ayrıştıralım:
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'];}
}
}
Burada biraz daha az gerekli değişken var:
$tokens - şimdi kullanıcının girdiği tüm kelimeler burada
$user_id - işte kullanıcı kimliği
Yandex sürekli olarak yayınlanan becerilere ping atıyor ve ben de tam mesaj işlemeye başlamadan komut dosyasından hemen çıkmak için bir satır ekledim:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
İşleme için Parse_Tokens işlevini çağırıyoruz, bu Telegram'dakiyle aynıdır:
$Out_Str = Parse_Tokens($tokens);
Ve yanıtı gönderin:
Send_Out($user_id, $Out_Str);
Send_Out işlevi burada daha karmaşıktır:
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();
}
Alice'in senaryosunu bitirdik.
Parse_Tokens işleme betiğinin kendisi örneğin tamamen yapılmıştır; orada her türlü kontrolü ve işlemi yapabilirsiniz.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Soru-cevaptan daha karmaşık türde bir kullanıcıyla iletişime ihtiyacınız varsa, o zaman kullanıcının $user_id'sini ve kullanıcıdan zaten alınmış olan verileri bir veritabanına (örneğin, mysql) kaydetmeniz ve bunları Parse_Tokens'ta analiz etmeniz gerekecektir. işlev.
Aslında neredeyse hepsi bu, eğer her şey doğru yapılırsa, o zaman Telegram botu zaten mevcut, Alice'in becerisi kontrol edilebilir
Her şey doğru çalışıyorsa, "Denetleme için" düğmesine tıklayarak beceriyi denetlemeye gönderebilirsiniz.
Artık farklı platformlar için aynı şekilde çalışan iki botunuz var.
Yandex.Dialogs hizmetine ilişkin belgeler
Komut dosyalarının tamamı github'da yayınlanmıştır
Kaynak: habr.com