Telegram bot írása R-ben (1. rész): Bot létrehozása és használata üzenetek küldésére táviratban

A Telegram közönsége napról napra ugrásszerűen növekszik, ezt elősegíti a messenger kényelme, a csatornák, chatek jelenléte, és persze a botkészítés lehetősége.

A botok teljesen különböző célokra használhatók, az ügyfelekkel folytatott kommunikáció automatizálásától a saját feladatai kezeléséig.

Lényegében a távirat segítségével bármilyen műveletet végrehajthat a botokon keresztül: adatokat küldhet vagy kérhet, feladatokat futtathat a szerveren, információkat gyűjthet egy adatbázisba, e-maileket küldhet stb.

Cikksorozatot tervezek írni a velük való munkavégzésről telegram bot API, és írjon robotokat az igényeinek megfelelően.

Telegram bot írása R-ben (1. rész): Bot létrehozása és használata üzenetek küldésére táviratban

Ebben az első cikkben kitaláljuk, hogyan hozhatunk létre egy távirat-botot, és hogyan használhatjuk azt értesítések küldésére a táviratban.

Ennek eredményeként lesz egy robotunk, amely ellenőrzi a Windows Feladatütemezőben található összes feladat utolsó végrehajtásának állapotát, és értesítést küld, ha valamelyik meghiúsult.

De ennek a cikksorozatnak nem az a célja, hogy megtanítsa, hogyan kell botot írni egy meghatározott, szűk feladathoz, hanem hogy általánosságban megismertesse a csomag szintaxisával. telegram.bot, és kódpéldák, amelyekkel botokat írhatsz saját problémáid megoldására.

Tartalom

Ha érdekel az adatelemzés, akkor az én oldalam is érdekelheti távirat и youtube csatornák. A tartalom nagy része az R nyelvnek szól.

  1. Telegram bot létrehozása
  2. Csomag telepítése egy táviratbottal való munkához R-ben
  3. Üzenetek küldése R-ről a Telegramba
  4. Ütemezés beállítása a feladatvizsgálatok futtatásához
  5. Következtetés

Telegram bot létrehozása

Először is létre kell hoznunk egy botot. Ez egy speciális bot segítségével történik BotFather, menj link és írj a botnak /start.

Ezt követően üzenetet fog kapni a parancsok listájával:

BotFather üzenete

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual (https://core.telegram.org/bots).

You can control me by sending these commands:

/newbot - create a new bot
/mybots - edit your bots [beta]

Edit Bots
/setname - change a bot's name
/setdescription - change bot description
/setabouttext - change bot about info
/setuserpic - change bot profile photo
/setcommands - change the list of commands
/deletebot - delete a bot

Bot Settings
/token - generate authorization token
/revoke - revoke bot access token
/setinline - toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups - can your bot be added to groups?
/setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames - edit your games (https://core.telegram.org/bots/games) [beta]
/newgame - create a new game (https://core.telegram.org/bots/games)
/listgames - get a list of your games
/editgame - edit a game
/deletegame - delete an existing game

Új bot létrehozásához küldje el a parancsot /newbot.

A BotFather meg fogja kérni, hogy adja meg a robot nevét és bejelentkezési adatait.

BotFather, [25.07.20 09:39]
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Alexey Seleznev, [25.07.20 09:40]
My Test Bot

BotFather, [25.07.20 09:40]
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Bármilyen nevet megadhat, de a bejelentkezésnek ezzel kell végződnie bot.

Ha mindent helyesen csinált, a következő üzenetet fogja kapni:

Done! Congratulations on your new bot. You will find it at t.me/my_test_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Ezután a kapott API tokenre lesz szüksége, az én példámban ez van 123456789:abcdefghijklmnopqrstuvwxyz.

Ezzel a lépéssel befejeződik a bot létrehozásának előkészítő munkája.

Csomag telepítése egy táviratbottal való munkához R-ben

Feltételezem, hogy már telepítve van az R nyelv és az RStudio fejlesztői környezet. Ha nem ez a helyzet, akkor ezt megnézheti video bemutató hogyan kell telepíteni őket.

A Telegram Bot API-val való együttműködéshez az R csomagot használjuk távirat.bot.

A csomagok telepítése R-ben a függvény segítségével történik install.packages(), tehát a szükséges csomag telepítéséhez használja a parancsot install.packages("telegram.bot").

További információ a különböző csomagok telepítéséről innen ez a videó.

A csomag telepítése után csatlakoztatnia kell:

library(telegram.bot)

Üzenetek küldése R-ről a Telegramba

Az általad létrehozott bot a Telegramban megtalálható a létrehozáskor megadott bejelentkezési névvel, esetemben az @my_test_bot.

Bármilyen üzenetet küldhet a botnak, például "Hey bot". Jelenleg erre van szükségünk ahhoz, hogy megkapjuk a bottal folytatott csevegés azonosítóját.

Most a következő kódot írjuk R-be.

library(telegram.bot)

# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Запрашиваем информацию о боте
print(bot$getMe())

# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()

# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()

Kezdetben létrehozzuk a botunk példányát a funkcióval Bot(), a korábban kapott tokent argumentumként kell átadni bele.

Nem tekinthető bevált gyakorlatnak a tokent kódban tárolni, ezért tárolhatja azt egy környezeti változóban, és kiolvashatja belőle. Alapértelmezés szerint a csomagban telegram.bot A következő nevű környezeti változók támogatása megtörtént: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Ahelyett ИМЯ_ВАШЕГО_БОТА cserélje ki a létrehozáskor megadott nevet, esetemben ez egy változó lesz R_TELEGRAM_BOT_My Test Bot.

Környezeti változót többféleképpen is létrehozhatunk; elmondom a leguniverzálisabb és több platformot átívelő változót. Hozzon létre a saját könyvtárában (megtalálhatja a paranccsal path.expand("~")) nevű szövegfájlt .Renviron. Ezt a paranccsal is megteheti file.edit(path.expand(file.path("~", ".Renviron"))).

És add hozzá a következő sort.

R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА=123456789:abcdefghijklmnopqrstuvwxyz

Ezután használhatja a környezeti változóba mentett tokent a függvény segítségével bot_token(), azaz mint ez:

bot <- Bot(token = bot_token("My Test Bot"))

módszer getUpdates()lehetővé teszi számunkra, hogy bot frissítéseket kapjunk, pl. a neki küldött üzeneteket. Módszer from_chat_id(), lehetővé teszi annak a csevegésnek az azonosítóját, amelyből az üzenetet küldték. Erre az azonosítóra van szükségünk üzenetek küldéséhez a bottól.

A metódussal kapott objektum chat-azonosítója mellett getUpdates() egyéb hasznos információkat is kap. Például információ az üzenetet küldő felhasználóról.

updates[[1L]]$message$from

$id
[1] 000000000

$is_bot
[1] FALSE

$first_name
[1] "Alexey"

$last_name
[1] "Seleznev"

$username
[1] "AlexeySeleznev"

$language_code
[1] "ru"

Tehát ebben a szakaszban már megvan minden, ami ahhoz kell, hogy egy bottól üzenetet küldjünk a Telegramnak. Használjuk a módszert sendMessage(), amelybe át kell adnia a csevegési azonosítót, az üzenet szövegét és az üzenetszöveg jelölési típusát. A jelölés típusa lehet Markdown vagy HTML, és az argumentum határozza meg parse_mode.

# Отправка сообщения
bot$sendMessage(chat_id,
                text = "Привет, *жирный текст* _курсив_",
                parse_mode = "Markdown"
)

Markdown formázási alapok:

  • A félkövér betűtípust * jelzi:
    • például: *жирный шритф*
    • eredmény: félkövér betűtípus
  • A dőlt betűket aláhúzás jelzi:
    • például: _курсив_
    • eredmény: dőlt betűvel
  • A monospace betűtípust, amelyet általában a programkód kiemelésére használnak, aposztrófokkal adjuk meg - `:
    • példa: `monospace font`
    • eredmény: моноширинный шрифт

A HTML-jelölés formázásának alapjai:
A HTML-ben a kiemelendő szövegrészt címkékbe csomagolja, például <тег>текст</тег>.

  • <tag> - nyitó címke
  • - záró címke

HTML jelölőcímkék

  • <b> - félkövér betűtípus
    • például: <b>жирный шрифт</b>
    • eredmény félkövér betűtípus
  • <i> - dőlt
    • például: <i>курсив</i>
    • eredmény: dőlt betűvel
  • — моноширинный шрифт
    • példa: моноширинный шрифт
    • eredmény: моноширинный шрифт

A szövegen kívül más tartalmat is küldhet speciális módszerekkel:

# Отправить изображение
bot$sendPhoto(chat_id,
  photo = "https://telegram.org/img/t_logo.png"
)

# Отправка голосового сообщения
bot$sendAudio(chat_id,
  audio = "http://www.largesound.com/ashborytour/sound/brobob.mp3"
)

# Отправить документ
bot$sendDocument(chat_id,
  document = "https://github.com/ebeneditos/telegram.bot/raw/gh-pages/docs/telegram.bot.pdf"
)

# Отправить стикер
bot$sendSticker(chat_id,
  sticker = "https://www.gstatic.com/webp/gallery/1.webp"
)

# Отправить видео
bot$sendVideo(chat_id,
  video = "http://techslides.com/demos/sample-videos/small.mp4"
)

# Отправить gif анимацию
bot$sendAnimation(chat_id,
  animation = "https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif"
)

# Отправить локацию
bot$sendLocation(chat_id,
  latitude = 51.521727,
  longitude = -0.117255
)

# Имитация действия в чате
bot$sendChatAction(chat_id,
  action = "typing"
)

Azok. például a módszer segítségével sendPhoto() elküldheti a csomag segítségével készített grafikont, képként mentve ggplot2.

A Windows Feladatütemező ellenőrzése és értesítések küldése a rendellenesen befejeződött feladatokról

A Windows Task Scheduler használatához telepítenie kell a csomagot taskscheduleR, és az adatokkal való munka kényelme érdekében telepítse a csomagot dplyr.

# Установка пакетов
install.packages(c('taskscheduleR', 'dplyr'))
# Подключение пакетов
library(taskscheduleR)
library(dplyr)

Ezután a funkció használatával taskscheduler_ls() a feladatokról információt kérünk ütemezőnktől. A funkció használata filter() a csomagból dplyr Eltávolítjuk a feladatok listájából azokat, amelyek sikeresen befejeződtek, és az utolsó eredmény állapota 0, és azokat, amelyek még soha nem indultak el, és amelyek állapota 267011, a letiltott és a jelenleg futó feladatokat.

# запрашиваем список задач
task <- task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011") & 
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

Az objektumban task Most megvan a sikertelen feladatok listája, ezt a listát el kell küldenünk a Telegramnak.

Ha részletesebben megvizsgáljuk az egyes parancsokat, akkor:

  • filter() — szűri a feladatok listáját a fent leírt feltételek szerint
  • select() — csak egy mezőt hagy a táblázatban a feladatok nevével
  • unique() - eltávolítja a duplikált neveket
  • unlist() — vektorrá alakítja a kiválasztott táblázatoszlopot
  • paste0() — egy sorba köti a feladatok neveit, és soremelést tesz elválasztóként, pl. n.

Nincs más hátra, mint ezt az eredményt táviratban elküldeni.

bot$sendMessage(chat_id,
                text = task,
                parse_mode = "Markdown"
)

Tehát jelenleg a bot kódja így néz ki:

Feladat felülvizsgálati bot kódja

# Подключение пакета
library(telegram.bot)
library(taskscheduleR)
library(dplyr)

# инициализируем бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# идентификатор чата
chat_id <- 123456789

# запрашиваем список задач
task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011")  &
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

# если есть проблемные задачи отправляем сообщение
if ( task != "" ) {

  bot$sendMessage(chat_id,
                  text = task,
                  parse_mode = "Markdown"
  )

}

A fenti példa használatakor cserélje be a kódba a bot-tokenjét és a chatazonosítóját.

Feltételeket adhat hozzá a feladatok szűréséhez, például csak azokat a feladatokat ellenőrizheti, amelyeket Ön hozott létre, kivéve a rendszerfeladatokat.

Különféle beállításokat is elhelyezhet egy külön konfigurációs fájlba, és abban tárolhatja a csevegési azonosítót és a tokent. A konfigurációt például a csomag segítségével olvashatja el configr.

Példa ini config

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Példa változók beolvasására egy R-beli konfigurációból

library(configr)

# чтение конфина
config <- read.config('C:/путь_к_конфигу/config.cfg', rcmd.parse = TRUE)

bot_token <- config$telegram_bot$bot_token
chat_id     <- config$telegram_bot$chat_id

Ütemezés beállítása a feladatvizsgálatok futtatásához

A szkriptek ütemezett indításának beállításának folyamatát ebben részletesebben ismertetjük cikk. Itt csak az ehhez szükséges lépéseket írom le. Ha valamelyik lépés nem világos számodra, akkor olvasd el azt a cikket, amelyre hivatkozást adtam.

Tegyük fel, hogy elmentettük a bot kódunkat egy fájlba check_bot.R. A fájl rendszeres futtatásának ütemezéséhez kövesse az alábbi lépéseket:

  1. Írja be a Path rendszerváltozóba annak a mappának az elérési útját, amelybe az R telepítve van; Windowsban az elérési út a következő lesz: C:Program FilesRR-4.0.2bin.
  2. Hozzon létre egy futtatható bat fájlt egyetlen sorral R CMD BATCH C:rscriptscheck_botcheck_bot.R. Cserélje ki C:rscriptscheck_botcheck_bot.R az R fájl teljes elérési útjára.
  3. Ezután a Windows Feladatütemezővel állítsa be az indítási ütemezést, például félóránként.

Következtetés

Ebben a cikkben kitaláltuk, hogyan hozhatunk létre egy botot, és hogyan használhatjuk különféle értesítések küldésére táviratban.

Leírtam a Windows Task Scheduler figyelésének feladatát, de a cikk anyaga segítségével bármilyen értesítést küldhet, az időjárás-előrejelzéstől a tőzsdei jegyzésekig, mert Az R segítségével rengeteg adatforráshoz csatlakozhat.

A következő cikkben kitaláljuk, hogyan adhatunk hozzá parancsokat és billentyűzetet a bothoz, hogy ne csak értesítéseket küldhessenek, hanem bonyolultabb műveleteket is végrehajthassanak.

Forrás: will.com

Hozzászólás