Telegram bot írása R nyelven (1. rész): Bot létrehozása és üzenetek küldése a Telegramon keresztül

A Telegram közönsége naponta geometriai arányban növekszik, ami a messenger kényelmének, a csatornák és csoportok meglétének, valamint a botok létrehozásának lehetőségének köszönhető.

A botok teljesen különféle célokra használhatók, az ügyfelekkel való kommunikáció automatizálásától kezdve a saját feladataink kezeléséig.

Lényegében egy bot segítségével a Telegramon bármilyen műveletet végezhetünk: adatokat küldeni vagy kérni, feladatokat indítani a szerveren, információt gyűjteni egy adatbázisba, emaileket küldeni, és így tovább.

Egy sor cikket tervezek írni arról, hogyan lehet az R nyelven dolgozni a telegram bot API-val, és botokat írni a saját igényeinknek megfelelően.

Telegram bot írása R nyelven (1. rész): Bot létrehozása és üzenetek küldése a Telegramon keresztül

Ebben az első cikkben azt fogjuk megnézni, hogyan lehet létrehozni egy Telegram botot, és hogyan lehet rajta keresztül értesítéseket küldeni a Telegramra.

Ennek eredményeként egy botunk lesz, amely ellenőrzi a Windows Ütemezőben végrehajtott legutolsó feladatok állapotát, és értesítéseket küld, ha valamelyik hiba miatt leállt.

De ennek a cikksorozatnak a célja nem az, hogy megtanítson benneteket egy szűk feladatra írt bot elkészítésére, hanem hogy általánosan megismertessük a csomag szintaxisával telegram.bot, és a kódk példáival, amelyek segítségével botokat írhattok saját feladataitok megoldására.

Tartalom

Ha érdeklik az adatelemzés, talán érdekesek lesznek a telegram és youtube csatornák. A tartalom nagyobb része R nyelvvel foglalkozik.

  1. Telegram bot létrehozása
  2. Csomag telepítése a Telegram botal való munkához R-ben
  3. Üzenetek küldése R-ből Telegramra
  4. A feladatok ellenőrzésének indítási ütemezésének beállítása
  5. Zárás

Telegram bot létrehozása

Először is létre kell hoznunk egy botot. Ezt egy speciális bot segítésével tehetjük meg BotFather, menjünk a linkre kattintva -ra, és írjunk a botnak /start.

Ezt követően megkapja az utasítások listáját:

Üzenet a BotFather-től

Segíthetek létrehozni és kezelni a Telegram botokat. Ha új vagy a Bot API-val kapcsolatban, kérlek, nézd meg a kézikönyvet (https://core.telegram.org/bots).

Ezekkel a parancsokkal irányíthatsz engem:

/newbot - új bot létrehozása
/mybots - a botjaid szerkesztése [beta]

Botok szerkesztése
/setname - egy bot nevének megváltoztatása
/setdescription - bot leírásának megváltoztatása
/setabouttext - bot üzenet információ megváltoztatása
/setuserpic - bot profil fotójának megváltoztatása
/setcommands - a parancsok listájának megváltoztatása
/deletebot - egy bot törlése

Bot beállítások
/token - engedélyezési token generálása
/revoke - a bot hozzáférési tokenjének visszavonása
/setinline - inline mód bekapcsolása (https://core.telegram.org/bots/inline)
/setinlinegeo - inline helyzetkérések bekapcsolása (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - inline visszajelzés (https://core.telegram.org/bots/inline#collecting-feedback) beállításának megváltoztatása
/setjoingroups - hozzáadható-e a bot csoportokhoz?
/setprivacy - a magánélet módjának bekapcsolása (https://core.telegram.org/bots#privacy-mode) csoportokban

Játékok
/mygames - a játékok szerkesztése (https://core.telegram.org/bots/games) [beta]
/newgame - új játék létrehozása (https://core.telegram.org/bots/games)
/listgames - a játékaid listájának lekérése
/editgame - egy játék szerkesztése
/deletegame - egy meglévő játék törlése

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

A BotFather megkérdőjelez téged, hogy írd be a bot nevét és a felhasználónevet.

BotFather, [25.07.20 09:39]
Rendben, egy új bot. Hogyan fogjuk hívni? Kérlek, válassz egy nevet a botodnak.

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

BotFather, [25.07.20 09:40]
Jó. Most válasszunk egy felhasználónevet a botodnak. Ennek `bot`-ba kell végződnie. Például: TetrisBot vagy tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

A nevet szabadon megadhatod, de a felhasználónévnek be kell fejeződnie bot.

Ha mindent jól csináltál, akkor a következőt üzenetet fogod megkapni:

Kész! Gratulálok az új botodhoz. Itt találhatod: t.me/my_test_bot. Most már adhatsz neki leírást, tájékoztatót és profilképet, a parancsok listájához lásd a /help-t. Egyébként, ha befejezted a menő botod létrehozását, értesítsd a Bot Támogatást, ha jobb felhasználónevet szeretnél. Csak ügyelj arra, hogy a bot teljesen működőképes legyen, mielőtt ezt megteszed.

Ezzel a tokennel férhetsz hozzá a HTTP API-hoz:
123456789:abcdefghijklmnopqrstuvwxyz

A Bot API leírásának megtalálásához lásd ezt az oldalt: https://core.telegram.org/bots/api

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

Ezen a ponton a bot létrehozásának előkészületei befejeződtek.

Csomag telepítése a Telegram botal való munkához R-ben

Feltehetőleg már telepítve van R nyelv és az RStudio fejlesztői környezet. Ha nem, akkor megnézheted ezt a videó oktatót arról, hogyan lehet őket telepíteni.

A Telegram Bot API-hoz az R csomagot fogjuk használni telegram.bot.

A csomagok telepítése R-ben az install.packages(), ezért a szükséges csomag telepítéséhez használd a következő parancsot install.packages("telegram.bot").

A különböző csomagok telepítéséről részletesebben olvashatsz ebből a videóból.

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

library(telegram.bot)

Üzenetek küldése R-ből Telegramra

Az általad létrehozott botot a Telegramban megtalálhatod a létrehozásakor megadott felhasználónév alapján, az én példámban ez @my_test_bot.

Küldjön bármilyen üzenetet a botnak, például "Helló bot". Jelenleg erre szükségünk van ahhoz, hogy megszerezzük a chat azonosítóját a bottal.

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

library(telegram.bot)

# létrehozzuk a bot példányát
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Lekérdezzük a bot információit
print(bot$getMe())

# Megkapjuk a bot frissítéseit, azaz a neki elküldött üzenetek listáját
updates <- bot$getUpdates()

# Lekérdezzük a chat azonosítót
# Megjegyzés: a frissítések lekérése előtt üzenetet kell küldenie a botnak
chat_id <- updates[[1L]]$from_chat_id()

Kezdetben létrehozzuk a bot példányát a következő funkcióval Bot(), amelynek argumentumaként meg kell adnunk a korábban megszerzett tokent.

A tokent a kódban tárolni nem a legjobb gyakorlat, ezért tárolhatja környezeti változóban, és onnan olvashatja be. Alapértelmezés szerint a csomagban telegram.bot a következő nevű környezeti változók támogatása van megvalósítva: R_TELEGRAM_BOT_A_TE_BOT_NEVE. A helyére A_TE_BOT_NEVE írja be azt a nevet, amit a létrehozáskor megadott, az én esetemben ez a változó lesz R_TELEGRAM_BOT_My Test Bot.

Környezeti változót többféleképpen létrehozhat, itt a leguniverzálisabbat és multiplatformot ismertetem. Hozzon létre a személyes könyvtárában (ezt a parancs segítségével tudhatja meg path.expand("~")) egy szöveges fájlt, melynek neve .Renviron. Ezt a parancs segítségével is megteheti. file.edit(path.expand(file.path("~", ".Renviron"))).

És adja hozzá a következő sort a fájlhoz.

R_TELEGRAM_BOT_A_TE_BOT_NEVE=123456789:abcdefghijklmnopqrstuvwxyz

Ezután a környezeti változóban tárolt tokent a következő funkcióval használhatja bot_token(), azaz így:

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

Módszer getUpdates()lehetővé teszi számunkra, hogy megkapjuk a bot frissítéseit, azaz azokat az üzeneteket, amelyeket elküldtek neki. A from_chat_id()metódus lehetővé teszi számunkra, hogy megszerezzük a chat azonosítót, ahonnan az üzenet érkezett. Erre az azonosítóra szükségünk van a bot által küldött üzenetekhez.

A chat azonosító mellett a getUpdates() metódussal kapott objektumból

néhány más hasznos információt is megkapunk. Például azt az információt a felhasználóról, aki az üzenetet elküldte.

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 ezen a ponton már minden megvan, amire szükségünk van ahhoz, hogy üzenetet küldjünk a botból a Telegramon. Használjuk a metódust. sendMessage(), amelybe át kell adni a csoportazonosítót, az üzenet szövegét és az üzenet formázásának típusát. A formázás típusa lehet Markdown vagy HTML, amit az argumentum határoz meg. parse_mode.

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

A Markdown formázás alapjai:

  • A vastag betűt *-jel segítségével lehet kiemelni:
    • példa: *vastag betű*
    • eredmény: vastag betű
  • A dőlt betű aláhúzással adható meg:
    • példa: _dőlt_
    • eredmény: dőlt betű
  • A monospaced betűt, amelyet általában a programkód kiemelésére használnak, aposztrófok -- ` -el lehet megadni:
    • példa: `monospaced betű`
    • eredmény: monospaced betű

A HTML formázás alapjai:
HTML-ben a kiemelni kívánt szöveget tagek közé kell zárni, példa: szöveg.

  • — nyitó tag
  • — záró tag

HTML formázási tagek

  • <b> — vastag betű
    • példa: <b>félkövér betű</b>
    • az eredményt félkövér betű
  • — dőlt
    • példa: dőlt
    • eredmény: dőlt betű
  • — monospaced betű
    • példa: monospaced betű
    • eredmény: monospaced betű

A szöveg mellett más tartalom 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"
)

Tehát például a sendPhoto() metódussal elküldhető egy képként mentett grafikon, amelyet a ggplot2.

Windows feladatütemező ellenőrzése, és értesítés küldése a sikertelenül befejeződött feladatokról.

A Windows feladatütemezővel való munkához telepítenie kell a taskscheduleRcsomagot, és az adatok kényelmesebb kezeléséhez telepítjük a dplyr.

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

csomagot. Ezután a taskscheduler_ls() funkcióval kérjük le a feladataink adatait a feladatütemezőből. A filter() csomagból dplyr funkcióval eltávolítjuk a sikeresen végrehajtott feladatokat, amelyek utolsó eredménye 0, valamint azokat, amelyeket még sosem futtattak le, státuszuk 267011, a letiltott feladatok, és azokat a feladatokat, amelyek jelenleg is futnak.

# запрашиваем список задач
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 már egy listánk van a hibával befejeződött feladatokról, ezt a listát el kell küldenünk Telegramra.

Ha részletesebben megvizsgáljuk minden parancsot, akkor:

  • filter() — szűri a feladatlistát a fent leírt feltételek szerint
  • select() — csak egy mezőt hagy a feladatok táblázatában
  • unique() — eltávolítja az azonos neveket
  • unlist() — a kiválasztott oszlopot átalakítja vektorrá
  • paste0() — összefűzi a feladatneveket egyetlen szöveggé, és az elválasztójelet sortörésként adja meg, azaz. n.

Minden, amit tennünk kell, hogy ezt az eredményt elküldjük Telegramra.

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

Jelenleg a bot kódja így néz ki:

A feladatok ellenőrzésére szolgáló 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 helyettesítse a kódban a bot tokenjét és a chat azonosítóját.

Feladatfilterezési feltételeket is adhat hozzá, például ellenőrizheti csak azokat a feladatokat, amelyeket Ön hozott létre, kizárva a rendszerszintű feladatokat.

A különböző beállításokat külön konfigurációs fájlba is viheti, ahol tárolhatja a chat azonosítóját és a tokent. A konfigurációt például a következő csomaggal olvashatja: configr.

INI konfiguráció példa

[telegram_bot]
; a Telegram bot és a chat beállításai, ahová az értesítések érkeznek
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

A konfigurációból származó változók R-ben való olvasásának példája

library(configr)

# a konfiguráció olvasása
config <- read.config('C:/út_a_konfigurációhoz/config.cfg', rcmd.parse = TRUE)

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

A feladatellenőrzés ütemezésének beállítása

A szkriptek ütemezett indításának folyamata részletesen le van írva ebben a a Spotify döntéshozatali módszertanáról. Egyre több felhasználó preferálja a zenehallgatást mobilon a streaming szolgáltatásban, de a cégnél túlnyomórészt webprogramozók dolgoznak. A Spotify elemezte ezt a helyzetet, és úgy döntött, hogy több mobilfejlesztőt vesz fel, valamint átnevezi a webes szakembereket új irányba:cikkben. Itt csak azokat a lépéseket fogom ismertetni, amelyeket el kell végezni. Ha bármelyik lépés nem világos, kérjük, olvassa el a hivatkozott cikket.

Tegyük fel, hogy a bot kódját a fájlban tároltuk: check_bot.R. A fájl rendszeres indításának ütemezéséhez végezze el a következő lépéseket:

  1. Adja hozzá a PATH környezeti változóhoz azt a mappát, ahol az R telepítve van. Windows rendszeren a következő úton nagyjából így néz ki: C:Program FilesRR-4.0.2bin.
  2. Hozzon létre egy futtatható bat fájlt, amely csak egy sort tartalmaz: R CMD BATCH C:rscriptscheck_botcheck_bot.R. Cserélje C:rscriptscheck_botcheck_bot.R az R fájlja teljes útvonalához.
  3. Ezután a Windows Feladatütemező segítségével állítsa be az indítási ütemtervet, például félóránként.

Zárás

Ebben a cikkben megtudtuk, hogyan kell létrehozni egy botot, és hogyan küldhetünk különböző értesítéseket a Telegramon.

Leírtam a Windows feladatütemezőjének ellenőrzésével kapcsolatos feladatot, de az cikk anyaggát felhasználhatja bármely értesítés küldésére, legyen szó időjárás-előrejelzésről vagy tőzsdei árfolyamokról, mivel az R lehetővé teszi, hogy számos adatforráshoz kapcsolódjon.

A következő cikkben meg fogjuk vizsgálni, hogyan adhatunk parancsokat és billentyűzetet a botnak, hogy ne csupán értesítéseket küldhessen, hanem összetettebb műveleteket is végrehajthasson.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster