В Bot
และคุ้นเคยกับวิธีการส่งข้อความโดยใช้วิธีดังกล่าว
ในบทความนี้ฉันจะดำเนินการต่อในหัวข้อนี้ ดังนั้นฉันแนะนำให้เริ่มอ่านบทความนี้หลังจากอ่านแล้วเท่านั้น
ครั้งนี้เราจะมาดูวิธีการฟื้นบอทของเราและเพิ่มการรองรับคำสั่ง รวมถึงทำความคุ้นเคยกับคลาสนี้ด้วย Updater
.
ในระหว่างบทความ เราจะเขียนบอทง่ายๆ หลายตัว โดยบอทหลังจะกำหนดว่าวันในประเทศที่กำหนดเป็นวันหยุดสุดสัปดาห์หรือวันทำการตามปฏิทินการผลิต โดยขึ้นอยู่กับวันที่และรหัสประเทศที่กำหนด แต่ก่อนหน้านี้จุดประสงค์ของบทความนี้คือเพื่อให้คุณคุ้นเคยกับอินเทอร์เฟซแพ็คเกจ telegram.bot
เพื่อแก้ไขปัญหาของคุณเอง
บทความทั้งหมดจากซีรีส์ “การเขียนบอทโทรเลขใน R”
Содержание
หากคุณสนใจในการวิเคราะห์ข้อมูล คุณอาจสนใจใน my
คลาสอัพเดต ตัวจัดการ - ตัวจัดการ เพิ่มคำสั่งแรกให้กับบอท ตัวจัดการคำสั่ง ตัวประมวลผลข้อความและตัวกรอง การเพิ่มคำสั่งพร้อมพารามิเตอร์ เรียกใช้บอทในเบื้องหลัง ข้อสรุป
คลาสอัพเดต
Updater
เป็นคลาสที่ช่วยให้คุณพัฒนาบอทโทรเลขได้ง่ายขึ้น และใช้คลาสภายใต้ประทุน Dispetcher
. การมอบหมายชั้นเรียน Updater
คือการได้รับอัพเดตจากบอท (ในบทความที่แล้วเราใช้วิธีนี้เพื่อการนี้) getUpdates()
) และโอนต่อไปที่ Dispetcher
.
ในทางกลับกัน Dispetcher
มีตัวจัดการที่คุณสร้างขึ้น เช่น วัตถุคลาส Handler
.
ตัวจัดการ - ตัวจัดการ
ด้วยตัวจัดการที่คุณเพิ่มเข้าไป Dispetcher
ปฏิกิริยาของบอทต่อเหตุการณ์ต่างๆ ในขณะที่เขียนบทความนี้ใน telegram.bot
มีการเพิ่มตัวจัดการประเภทต่อไปนี้:
- MessageHandler - ตัวจัดการข้อความ
- CommandHandler - ตัวจัดการคำสั่ง
- CallbackQueryHandler - ตัวจัดการข้อมูลสำหรับคีย์บอร์ดที่ส่งจากอินไลน์
- 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
.
ตอนนี้บอทของเราเข้าใจคำสั่งแล้ว /hi
และรู้จักทักทายเรา
แผนผังกระบวนการสร้างบอทแบบง่าย ๆ สามารถอธิบายได้ดังต่อไปนี้
- สร้างอินสแตนซ์ของชั้นเรียน
Updater
; - เราสร้างวิธีการเช่น ฟังก์ชั่นที่บอทของเราจะดำเนินการ ในตัวอย่างโค้ดนี่คือฟังก์ชัน
say_hello()
. ฟังก์ชั่นที่คุณจะใช้เป็นวิธีการของบอทจะต้องมีอาร์กิวเมนต์ที่จำเป็นสองข้อ - ปากกระบอกปืน и ปรับปรุงและทางเลือกหนึ่งรายการ - args. การโต้แย้ง ปากกระบอกปืนนี่คือบอทของคุณ ซึ่งคุณสามารถตอบกลับข้อความ ส่งข้อความ หรือใช้วิธีอื่นใดที่บอทสามารถใช้ได้ การโต้แย้ง ปรับปรุง นี่คือสิ่งที่บอทได้รับจากผู้ใช้ จริงๆ แล้วสิ่งที่เราได้รับในบทความแรกโดยใช้วิธีนี้getUpdates()
. การโต้แย้ง args ช่วยให้คุณประมวลผลข้อมูลเพิ่มเติมที่ผู้ใช้ส่งมาพร้อมกับคำสั่งเราจะกลับมาที่หัวข้อนี้ในภายหลัง - เราสร้างตัวจัดการเช่น เราเชื่อมโยงการดำเนินการบางอย่างของผู้ใช้กับวิธีการที่สร้างขึ้นในขั้นตอนก่อนหน้า โดยพื้นฐานแล้ว ตัวจัดการคือตัวกระตุ้น ซึ่งเป็นเหตุการณ์ที่เรียกใช้ฟังก์ชันบอทบางอย่าง ในตัวอย่างของเรา ทริกเกอร์ดังกล่าวกำลังส่งคำสั่ง
/hi
และดำเนินการโดยทีมงานhi_hendler <- CommandHandler('hi', say_hello)
. อาร์กิวเมนต์ฟังก์ชันแรกCommandHandler()
อนุญาตให้คุณระบุคำสั่งในกรณีของเราhi
ซึ่งบอทจะตอบสนอง อาร์กิวเมนต์ที่สองอนุญาตให้คุณระบุวิธีการของบอท เราจะเรียกวิธีการนั้นsay_hello
ซึ่งจะถูกดำเนินการหากผู้ใช้เรียกคำสั่งที่ระบุในอาร์กิวเมนต์แรก - ต่อไป เราจะเพิ่มตัวจัดการที่สร้างขึ้นให้กับโปรแกรมเลือกจ่ายงานของอินสแตนซ์คลาสของเรา
Updater
. คุณสามารถเพิ่มตัวจัดการได้หลายวิธี ในตัวอย่างข้างต้น ฉันใช้วิธีที่ง่ายที่สุดโดยใช้เครื่องหมาย+
เช่นupdater <- updater + hi_hendler
. เช่นเดียวกันสามารถทำได้โดยใช้วิธีการadd_handler()
ซึ่งเป็นของชั้นเรียนDispatcher
คุณสามารถค้นหาวิธีนี้ได้ดังนี้:updater$dispatcher$add_handler()
; - เปิดบอทโดยใช้คำสั่ง
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' ด้วยโทเค็นจริงที่คุณได้รับเมื่อสร้างบอทผ่าน บอทพ่อ (ฉันพูดถึงการสร้างบอทใน
บทความแรก ).
ตอนนี้เรามาลองส่งข้อความหลาย ๆ ข้อความกับบอทที่มีคำทักทายที่แสดงไว้ก่อนหน้านี้:
ก่อนอื่นเลย เราสอนบอทไม่เพียงแค่ทักทาย แต่ให้ตอบรับคำทักทายด้วย เราทำสิ่งนี้โดยใช้อาร์กิวเมนต์ ตอบกลับ_to_message_idซึ่งมีอยู่ในวิธีการนี้ sendMessage()
ซึ่งคุณต้องโอน ID ของข้อความที่คุณต้องการตอบกลับ คุณสามารถรับรหัสข้อความดังนี้: update$message$message_id
.
แต่สิ่งสำคัญที่เราทำคือเพิ่มตัวกรองให้กับบอทโดยใช้ฟังก์ชัน BaseFilter()
:
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)
ดังที่คุณอาจสังเกตเห็นแล้ว จำเป็นต้องเพิ่มตัวกรองให้กับออบเจ็กต์ ตัวกรองข้อความซึ่งในตอนแรกจะมีตัวกรองสำเร็จรูปชุดเล็กๆ อยู่แล้ว ในตัวอย่างของเราไปยังวัตถุ ตัวกรองข้อความ เราได้เพิ่มองค์ประกอบ hiนี่คือตัวกรองใหม่
ในฟังก์ชั่น BaseFilter()
คุณต้องผ่านฟังก์ชันตัวกรอง โดยพื้นฐานแล้ว ตัวกรองเป็นเพียงฟังก์ชันที่รับอินสแตนซ์ข้อความและส่งกลับ TRUE หรือ FALSE. ในตัวอย่างของเรา เราเขียนฟังก์ชันอย่างง่ายโดยใช้ฟังก์ชันพื้นฐาน grepl()
ตรวจสอบข้อความและดูว่าตรงกับนิพจน์ทั่วไปหรือไม่ привет|здравствуй|салют|хай|бонжур
ผลตอบแทน TRUE.
ต่อไปเราจะสร้างตัวจัดการข้อความ hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
. อาร์กิวเมนต์ฟังก์ชันแรก MessageHandler()
คือวิธีการที่จะเรียกตัวจัดการ และอาร์กิวเมนต์ที่สองคือตัวกรองที่จะใช้เรียกตัวจัดการ ในกรณีของเรา นี่คือตัวกรองที่เราสร้างขึ้น MessageFilters$hi
.
ในที่สุดเราก็เพิ่มตัวจัดการที่สร้างขึ้นให้กับโปรแกรมเลือกจ่ายงาน hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hnd
อย่างที่ฉันเขียนไว้ข้างต้นในแพ็คเกจ telegram.bot
และวัตถุ ตัวกรองข้อความ มีชุดตัวกรองในตัวที่คุณสามารถใช้ได้อยู่แล้ว:
- ทั้งหมด — ข้อความทั้งหมด
- ข้อความ — ข้อความ
- คำสั่ง — คำสั่งเช่น ข้อความที่ขึ้นต้นด้วย
/
- ตอบกลับ — ข้อความที่เป็นการตอบกลับข้อความอื่น
- เสียง — ข้อความที่มีไฟล์เสียง
- เอกสาร — ข้อความที่มีเอกสารที่ส่ง
- photo - ข้อความพร้อมรูปภาพที่ส่ง
- สติกเกอร์ — ข้อความพร้อมสติ๊กเกอร์ที่ส่งแล้ว
- วิดีโอ — ข้อความพร้อมวิดีโอ
- เสียง - ข้อความเสียง
- ติดต่อ — ข้อความที่มีเนื้อหาโทรเลขของผู้ใช้
- ตำแหน่ง — ข้อความที่มีตำแหน่งทางภูมิศาสตร์
- สถานที่ - ข้อความที่ส่งต่อ
- เกม - เกมส์
หากคุณต้องการรวมตัวกรองบางตัวไว้ในตัวจัดการตัวเดียว เพียงใช้เครื่องหมาย |
- เป็นตรรกะ หรือและลงนาม &
เป็นตรรกะ И. ตัวอย่างเช่น หากคุณต้องการให้บอทเรียกใช้วิธีการเดียวกันเมื่อได้รับวิดีโอ รูปภาพ หรือเอกสาร ให้ใช้ตัวอย่างต่อไปนี้เพื่อสร้างตัวจัดการข้อความ:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)
การเพิ่มคำสั่งพร้อมพารามิเตอร์
เรารู้อยู่แล้วว่าคำสั่งคืออะไร วิธีสร้างคำสั่ง และวิธีบังคับให้บอทดำเนินการคำสั่งที่ต้องการ แต่ในบางกรณี นอกเหนือจากชื่อคำสั่งแล้ว เราจำเป็นต้องส่งข้อมูลบางอย่างเพื่อดำเนินการด้วย
ด้านล่างนี้เป็นตัวอย่างของบอทที่ส่งคืนประเภทวันจากปฏิทินที่ใช้งานจริงตามวันที่และประเทศที่กำหนด
บอทด้านล่างใช้ API ปฏิทินที่ใช้งานจริง
รหัส 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()
และเมื่อสร้างวิธีการนอกเหนือจากอาร์กิวเมนต์ที่จำเป็น ปากกระบอกปืน, ปรับปรุง สร้างทางเลือกหนึ่ง - args. วิธีการที่สร้างขึ้นในลักษณะนี้จะยอมรับพารามิเตอร์ที่คุณส่งไปยังบอทหลังชื่อคำสั่ง พารามิเตอร์จะต้องคั่นด้วยช่องว่าง โดยจะถูกส่งไปยังเมธอดในรูปแบบเวกเตอร์ข้อความ
มาเปิดตัวและทดสอบบอทของเรากัน
เรียกใช้บอทในเบื้องหลัง
ขั้นตอนสุดท้ายที่เราต้องทำคือเปิดบอทในเบื้องหลัง
โดยทำตามอัลกอริทึมที่อธิบายไว้ด้านล่าง:
- บันทึกโค้ดบอทลงในไฟล์ที่มีนามสกุล R เมื่อทำงานใน RStudio ทำได้ผ่านเมนู เนื้อไม่มีมัน, ทีม บันทึกเป็น.
- เพิ่มเส้นทางไปยังโฟลเดอร์ bin ซึ่งจะอยู่ในโฟลเดอร์ที่คุณติดตั้งภาษา R ลงในตัวแปร Path คำแนะนำ
ที่นี่ . - สร้างไฟล์ข้อความปกติโดยเขียน 1 บรรทัด:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R
... แทน C:UsersAlseyDocumentsmy_bot.R เขียนเส้นทางไปยังสคริปต์บอทของคุณ ในขณะเดียวกัน สิ่งสำคัญคือต้องไม่มีอักขระซีริลลิกหรือช่องว่างระหว่างทางเพราะว่า นี่อาจทำให้เกิดปัญหาเมื่อใช้งานบอท บันทึกและแทนที่ส่วนขยายด้วย TXT บน ค้างคาว. - เปิด Windows Task Scheduler มีหลายวิธีในการทำเช่นนี้เช่นเปิดโฟลเดอร์ใดก็ได้แล้วป้อนที่อยู่
%windir%system32taskschd.msc /s
. สามารถดูวิธีการเปิดตัวอื่นๆ ได้ที่นี่ . - ในเมนูด้านขวาบนของตัวกำหนดเวลา คลิก "สร้างงาน..."
- บนแท็บ "ทั่วไป" ตั้งชื่อที่กำหนดเองให้กับงานของคุณ และสลับสวิตช์ไปที่สถานะ "เรียกใช้สำหรับผู้ใช้ทั้งหมด"
- ไปที่แท็บ "การกระทำ" คลิก "สร้าง" ในช่อง "โปรแกรมหรือสคริปต์" คลิก "เรียกดู" ค้นหารายการที่สร้างขึ้นในขั้นตอนที่สอง ค้างคาว ไฟล์แล้วคลิกตกลง
- คลิกตกลง และหากจำเป็น ให้ป้อนรหัสผ่านสำหรับบัญชีระบบปฏิบัติการของคุณ
- ค้นหางานที่สร้างขึ้นในตัวกำหนดตารางเวลา เลือกงานนั้นแล้วคลิกปุ่ม "เรียกใช้" ที่มุมขวาล่าง
บอทของเราทำงานในเบื้องหลังและจะทำงานจนกว่าคุณจะหยุดงานหรือปิดพีซีหรือเซิร์ฟเวอร์ที่เปิดใช้งาน
ข้อสรุป
ในบทความนี้ เราได้ค้นพบวิธีการเขียนบอทที่มีคุณสมบัติครบถ้วนซึ่งไม่เพียงแต่สามารถส่งข้อความเท่านั้น แต่ยังตอบสนองต่อข้อความและคำสั่งที่เข้ามาอีกด้วย ความรู้ที่ได้รับนั้นเพียงพอที่จะแก้ไขปัญหาส่วนใหญ่ของคุณแล้ว
บทความถัดไปจะพูดถึงวิธีเพิ่มคีย์บอร์ดให้กับบอทเพื่อการทำงานที่สะดวกยิ่งขึ้น
สมัครสมาชิกของฉัน
ที่มา: will.com