PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

İ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.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

/yenibot'u seçin

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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, www.my_server.ru/webhook_telegram.php).

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. Yandex.Dialogues geliştiricileri sayfası, orada "Diyalog oluştur"a tıklayın ve "Alice'de Beceri"yi seçin.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

Beceri ayarları iletişim kutusu açılacaktır.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

Beceri ayarlarına girmeye başlıyoruz.

Yeteneğinizin adını girin.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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 www.my_server.ru/webhook_alice.php.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

Yeteneğin konuşacağı sesi seçiyoruz; Alice'in sesini daha çok seviyorum.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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 diyaloglar.yandex.ru/developer, yeni becerinizdeki test sekmesine gidin.

PHP'de ortak işlevselliğe sahip Yandex.Alice ve Telegram botu

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 burada

Komut dosyalarının tamamı github'da yayınlanmıştır indirmek.

Kaynak: habr.com

Yorum ekle