كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

В المنشور السابق اكتشفنا كيفية إنشاء روبوت، وقمنا بتهيئة مثيل للفئة Bot وتعرفت على طرق إرسال الرسائل باستخدامه.

أواصل في هذا المقال هذا الموضوع، لذا أنصح بالبدء بقراءة هذا المقال فقط بعد القراءة الجزء الأول.

هذه المرة سنتعرف على كيفية إحياء الروبوت الخاص بنا وإضافة دعم الأوامر إليه، وكذلك التعرف على الفصل الدراسي Updater.

خلال سير المقالة، سنكتب عدة روبوتات بسيطة، ستحدد الأخيرة، بناءً على تاريخ معين ورمز البلد، ما إذا كان اليوم في بلد معين هو عطلة نهاية أسبوع أو يوم عمل وفقًا لتقويم الإنتاج. ولكن، كما كان من قبل، فإن الغرض من هذه المقالة هو تعريفك بواجهة الحزمة telegram.bot لحل مشاكلك الخاصة.

كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

جميع المقالات من سلسلة "كتابة بوت برقية باللغة R"

  1. نقوم بإنشاء روبوت ونستخدمه لإرسال الرسائل في التليجرام
  2. أضف دعم الأوامر ومرشحات الرسائل إلى الروبوت

محتوى

إذا كنت مهتمًا بتحليل البيانات ، فقد تكون مهتمًا ببرنامجي تيليجرام и موقع YouTube القنوات. معظم محتوياته مخصص للغة R.

  1. فئة المحدث
  2. معالجون - معالجون
  3. أضف الأمر الأول إلى الروبوت، معالج الأوامر
  4. معالج الرسائل النصية ومرشحاتها
  5. إضافة أوامر مع المعلمات
  6. قم بتشغيل الروبوت في الخلفية
  7. اختتام

فئة المحدث

Updater هي فئة تسهل عليك تطوير روبوت برقية، وتستخدم الفئة تحت الغطاء Dispetcher. مهمة الفصل Updater هو تلقي التحديثات من البوت (في المقالة السابقة استخدمنا الطريقة لهذا الغرض getUpdates())، ونقلها إلى أبعد من ذلك Dispetcher.

بدوره Dispetcher يحتوي على المعالجات التي قمت بإنشائها، أي. كائنات الطبقة Handler.

معالجون - معالجون

مع المعالجات التي تضيفها إلى Dispetcher ردود فعل الروبوت على الأحداث المختلفة. في وقت كتابة هذا المقال في telegram.bot تمت إضافة الأنواع التالية من المعالجات:

  • -MessageHandler - معالج الرسائل
  • CommandHandler - معالج الأوامر
  • CallbackQueryHandler — معالج البيانات للوحات المفاتيح المرسلة من Inline
  • ErrorHandler — معالج الأخطاء عند طلب التحديثات من الروبوت

أضف الأمر الأول إلى الروبوت، معالج الأوامر

إذا لم تستخدم الروبوتات من قبل ولا تعرف ما هو الأمر، فيجب إرسال الأوامر إلى الروبوت باستخدام شرطة مائلة للأمام / كبادئة.

سنبدأ بأوامر بسيطة، أي. دعونا نعلم الروبوت الخاص بنا أن يقول مرحبًا عند الطلب /hi.

الكود 1: تعليم الروبوت إلقاء التحية

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

قم بتشغيل مثال الكود أعلاه، بعد استبدال "YOUR BOT TOKEN" بالرمز الحقيقي الذي تلقيته عند إنشاء الروبوت عبر الأب (تحدثت عن إنشاء روبوت في المادة الأولى).

طريقة start_polling() فئة Updater، والذي يتم استخدامه في نهاية الكود، يبدأ حلقة لا نهاية لها من طلب التحديثات ومعالجتها من الروبوت.

الآن لنفتح Telegram ونكتب الأمر الأول إلى الروبوت الخاص بنا /hi.

كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

الآن يفهم الروبوت الخاص بنا الأمر /hiويعرف كيف يرحب بنا.

من الناحية التخطيطية، يمكن تصوير عملية بناء مثل هذا الروبوت البسيط على النحو التالي.

كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

  1. إنشاء مثيل للفئة Updater;
  2. نحن نخلق الأساليب، أي. الوظائف التي سوف يؤديها الروبوت الخاص بنا. في مثال التعليمات البرمجية هذه هي وظيفة say_hello(). يجب أن تحتوي الوظائف التي ستستخدمها كطرق روبوت على وسيطتين مطلوبتين - بوت и تحديثوواحد اختياري - وسائط. دعوى بوت، هذا هو الروبوت الخاص بك، وبمساعدته يمكنك الرد على الرسائل أو إرسال الرسائل أو استخدام أي طرق أخرى متاحة للبوت. دعوى تحديث وهذا ما تلقاه البوت من المستخدم، في الواقع ما تلقيناه في المقالة الأولى باستخدام الطريقة getUpdates(). دعوى وسائط يسمح لك بمعالجة البيانات الإضافية التي يرسلها المستخدم مع الأمر، وسنعود إلى هذا الموضوع بعد قليل؛
  3. نقوم بإنشاء معالجات، أي. نقوم بربط بعض إجراءات المستخدم بالطرق التي تم إنشاؤها في الخطوة السابقة. في الأساس، المعالج هو مشغل، وهو حدث يستدعي بعض وظائف الروبوت. في مثالنا، مثل هذا المشغل هو إرسال أمر /hi، ويتم تنفيذها من قبل الفريق hi_hendler <- CommandHandler('hi', say_hello). وسيطة الوظيفة الأولى CommandHandler() يسمح لك بتحديد أمر، في حالتنا hi، والتي سوف يستجيب لها الروبوت. تسمح لك الوسيطة الثانية بتحديد طريقة الروبوت، وسوف نسميها say_hello، والذي سيتم تنفيذه إذا قام المستخدم باستدعاء الأمر المحدد في الوسيطة الأولى؛
  4. بعد ذلك، نضيف المعالج الذي تم إنشاؤه إلى مرسل مثيل فئتنا Updater. يمكنك إضافة معالجات بعدة طرق؛ في المثال أعلاه، استخدمت أبسطها، باستخدام الإشارة +أي updater <- updater + hi_hendler. ويمكن القيام بنفس الشيء باستخدام الطريقة add_handler()، الذي ينتمي إلى الفصل Dispatcher، يمكنك العثور على هذه الطريقة كالتالي: updater$dispatcher$add_handler();
  5. قم بتشغيل الروبوت باستخدام الأمر start_polling().

معالج الرسائل النصية ومرشحاتها

لقد اكتشفنا كيفية إرسال الأوامر إلى الروبوت، ولكن في بعض الأحيان نحتاج إلى أن يستجيب الروبوت ليس فقط للأوامر، ولكن أيضًا لبعض الرسائل النصية العادية. للقيام بذلك تحتاج إلى استخدام معالجات الرسائل - الرسالة.

عادي الرسالة سوف تستجيب لجميع الرسائل الواردة تماما. ولذلك، غالباً ما يتم استخدام معالجات الرسائل مع عوامل التصفية. دعونا نعلم الروبوت أن يقول مرحبًا ليس فقط عند الطلب /hi، ولكن أيضًا عندما تظهر إحدى الكلمات التالية في الرسالة المرسلة إلى الروبوت: مرحبًا، مرحبًا، تحية، هاي، صباح الخير.

في الوقت الحالي لن نكتب أي طرق جديدة، لأن... لدينا بالفعل طريقة يرحب بنا بها الروبوت. كل ما يتعين علينا القيام به هو إنشاء عامل التصفية ومعالج الرسائل المطلوبين.

الكود 2: إضافة معالج الرسائل النصية وتصفيتها

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text, 
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

قم بتشغيل مثال الكود أعلاه، بعد استبدال "YOUR BOT TOKEN" بالرمز الحقيقي الذي تلقيته عند إنشاء الروبوت عبر الأب (تحدثت عن إنشاء روبوت في المادة الأولى).

لنحاول الآن إرسال عدة رسائل للروبوت تحتوي على كلمات الترحيب المذكورة سابقًا:
كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

لذا، أولاً وقبل كل شيء، علمنا الروبوت ليس فقط أن يقول مرحبًا، ولكن أيضًا الرد على التحية. لقد فعلنا ذلك باستخدام الوسيطة Response_to_message_id، وهو موجود في الطريقة sendMessage()، والتي تحتاج إلى نقل معرف الرسالة التي تريد الرد عليها. يمكنك الحصول على معرف الرسالة مثل هذا: update$message$message_id.

لكن الشيء الرئيسي الذي فعلناه هو إضافة مرشح إلى الروبوت باستخدام الوظيفة BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

كما لاحظت، يجب إضافة المرشحات إلى الكائن مرشحات الرسائل، والتي تحتوي في البداية بالفعل على مجموعة صغيرة من المرشحات الجاهزة. في مثالنا، إلى الكائن مرشحات الرسائل أضفنا عنصرا hi، هذا مرشح جديد.

فى مهمة BaseFilter() تحتاج إلى تمرير وظيفة التصفية. في الأساس، المرشح هو مجرد وظيفة تستقبل نسخة الرسالة وترجعها الحقيقة أو خاطئة. في مثالنا، كتبنا دالة بسيطة باستخدام الوظيفة الأساسية grepl() يتحقق من نص الرسالة وما إذا كان يطابق التعبير العادي привет|здравствуй|салют|хай|бонжур عائدات الحقيقة.

بعد ذلك نقوم بإنشاء معالج الرسائل hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). وسيطة الوظيفة الأولى MessageHandler() هي الطريقة التي ستستدعي المعالج، والوسيطة الثانية هي المرشح الذي سيتم استدعاؤه من خلاله. في حالتنا، هذا هو الفلتر الذي أنشأناه MessageFilters$hi.

حسنًا، في النهاية، نضيف إلى المرسل المعالج الذي تم إنشاؤه hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

كما كتبت أعلاه، في الحزمة telegram.bot والكائن مرشحات الرسائل توجد بالفعل مجموعة من المرشحات المضمنة التي يمكنك استخدامها:

  • الكل - كل الرسائل
  • نص - رسائل نصية
  • أمر - أوامر، أي. الرسائل التي تبدأ ب /
  • الرد — الرسائل التي تكون بمثابة رد على رسالة أخرى
  • الصوت - الرسائل التي تحتوي على ملف صوتي
  • مستند - رسائل تحتوي على مستند مرسل
  • الصورة - الرسائل مع الصور المرسلة
  • الملصق - الرسائل التي تحتوي على ملصق مرسل
  • فيديو - رسائل تحتوي على فيديو
  • صوت - رسائل صوتية
  • جهة الاتصال - الرسائل التي تحتوي على محتوى برقية المستخدم
  • الموقع — رسائل مع تحديد الموقع الجغرافي
  • المكان - الرسائل المعاد توجيهها
  • لعبة - العاب

إذا كنت تريد دمج بعض المرشحات في معالج واحد فقط استخدم الإشارة | - باعتبارها منطقية OR، والتوقيع & منطقية И. على سبيل المثال، إذا كنت تريد أن يقوم الروبوت باستدعاء نفس الطريقة عندما يتلقى مقطع فيديو أو صورة أو مستند، فاستخدم المثال التالي لإنشاء معالج رسالة:

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

إضافة أوامر مع المعلمات

نحن نعرف بالفعل ما هي الأوامر، وكيفية إنشائها، وكيفية إجبار الروبوت على تنفيذ الأمر المطلوب. لكن في بعض الحالات، بالإضافة إلى اسم الأمر، نحتاج إلى تمرير بعض البيانات لتنفيذه.

يوجد أدناه مثال لروبوت يقوم، في ضوء تاريخ وبلد محددين، بإرجاع نوع اليوم من تقويم الإنتاج.

يستخدم الروبوت أدناه واجهة برمجة تطبيقات تقويم الإنتاج isdayoff.ru.

الكود 3: الروبوت الذي يقدم التقارير حسب التاريخ والبلد

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

قم بتشغيل مثال الكود أعلاه، بعد استبدال "YOUR BOT TOKEN" بالرمز الحقيقي الذي تلقيته عند إنشاء الروبوت عبر الأب (تحدثت عن إنشاء روبوت في المادة الأولى).

لقد أنشأنا روبوتًا يحتوي على طريقة واحدة فقط في ترسانته check_date، يتم استدعاء هذه الطريقة بواسطة الأمر الذي يحمل نفس الاسم.

ولكن، بالإضافة إلى اسم الأمر، تتطلب هذه الطريقة منك إدخال معلمتين، رمز البلد والتاريخ. بعد ذلك، يتحقق الروبوت مما إذا كان يوم معين في البلد المحدد هو عطلة نهاية الأسبوع، أو يوم قصير، أو يوم عمل وفقًا لتقويم الإنتاج الرسمي.

لكي تقبل الطريقة التي أنشأناها معلمات إضافية مع الأمر، استخدم الوسيطة pass_args = TRUE فى مهمة CommandHandler()، وعند إنشاء طريقة، بالإضافة إلى الوسائط المطلوبة بوت, تحديث إنشاء واحد اختياري - وسائط. ستقبل الطريقة التي تم إنشاؤها بهذه الطريقة المعلمات التي تمررها إلى الروبوت بعد اسم الأمر. يجب أن تكون المعلمات مفصولة بمسافة، وسيتم إرسالها إلى الطريقة كمتجه نص.

دعونا نطلق ونختبر الروبوت الخاص بنا.

كتابة روبوت برقية في R (الجزء 2): إضافة دعم الأوامر ومرشحات الرسائل إلى الروبوت

قم بتشغيل الروبوت في الخلفية

الخطوة الأخيرة التي يتعين علينا إكمالها هي تشغيل الروبوت في الخلفية.

للقيام بذلك، اتبع الخوارزمية الموضحة أدناه:

  1. احفظ رمز الروبوت في ملف بالملحق R. عند العمل في RStudio، يتم ذلك من خلال القائمة قم بتقديم، فريق حفظ باسم.
  2. أضف المسار إلى مجلد bin والذي بدوره موجود في المجلد الذي قمت بتثبيت لغة R فيه، إلى متغير المسار، التعليمات هنا.
  3. قم بإنشاء ملف نصي عادي اكتب فيه سطرًا واحدًا: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. بدلا من ج:UsersAlseyDocumentsmy_bot.R اكتب المسار إلى البرنامج النصي للبوت الخاص بك. وفي الوقت نفسه، من المهم عدم وجود أحرف أو مسافات سيريلية على طول الطريق، لأنه وهذا قد يسبب مشاكل عند تشغيل البوت. احفظه واستبدل امتداده بـ TXT في الخفافيش.
  4. افتح برنامج جدولة المهام في Windows، هناك طرق عديدة للقيام بذلك، على سبيل المثال، افتح أي مجلد وأدخل العنوان %windir%system32taskschd.msc /s. يمكن العثور على طرق إطلاق أخرى هنا.
  5. في القائمة العلوية اليمنى للمجدول، انقر فوق "إنشاء مهمة...".
  6. في علامة التبويب "عام"، قم بتسمية مهمتك باسم مخصص، ثم قم بتبديل المفتاح إلى حالة "التشغيل لجميع المستخدمين".
  7. انتقل إلى علامة التبويب "الإجراءات"، وانقر على "إنشاء". في حقل "البرنامج أو البرنامج النصي"، انقر فوق "تصفح"، وابحث عن البرنامج الذي تم إنشاؤه في الخطوة الثانية الخفافيش الملف وانقر فوق موافق.
  8. انقر فوق "موافق"، وإذا لزم الأمر، أدخل كلمة المرور لحساب نظام التشغيل الخاص بك.
  9. ابحث عن المهمة التي تم إنشاؤها في المجدول، وحددها وانقر فوق الزر "تشغيل" في الزاوية اليمنى السفلية.

يعمل الروبوت الخاص بنا في الخلفية وسيعمل حتى تقوم بإيقاف المهمة، أو إيقاف تشغيل جهاز الكمبيوتر أو الخادم الذي تم تشغيله عليه.

اختتام

في هذه المقالة، اكتشفنا كيفية كتابة روبوت كامل لا يمكنه إرسال الرسائل فحسب، بل يمكنه أيضًا الاستجابة للرسائل والأوامر الواردة. المعرفة المكتسبة كافية بالفعل لحل معظم مشاكلك.

ستتحدث المقالة التالية عن كيفية إضافة لوحة مفاتيح إلى الروبوت للقيام بعمل أكثر ملاءمة.

اشترك بقناتي تيليجرام и موقع YouTube القنوات.

المصدر: www.habr.com

إضافة تعليق