سلام عليكم.
هناك الكثير من المقالات حول موضوع روبوتات Telegram ، لكن القليل من الناس يكتبون عن مهارات Alice ، ولم أجد أي معلومات حول كيفية إنشاء روبوت واحد ، لذلك قررت مشاركة تجربتي حول كيفية إنشاء روبوت واحد. روبوت Telegram البسيط ومهارة Yandex.Alice للموقع الذي له نفس الوظيفة.
لذلك ، لن أخبرك عن كيفية رفع مستوى خادم الويب والحصول على شهادة SSL ، فقد كُتب عدد كافٍ عن ذلك.
إنشاء بوت Telegram
أولاً ، لنقم بإنشاء روبوت 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
سيتم فتح مربع حوار إعدادات المهارة.
نبدأ في إدخال إعدادات المهارة.
أدخل اسم مهارتك.
يجب اختيار اسم التنشيط بعناية شديدة حتى تفهمه أليس بشكل صحيح ، من الفروق الدقيقة - يمكن لتطبيق الهاتف المحمول الذي يحتوي على Alice وأعمدة مثل Yandex.Station أو Irbis A إدراك الكلمات بشكل مختلف.
نقوم بإدخال مسار البرنامج النصي على خادمنا بنفس طريقة Telegram ، ولكنه سيكون نصًا مخصصًا لـ Alice ، على سبيل المثال
نختار الصوت الذي ستتحدث به المهارة ، أحب صوت أليس أكثر.
إذا كنت تخطط للعمل فقط على الأجهزة المحمولة أو في متصفح ، فحدد "أنت بحاجة إلى جهاز بشاشة".
بعد ذلك ، أدخل إعدادات كتالوج مهارات Alice. إذا كنت تخطط لاستخدام كلمة "علامة تجارية" للتنشيط ، فأنت بحاجة إلى التحقق من موقع الويب الخاص بالعلامة التجارية في خدمة webmaster.yandex.ru.
هذا كل شيء مع الإعدادات ، دعنا ننتقل إلى البرامج النصية.
برنامج Telegram bot
لنبدأ ببرنامج نصي لـ Telegram.
نقوم بتوصيل المكتبة حيث ستتم معالجة الرسائل من الروبوت و Alice:
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);
}
الآن يمكنك العمل مع المتغيرات:
الرموز $ - إليك الآن جميع الكلمات التي أدخلها المستخدم
$ 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.
نقوم أيضًا بتوصيل المكتبة حيث ستتم معالجة الرسائل من الروبوت وأليس ، بالإضافة إلى مكتبة بها فصول لـ Alice:
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'];}
}
}
يوجد عدد قليل من المتغيرات هنا:
الرموز $ - إليك الآن جميع الكلمات التي أدخلها المستخدم
$ user_id - معرف المستخدم هنا
تقوم Yandex باستمرار باختبار المهارات المنشورة ، وقد أضفت سطرًا للخروج فورًا من البرنامج النصي دون البدء في المعالجة الكاملة للرسالة:
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.
في الواقع ، هذا هو كل شيء تقريبًا ، إذا تم كل شيء بشكل صحيح ، فسيكون برنامج Telegram bot متاحًا بالفعل ، ويمكن التحقق من مهارة Alice
إذا كان كل شيء يعمل بشكل صحيح ، يمكنك إرسال المهارة للاعتدال بالنقر فوق الزر "للإشراف".
الآن لديك روبوتان لمنصات مختلفة في وقت واحد ، والتي تعمل بنفس الطريقة.
التوثيق لخدمة Yandex.Dialogues
نصوص كاملة منشورة على جيثب
المصدر: www.habr.com