ProHoster > Blog > Amministrazione > Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot
Scrivite un telegramma bot in R (parte 2): Aghjunghjendu supportu di cumandamentu è filtri di missaghju à u bot
В pubblicazione precedente avemu capitu cumu creà un bot, inizializatu una istanza di a classe Bot è divintò pràticu cù i metudi di mandà missaghji cù lu.
In questu articulu cuntinuu stu tema, per quessa, ricumandemu di cumincià à leghje stu articulu solu dopu avè lettu a prima parte.
Sta volta avemu da capisce cumu per rinvivisce u nostru bot è aghjunghje un supportu di cumandamentu, è ancu cunnosce a classe. Updater.
Duranti u cursu di l'articulu, scriveremu parechji bots simplici, l'ultimi, basatu annantu à una data data è u codice di u paese, determinanu se un ghjornu in un paese determinatu hè un weekend o un ghjornu di travagliu secondu u calendariu di produzzione. Ma, cum'è prima, u scopu di l'articulu hè di familiarizàvi cù l'interfaccia di u pacchettu telegram.bot per risolve i vostri prublemi.
Tutti l'articuli di a serie "Scrivu un telegram bot in R"
Sè vo site interessatu in l'analisi di dati, pudete esse interessatu in u mo telegram и fratii canali. A maiò parte di u cuntenutu hè dedicatu à a lingua R.
Updater hè una classa chì face più faciule per voi per sviluppà un telegram bot, è usa a classa sottu u cappucciu Dispetcher. Assegnazione di classe Updater hè di riceve l'aghjurnamenti da u bot (in l'articulu precedente avemu usatu u metudu per questu scopu getUpdates()), è li trasfirìu più à Dispetcher.
A volta Dispetcher cuntene i gestori chì avete creatu, i.e. oggetti di classi Handler.
Handlers - maniscalchi
Cù handlers aghjunghje à Dispetcher reazioni di bot à diversi avvenimenti. A l'ora di scrive stu articulu in telegram.bot I seguenti tippi di gestori sò stati aghjuntu:
MessageHandler - Gestore di missaghji
CommandHandler - Gestore di cumandamenti
CallbackQueryHandler - Gestore di dati per i tastieri mandati da Inline
ErrorHandler - Gestore di errore quandu dumandate l'aghjurnamenti da u bot
Aghjunghjite u primu cumandamentu à u bot, gestore di cumanda
Se ùn avete mai utilizatu bots prima è ùn sapete micca ciò chì hè un cumandamentu, allora i cumandamenti à u bot anu da esse mandatu cù una barra in avanti. / cum'è un prefissu.
Avemu da principià cù cumandamenti simplici, i.e. insegnemu à u nostru bot à salutà u cumandamentu /hi.
Codice 1: Insegni à u bot à salutà
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()
Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).
Metu start_polling() класса Updater, chì hè utilizatu à a fine di u codice, principia un ciclu infinitu di dumandà è processà l'aghjurnamenti da u bot.
Avà apremu Telegram è scrivite u primu cumandamentu à u nostru bot /hi.
Avà u nostru bot capisce u cumandamentu /hi, è sapi salutà noi.
Schematically, u prucessu di custruisce un bot sèmplice pò esse rapprisintatu cum'è seguita.
Crea una istanza di a classe Updater;
Creemu metudi, i.e. funzioni chì u nostru bot farà. In l'esempiu di codice questu hè una funzione say_hello(). E funzioni chì avete aduprà cum'è metudi di bot deve avè dui argumenti necessarii - B bot и aghjurnamentu, è una facultativa - args. Argumentu B bot, Questu hè u vostru bot, cù u so aiutu pudete risponde à i missaghji, mandà missaghji, o aduprà qualsiasi altri metudi dispunibuli per u bot. Argumentu aghjurnamentu questu hè ciò chì u bot hà ricevutu da l'utilizatore, in fattu, ciò chì avemu ricevutu in u primu articulu cù u metudu getUpdates(). Argumentu args permette di processà e dati supplementari mandati da l'utilizatore cù u cumandimu, avemu da vultà à stu tema un pocu dopu;
Creemu handlers, i.e. Associemu alcune azzioni di l'utilizatori cù i metudi creati in u passu precedente. Essenzialmente, un gestore hè un trigger, un avvenimentu chì chjama una funzione di bot. In u nostru esempiu, un tali trigger hè di mandà un cumandamentu /hi, è hè implementatu da a squadra hi_hendler <- CommandHandler('hi', say_hello). Primu argumentu di funzione CommandHandler() permette di specificà un cumandamentu, in u nostru casu hi, à quale u bot risponda. U sicondu argumentu permette di specificà u metudu di u bot, chjameremu u metudu say_hello, chì serà eseguitu se l'utilizatore hà chjamatu u cumandamentu specificatu in u primu argumentu;
In seguitu, aghjunghjemu u gestore creatu à u dispatcher di a nostra istanza di classe Updater. Puderete aghjustà i manipulatori in parechje manere; in l'esempiu sopra, aghju utilizatu u più simplice, usendu u segnu +, à dì updater <- updater + hi_hendler. U listessu pò esse fattu cù u metudu add_handler(), chì appartene à a classe Dispatcher, pudete truvà stu metudu cusì: updater$dispatcher$add_handler();
Lanciari u bot cù u cumandimu start_polling().
Processore di missaghju di testu è filtri
Avemu capitu cumu mandà cumandamenti à u bot, ma qualchì volta avemu bisognu di u bot per risponde micca solu à i cumandamenti, ma ancu à qualchi missaghji di testu regulare. Per fà questu, avete bisognu di utilizà i gestori di messagi - MessageHandler.
strasurdinariu MessageHandler risponderà à assolutamente tutti i missaghji ricevuti. Dunque, i gestori di messagi sò spessu usati inseme cù filtri. Insegnemu à u bot à salutà micca solu à u cumandimu /hi, ma ancu ogni volta chì una di e seguenti parolle appare in u missaghju mandatu à u bot: salutu, salutu, salutu, hai, bonjour.
Per avà ùn scriveremu micca novi metudi, perchè ... Avemu digià un metudu per quale u bot ci saluta. Tuttu ciò chì avemu da fà hè di creà u filtru necessariu è u gestore di messagi.
Code 2: aghjunghje un gestore di missaghju di testu è filtru
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()
Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).
Avà pruvemu à mandà à u bot parechji missaghji chì cuntenenu e parolle di salutu listate prima:
Allora, prima di tuttu, avemu amparatu à u bot micca solu per salutà, ma per risponde à un salutu. Avemu fattu questu utilizendu l'argumentu risposta_à_message_id, chì hè dispunibule in u metudu sendMessage(), in quale avete bisognu di trasfiriri l'id di u messagiu à quale vulete risponde. Pudete ottene l'ID di u messagiu cusì: update$message$message_id.
Ma u principale chì avemu fattu era aghjunghje un filtru à u bot utilizendu a funzione BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)
Comu pudete avè nutatu, i filtri deve esse aghjuntu à l'ughjettu MessageFilters, chì inizialmente cuntene digià un picculu gruppu di filtri pronti. In u nostru esempiu, à l'ughjettu MessageFilters avemu aghjustatu un elementu hi, questu hè un novu filtru.
Per funziunà BaseFilter() avete bisognu di passà a funzione di filtru. Essenzialmente, un filtru hè solu una funzione chì riceve una istanza di missaghju è torna CALDO o In. In u nostru esempiu, avemu scrittu una funzione simplice chì, utilizendu a funzione basica grepl() verifica u testu di u messagiu è s'ellu currisponde à l'espressione regulare привет|здравствуй|салют|хай|бонжур torna CALDO.
Dopu avemu creatu un gestore di missaghju hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primu argumentu di funzione MessageHandler() hè u metudu chì chjamarà u gestore, è u sicondu argumentu hè u filtru da quale serà chjamatu. In u nostru casu, questu hè u filtru chì avemu creatu MessageFilters$hi.
Eppo, à a fine, aghjunghje à u dispatcher u handler creatu hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hnd
Comu aghju scrittu sopra, in u pacchettu telegram.bot è ughjettu MessageFilters Ci hè digià un set di filtri integrati chì pudete aduprà:
all - Tutti i missaghji
testu - missaghji testu
cumanda - Cumandamenti, i.e. missaghji chì principianu cù /
risposta - Missaghji chì sò una risposta à un altru missaghju
audio - Missaghji chì cuntenenu un schedariu audio
document - Missaghji cù un documentu mandatu
photo - Missaghji cù l'imaghjini mandati
sticker - Missaghji cù un sticker mandatu
video - Missaghji cù video
voce - missaghji voce
cuntattu - Missaghji chì cuntenenu u cuntenutu di u telegramma di l'utilizatore
locu - Missaghji cù geolocalizazione
locu - Missaghji inoltrati
ghjocu - ghjochi
Se vulete cumminà certi filtri in un gestore solu aduprà u segnu | - cum'è una logica OR, è signu & cum'è logicu И. Per esempiu, sè vo vulete chì u bot chjamà u stessu metudu quandu riceve un video, una maghjina o un documentu, utilizate l'esempiu seguente per creà un gestore di missaghju:
Sapemu digià ciò chì i cumandamenti sò, cumu si creanu è cumu furzà u bot per eseguisce u cumandamentu desideratu. Ma in certi casi, in più di u nome di cumandamentu, avemu bisognu di passà qualchi dati per eseguisce.
Quì sottu hè un esempiu di un bot chì, datu una data data è un paese, vi torna u tipu di ghjornu da u calendariu di produzzione.
U bot sottu usa l'API di u calendariu di produzzione isdayoff.ru.
Codice 3: Bot chì raporta per data è paese
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()
Eseguite l'esempiu di codice sopra, dopu avè rimpiazzatu "TU TOKEN BOT" cù u token reale chì avete ricevutu quandu crea u bot via BotPather (Aghju parlatu di creà un bot in primu articulu).
Avemu creatu un bot chì hà solu un metudu in u so arsenale check_date, Stu metudu hè chjamatu da u cumandamentu di u listessu nome.
Ma, in più di u nome di u cumandamentu, stu metudu deve esse inseritu dui parametri, u codice di u paese è a data. Dopu, u bot verifica se un ghjornu determinatu in u paese specificatu hè un weekend, un ghjornu scurciatu, o un ghjornu di travagliu secondu u calendariu ufficiale di produzzione.
Per u metudu chì creamu per accettà paràmetri supplementari cù u cumandamentu, utilizate l'argumentu pass_args = TRUE in funzione CommandHandler(), è quandu crea un metudu, in più di l'argumenti necessarii B bot, aghjurnamentu crea un opzionale - args. U metudu creatu in questu modu accettà i paràmetri chì passate à u bot dopu u nome di cumandamentu. I paràmetri devenu esse separati da un spaziu; seranu mandati à u metudu cum'è un vettore di testu.
Lanciamu è pruvà u nostru bot.
Eseguite u bot in u fondu
L'ultimu passu chì avemu bisognu di compie hè di lancià u bot in u fondu.
Per fà questu, seguite l'algoritmu descrittu quì sottu:
Salvà u codice bot in un schedariu cù l'estensione R. Quandu travaglia in RStudio, questu hè fattu per mezu di u menù File, squadra Salva Cum'è ....
Aghjunghjite u percorsu à u cartulare bin, chì à u turnu si trova in u cartulare in quale avete installatu a lingua R, à a variabile Path, instructions. ccà.
Crea un schedariu di testu regulare in quale scrive 1 linea: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Invece di C: UsersAlseyDocumentsmy_bot.R scrivite u percorsu à u vostru script bot. À u listessu tempu, hè impurtante chì ùn ci sò micca caratteri cirillichi o spazii in a strada, perchè chistu pò causari prublemi quandu eseguisce u bot. Salvà, è rimpiazzà a so estensione cù txt nantu Bat.
Apertura Windows Task Scheduler, ci sò parechje manere di fà questu, per esempiu, apre ogni cartulare è entre in l'indirizzu %windir%system32taskschd.msc /s. Altri metudi di lanciamentu ponu esse truvati ccà.
In u menù in cima à destra di u scheduler, cliccate "Crea attività ...".
Nant'à a tabulazione "Generale", dà à u vostru compitu un nome persunalizatu, è cambia u cambiamentu à u statu "Esegui per tutti l'utilizatori".
Andà à a tabulazione "Azzioni", cliccate "Crea". In u campu "Programma o script", cliccate "Browse", truvate quellu creatu in u sicondu passu Bat u schedariu è cliccate OK.
Cliccate OK è, se ne necessariu, inserite a password per u vostru contu di u sistema operatore.
Truvate u compitu creatu in u scheduler, selezziunate è cliccate nantu à u buttone "Run" in u cantonu in basso à destra.
U nostru bot corre in sfondate è hà da travaglià finu à chì ferma u compitu, o spegne u vostru PC o u servitore nantu à quale hè stata lanciata.
cunchiusioni
In questu articulu, avemu capitu cumu per scrive un bot full-fledged chì ùn pò micca solu mandà missaghji, ma ancu risponde à i missaghji è i cumandamenti. A cunniscenza acquistata hè digià abbastanza per risolve a maiò parte di i vostri prublemi.
U prossimu articulu parlerà di cumu aghjunghje un teclatu à u bot per un travagliu più còmode.