สวัสดี
มีบทความมากมายเกี่ยวกับหัวข้อของบอท Telegram แต่มีเพียงไม่กี่คนที่เขียนเกี่ยวกับทักษะสำหรับอลิซ และฉันไม่พบข้อมูลใดๆ เกี่ยวกับวิธีสร้างบอทเลย ดังนั้นฉันจึงตัดสินใจแบ่งปันประสบการณ์ของฉันเกี่ยวกับวิธีสร้างบอท บอท Telegram อย่างง่ายและทักษะ Yandex.Alice สำหรับไซต์ที่มีฟังก์ชันการทำงานเหมือนกัน
ดังนั้นฉันจะไม่บอกวิธีเพิ่มเว็บเซิร์ฟเวอร์และรับใบรับรอง ssl มีการเขียนเกี่ยวกับเรื่องนี้มากพอแล้ว
การสร้างบอตโทรเลข
ก่อนอื่นมาสร้างบอท Telegram สำหรับสิ่งนี้เราไปที่ Telegram และค้นหาบอท BotFather ที่นั่น
เลือก /newbot
เราป้อนชื่อของบอทที่จะตอบสนองจากนั้นเราป้อนชื่อของบอทเพื่อตอบสนองเราได้รับโทเค็นเพื่อควบคุมบอทเราจดรหัสนี้ไว้ซึ่งจะเป็นประโยชน์สำหรับเราในอนาคต
ขั้นตอนต่อไปคือการบอกเซิร์ฟเวอร์ Telegram ว่าเซิร์ฟเวอร์ใดที่จะส่งข้อมูลจากบอทไป ในการทำเช่นนี้เราสร้างลิงค์ของแบบฟอร์ม:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ เราแทนที่ด้วยโทเค็นจากบอทที่ได้รับก่อนหน้านี้
____PATH_TO_SCRIPT____ เราแทนที่ด้วยที่อยู่ของสคริปต์บนเซิร์ฟเวอร์ของเราซึ่งข้อมูลจะถูกประมวลผล (ตัวอย่างเช่น
มีปัญหาที่นี่ เซิร์ฟเวอร์ api.telegram.org อยู่ภายใต้การปิดกั้น แต่คุณสามารถทำได้: เช่าเซิร์ฟเวอร์ที่ถูกที่สุดที่ไม่มีข้อ จำกัด และให้คำสั่งจากคอนโซลของเซิร์ฟเวอร์นี้
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
แค่นั้นแหละ บอท Telegram ถูกสร้างขึ้นและเชื่อมต่อกับเซิร์ฟเวอร์ของคุณ
สร้างทักษะสำหรับ Yandex.Alisa
เรามาสร้างทักษะสำหรับ Yandex.Alice กันเถอะ
ในการสร้างทักษะ คุณต้องไปที่หน้านักพัฒนา Yandex.Dialogues
กล่องโต้ตอบการตั้งค่าทักษะจะเปิดขึ้น
เราเริ่มเข้าสู่การตั้งค่าทักษะ
ใส่ชื่อทักษะของคุณ
ควรเลือกชื่อการเปิดใช้งานอย่างระมัดระวังเพื่อให้อลิซเข้าใจได้อย่างถูกต้องจากความแตกต่าง - แอปพลิเคชันมือถือที่มีอลิซและคอลัมน์เช่น Yandex.Station หรือ Irbis A สามารถรับรู้คำต่าง ๆ ได้
เราป้อนเส้นทางไปยังสคริปต์บนเซิร์ฟเวอร์ของเราในลักษณะเดียวกับ Telegram แต่จะเป็นสคริปต์เฉพาะสำหรับ Alice เช่น
เราเลือกเสียงที่สกิลจะพูด ฉันชอบเสียงของอลิซมากกว่า
หากคุณวางแผนที่จะทำงานบนอุปกรณ์พกพาหรือในเบราว์เซอร์เท่านั้น ให้เลือก "คุณต้องการอุปกรณ์ที่มีหน้าจอ"
จากนั้น ป้อนการตั้งค่าสำหรับแค็ตตาล็อกทักษะของอลิซ หากคุณวางแผนที่จะใช้คำว่า "แบรนด์" เพื่อเปิดใช้งาน คุณต้องยืนยันเว็บไซต์ของแบรนด์ในบริการ webmaster.yandex.ru
นั่นคือทั้งหมดที่มีการตั้งค่า ไปที่สคริปต์กันเถอะ
สคริปต์บอตโทรเลข
เริ่มจากสคริปต์สำหรับโทรเลขกันก่อน
เราเชื่อมต่อห้องสมุดที่ซึ่งข้อความจากบอทและอลิซจะได้รับการประมวลผล:
include_once 'webhook_parse.php';
เราตั้งค่าโทเค็นของบอทของเรา:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
เราได้รับข้อมูล:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
แยกวิเคราะห์ข้อมูลเป็นตัวแปร:
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);
}
ตอนนี้คุณสามารถทำงานกับตัวแปร:
$tokens - นี่คือคำทั้งหมดที่ผู้ใช้ป้อน
$user_id - รหัสผู้ใช้ที่นี่
$msg_chat_id - แชทที่บอทได้รับคำสั่ง
$msg_user_name - ชื่อผู้ใช้
ต่อไป เราเรียกใช้ฟังก์ชัน Parse_Tokens เพื่อประมวลผล:
$Out_Str = Parse_Tokens($tokens);
และส่งคำตอบ:
Send_Out($user_id, $Out_Str);
ฟังก์ชัน Send_Out นั้นเรียบง่ายและมีลักษณะดังนี้:
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
ทีนี้มาดูสคริปต์ของ Alice กัน มันเกือบจะเหมือนกับของ Telegram
นอกจากนี้ เรายังเชื่อมต่อไลบรารีซึ่งข้อความจากบอทและอลิซจะได้รับการประมวลผล รวมถึงไลบรารีที่มีคลาสสำหรับอลิซ:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
เราได้รับข้อมูล:
$data = json_decode(trim(file_get_contents('php://input')), true);
แยกวิเคราะห์ข้อมูลเป็นตัวแปร:
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'];}
}
}
มีตัวแปรไม่กี่ตัวที่นี่:
$tokens - นี่คือคำทั้งหมดที่ผู้ใช้ป้อน
$user_id - รหัสผู้ใช้ที่นี่
ยานเดกซ์ส่ง Ping ทักษะที่เผยแพร่อย่างต่อเนื่อง และฉันได้เพิ่มบรรทัดเพื่อออกจากสคริปต์ทันทีโดยไม่ต้องเริ่มประมวลผลข้อความทั้งหมด:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
เราเรียกใช้ฟังก์ชัน Parse_Tokens เพื่อประมวลผล ซึ่งจะเหมือนกับ Telegram:
$Out_Str = Parse_Tokens($tokens);
และส่งคำตอบ:
Send_Out($user_id, $Out_Str);
ฟังก์ชัน Send_Out มีความซับซ้อนมากขึ้นที่นี่:
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();
}
จบสคริปต์สำหรับอลิซ
สคริปต์ประมวลผล Parse_Tokens สร้างขึ้นเพื่อเป็นตัวอย่างเท่านั้น คุณสามารถตรวจสอบและประมวลผลที่นั่นได้
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
หากคุณต้องการสื่อสารกับผู้ใช้ในรูปแบบที่ซับซ้อนมากกว่าคำถาม-คำตอบ คุณจะต้องบันทึก $user_id ของผู้ใช้และข้อมูลที่ได้รับจากผู้ใช้ในฐานข้อมูล (เช่น mysql) และวิเคราะห์ข้อมูลเหล่านั้นใน ฟังก์ชัน Parse_Tokens
ที่จริงแล้วนี่คือเกือบทุกอย่างหากทุกอย่างถูกต้องแสดงว่ามีบอทโทรเลขอยู่แล้วสามารถตรวจสอบทักษะของอลิซได้
หากทุกอย่างทำงานได้ถูกต้อง คุณสามารถส่งทักษะเพื่อกลั่นกรองได้โดยคลิกปุ่ม "เพื่อกลั่นกรอง"
ตอนนี้คุณมีบอทสองตัวสำหรับแพลตฟอร์มต่างๆ ในคราวเดียว ซึ่งทำงานในลักษณะเดียวกัน
เอกสารสำหรับบริการ Yandex.Dialogues