Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Selamat petang.

Terdapat banyak artikel mengenai topik bot Telegram, tetapi beberapa orang menulis tentang kemahiran untuk Alice, dan saya tidak menemui sebarang maklumat tentang cara membuat satu bot, jadi saya memutuskan untuk berkongsi pengalaman saya tentang cara membuat bot Telegram mudah dan kemahiran Yandex.Alice untuk tapak yang mempunyai fungsi yang sama.

Jadi, saya tidak akan memberitahu anda bagaimana untuk meningkatkan pelayan web dan mendapatkan sijil ssl, cukup telah ditulis mengenainya.

Mencipta bot Telegram

Mula-mula, mari kita buat bot Telegram, untuk ini kita pergi ke Telegram dan cari bot BotFather di sana.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Pilih /newbot

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Kami memasukkan nama bot yang akan bertindak balas, kemudian kami memasukkan nama bot, sebagai tindak balas kami mendapat token untuk mengawal bot, kami menulis kunci ini, ia akan berguna kepada kami pada masa akan datang.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Langkah seterusnya ialah memberitahu pelayan Telegram pelayan mana untuk menghantar data daripada bot. Untuk melakukan ini, kami membuat pautan borang:

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

___TOKEN___ kami gantikan dengan token kami daripada bot, diterima lebih awal

____PATH_TO_SCRIPT____ kami gantikan dengan alamat skrip pada pelayan kami di mana data akan diproses (contohnya, www.my_server.ru/webhook_telegram.php).

Terdapat masalah di sini, pelayan api.telegram.org sedang disekat, tetapi anda boleh melakukan ini: sewa pelayan termurah di mana tiada sekatan dan berikan arahan dari konsol pelayan ini

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

Itu sahaja, bot Telegram dibuat dan disambungkan ke pelayan anda.

Mencipta kemahiran untuk Yandex.Alisa

Mari kita teruskan untuk mencipta kemahiran untuk Yandex.Alice.

Untuk mencipta kemahiran, anda perlu pergi ke halaman pembangun Yandex.Dialogues Halaman pembangun Yandex.Dialogs, klik di sana "Buat dialog" dan pilih "Kemahiran dalam Alice".

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Dialog tetapan kemahiran akan dibuka.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Kami mula memasuki tetapan kemahiran.

Masukkan nama kemahiran anda.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Nama pengaktifan harus dipilih dengan sangat berhati-hati supaya Alice memahaminya dengan betul, dari nuansa - aplikasi mudah alih dengan Alice dan lajur seperti Yandex.Station atau Irbis A boleh melihat perkataan secara berbeza.

Kami memasuki laluan ke skrip pada pelayan kami dengan cara yang sama seperti Telegram, tetapi ia akan menjadi skrip khusus untuk Alice, contohnya www.my_server.ru/webhook_alice.php.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Kami memilih suara yang akan digunakan oleh kemahiran itu, saya lebih suka suara Alice.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Jika anda merancang untuk bekerja hanya pada peranti mudah alih atau dalam penyemak imbas, kemudian pilih "Anda memerlukan peranti dengan skrin."

Seterusnya, masukkan tetapan untuk katalog kemahiran Alice. Jika anda bercadang untuk menggunakan perkataan "jenama" untuk pengaktifan, anda perlu mengesahkan tapak web jenama dalam perkhidmatan webmaster.yandex.ru.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Itu sahaja dengan tetapan, mari kita beralih kepada skrip.

Skrip bot Telegram

Mari mulakan dengan skrip untuk Telegram.

Kami menyambungkan perpustakaan tempat mesej daripada bot dan Alice akan diproses:

include_once 'webhook_parse.php';

Kami menetapkan token bot kami:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Kami menerima data:

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

Menghuraikan data kepada pembolehubah:

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

Kini anda boleh bekerja dengan pembolehubah:

$tokens - kini adalah semua perkataan yang dimasukkan oleh pengguna

$user_id - id pengguna di sini

$msg_chat_id - sembang di mana bot menerima arahan

$msg_user_name - nama pengguna

Seterusnya, kami memanggil fungsi Parse_Tokens untuk pemprosesan:

$Out_Str = Parse_Tokens($tokens);

Dan hantar jawapan:

Send_Out($user_id, $Out_Str);

fungsi Send_Out adalah mudah dan kelihatan 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 kemahiran untuk Yandex.Alisa

Sekarang mari kita beralih kepada skrip untuk Alice, ia hampir sama seperti untuk Telegram.

Kami juga menyambungkan perpustakaan tempat mesej daripada bot dan Alice akan diproses, serta perpustakaan 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);

Menghuraikan data kepada pembolehubah:

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

Terdapat beberapa pembolehubah yang lebih sedikit di sini:

$tokens - kini adalah semua perkataan yang dimasukkan oleh pengguna

$user_id - id pengguna di sini

Yandex sentiasa ping kemahiran yang diterbitkan, dan saya menambah baris untuk segera keluar dari skrip tanpa memulakan pemprosesan penuh mesej:

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

Kami memanggil fungsi Parse_Tokens untuk pemprosesan, ia adalah sama seperti untuk Telegram:

$Out_Str = Parse_Tokens($tokens);

Dan hantar jawapan:

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

Selesai skrip untuk Alice.

Skrip pemprosesan Parse_Tokens itu sendiri dibuat semata-mata sebagai contoh, anda boleh melakukan sebarang pemeriksaan dan pemprosesan 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 soalan-jawapan, maka anda perlu menyimpan $user_id pengguna dan data yang telah diterima daripada pengguna dalam pangkalan data (contohnya, mysql) dan menganalisis mereka dalam fungsi Parse_Tokens.

Sebenarnya ini hampir semuanya, jika semuanya dilakukan dengan betul, maka bot Telegram sudah tersedia, kemahiran Alice boleh disemak dialogs.yandex.ru/developerdengan pergi ke kemahiran baharu anda pada tab ujian.

Bot Yandex.Alisa dan Telegram dalam PHP dengan fungsi yang sama

Jika semuanya berfungsi dengan betul, anda boleh menghantar kemahiran untuk penyederhanaan dengan mengklik butang "Untuk penyederhanaan".

Kini anda mempunyai dua bot untuk platform berbeza sekaligus, yang berfungsi dengan cara yang sama.

Dokumentasi untuk perkhidmatan Yandex.Dialogues di sini

Skrip penuh disiarkan di github memuat turun.

Sumber: www.habr.com

Tambah komen