Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Selamat siang.

Ada banyak artikel tentang topik bot Telegram, tetapi hanya sedikit orang yang menulis tentang keterampilan untuk Alice, dan saya tidak menemukan informasi apa pun tentang cara membuat bot tunggal, jadi saya memutuskan untuk membagikan pengalaman saya tentang cara membuat bot. bot Telegram sederhana dan keterampilan Yandex.Alice untuk situs yang memiliki fungsi yang sama.

Jadi, saya tidak akan memberi tahu Anda cara meningkatkan server web dan mendapatkan sertifikat ssl, cukup banyak yang telah ditulis tentangnya.

Membuat bot Telegram

Pertama, mari buat bot Telegram, untuk ini kita pergi ke Telegram dan temukan bot BotFather di sana.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Pilih /newbot

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Kami memasukkan nama bot yang akan ditanggapi, lalu kami memasukkan nama bot, sebagai tanggapan kami mendapat token untuk mengontrol bot, kami menuliskan kunci ini, ini akan berguna bagi kami di masa mendatang.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Langkah selanjutnya adalah memberi tahu server Telegram ke server mana untuk mengirim data dari bot. Untuk melakukan ini, kami membuat tautan formulir:

https: //api.telegram.org/bot___Π’ΠžΠšΠ•Π___/setWebhook?url=https://____ПУВЬ_Π”Πž_БКРПИВА___

___TOKEN___ kami ganti dengan token kami dari bot, yang diterima sebelumnya

____PATH_TO_SCRIPT____ kita ganti dengan alamat script di server kita dimana data akan diproses (misal, www.my_server.ru/webhook_telegram.php).

Ada masalah di sini, server api.telegram.org sedang diblokir, tetapi Anda dapat melakukan ini: sewa server termurah di mana tidak ada batasan dan berikan perintah dari konsol server ini

wget ___ΠŸΠžΠ›Π£Π§Π˜Π’Π¨Π˜Π™Π‘Π―_АДРЕБ___

Itu saja, bot Telegram dibuat dan terhubung ke server Anda.

Membuat keterampilan untuk Yandex.Alisa

Mari beralih ke pembuatan keterampilan untuk Yandex.Alice.

Untuk membuat keterampilan, Anda harus membuka halaman pengembang Yandex.Dialogues Halaman pengembang Yandex.Dialogs, klik di sana "Buat dialog" dan pilih "Skill in Alice".

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Dialog pengaturan keterampilan akan terbuka.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Kami mulai memasuki pengaturan keterampilan.

Masukkan nama keahlian Anda.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Nama aktivasi harus dipilih dengan sangat hati-hati agar Alice memahaminya dengan benar, dari nuansa - aplikasi seluler dengan Alice dan kolom seperti Yandex.Station atau Irbis A dapat memahami kata secara berbeda.

Kami memasukkan jalur ke skrip di server kami dengan cara yang sama seperti untuk Telegram, tetapi itu akan menjadi skrip khusus untuk Alice, misalnya www.my_server.ru/webhook_alice.php.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Kami memilih suara yang akan digunakan oleh skill untuk berbicara, saya lebih menyukai suara Alice.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Jika Anda berencana untuk bekerja hanya di perangkat seluler atau di browser, pilih "Anda memerlukan perangkat dengan layar".

Selanjutnya, masuk ke pengaturan untuk katalog keterampilan Alice. Jika Anda berencana menggunakan kata "merek" untuk aktivasi, Anda perlu memverifikasi situs web merek di layanan webmaster.yandex.ru.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Itu saja dengan pengaturannya, mari beralih ke skrip.

Skrip bot telegram

Mari kita mulai dengan skrip untuk Telegram.

Kami menghubungkan perpustakaan tempat pesan dari bot dan Alice akan diproses:

include_once 'webhook_parse.php';

Kami mengatur token bot kami:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Kami menerima data:

$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);

Mem-parsing data menjadi variabel:

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);
}

Sekarang Anda dapat bekerja dengan variabel:

$token - ini semua kata yang dimasukkan pengguna

$user_id - id pengguna di sini

$msg_chat_id - obrolan tempat bot menerima perintah

$msg_user_name - nama pengguna

Selanjutnya, kami memanggil fungsi Parse_Tokens untuk diproses:

$Out_Str = Parse_Tokens($tokens);

Dan kirim tanggapan:

Send_Out($user_id, $Out_Str);

fungsi Send_Out sederhana dan terlihat seperti ini:

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);
}

Skrip keterampilan untuk Yandex.Alisa

Sekarang mari beralih ke skrip untuk Alice, hampir sama dengan Telegram.

Kami juga menghubungkan pustaka tempat pesan dari bot dan Alice akan diproses, ditambah pustaka dengan kelas untuk Alice:

include_once 'classes_alice.php';
include_once 'webhook_parse.php';

Kami menerima data:

$data = json_decode(trim(file_get_contents('php://input')), true);

Mem-parsing data menjadi variabel:

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'];}
  }
}

Ada beberapa variabel yang lebih sedikit di sini:

$token - ini semua kata yang dimasukkan pengguna

$user_id - id pengguna di sini

Yandex terus-menerus mem-ping keterampilan yang diterbitkan, dan saya menambahkan baris untuk segera keluar dari skrip tanpa memulai pemrosesan penuh pesan:

  if (strpos($tokens[0], "ping") > -1)     {Send_Out("pong", "", true);}

Kami memanggil fungsi Parse_Tokens untuk diproses, sama seperti untuk Telegram:

$Out_Str = Parse_Tokens($tokens);

Dan kirim tanggapan:

Send_Out($user_id, $Out_Str);

Fungsi Send_Out lebih rumit di sini:

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();
}

Menyelesaikan naskah untuk Alice.

Skrip pemrosesan Parse_Tokens sendiri dibuat murni sebagai contoh, Anda dapat melakukan pemeriksaan dan pemrosesan apa pun di sana.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
  return $out;
}

Jika Anda perlu berkomunikasi dengan pengguna dalam bentuk yang lebih kompleks daripada pertanyaan-jawaban, maka Anda perlu menyimpan $user_id pengguna dan data yang sudah diterima dari pengguna di database (misalnya, mysql) dan menganalisisnya di fungsi Parse_Tokens.

Sebenarnya ini hampir semuanya, jika semuanya dilakukan dengan benar, maka bot Telegram sudah tersedia, skill Alice bisa dicek dialogs.yandex.ru/developerdengan membuka keahlian baru Anda di tab pengujian.

Yandex.Alisa dan bot Telegram di PHP dengan fungsi yang sama

Jika semuanya berfungsi dengan benar, Anda dapat mengirim skill untuk moderasi dengan mengklik tombol "Untuk moderasi".

Sekarang Anda memiliki dua bot untuk platform berbeda sekaligus, yang bekerja dengan cara yang sama.

Dokumentasi untuk layanan Yandex.Dialogues di sini

Skrip lengkap diposting di github mendownload.

Sumber: www.habr.com

Tambah komentar