Een telegrambot schrijven in R (deel 1): Een bot maken en deze gebruiken om berichten in telegram te verzenden

Het Telegram-publiek groeit elke dag exponentieel, dit wordt mogelijk gemaakt door het gemak van de messenger, de aanwezigheid van kanalen, chats en natuurlijk de mogelijkheid om bots te maken.

Bots kunnen voor totaal verschillende doeleinden worden gebruikt, van het automatiseren van de communicatie met uw klanten tot het beheren van uw eigen taken.

In wezen kunt u Telegram gebruiken om alle bewerkingen via een bot uit te voeren: gegevens verzenden of opvragen, taken uitvoeren op de server, informatie verzamelen in een database, e-mails verzenden, enzovoort.

Ik ben van plan een serie artikelen te schrijven over hoe ik ermee kan werken Telegram-bot-APIen schrijf bots die aan uw behoeften voldoen.

Een telegrambot schrijven in R (deel 1): Een bot maken en deze gebruiken om berichten in telegram te verzenden

In dit eerste artikel zullen we uitzoeken hoe we een telegrambot kunnen maken en deze kunnen gebruiken om meldingen in telegram te verzenden.

Als gevolg hiervan zullen we een bot hebben die de status van de laatste uitvoering van alle taken in de Windows Taakplanner controleert en u meldingen stuurt als een van deze taken mislukt.

Maar het doel van deze serie artikelen is niet om u te leren hoe u een bot schrijft voor een specifieke, beperkte taak, maar om u in het algemeen kennis te laten maken met de syntaxis van het pakket. telegram.boten codevoorbeelden waarmee je bots kunt schrijven om je eigen problemen op te lossen.

Inhoud

Als u geΓ―nteresseerd bent in data-analyse, bent u wellicht geΓ―nteresseerd in mijn telegram ΠΈ youtube kanalen. Het grootste deel van de inhoud is gewijd aan de R-taal.

  1. Een telegrambot maken
  2. Een pakket installeren voor het werken met een telegrambot in R
  3. Berichten verzenden van R naar Telegram
  4. Een schema instellen voor het uitvoeren van taakscans
  5. Conclusie

Een telegrambot maken

Eerst moeten we een bot maken. Dit gebeurt met behulp van een speciale bot BotVader, ga naar link en schrijf naar de bot /start.

Hierna ontvangt u een bericht met een lijst met opdrachten:

Bericht van BotFather

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

Om een ​​nieuwe bot te maken, verzendt u de opdracht /newbot.

BotFather zal u vragen om de naam van de bot in te voeren en in te loggen.

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

U kunt elke naam invoeren, maar de login moet eindigen op bot.

Als je alles goed hebt gedaan, krijg je het volgende bericht:

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

Vervolgens heb je het ontvangen API-token nodig, in mijn voorbeeld is dat het geval 123456789:abcdefghijklmnopqrstuvwxyz.

Bij deze stap zijn de voorbereidende werkzaamheden voor het maken van de bot voltooid.

Een pakket installeren voor het werken met een telegrambot in R

Ik neem aan dat je de R-taal en de RStudio-ontwikkelomgeving al hebt geΓ―nstalleerd. Mocht dit niet het geval zijn, dan kun je hiernaar kijken hoe dan ook over hoe u ze kunt installeren.

Om met de Telegram Bot API te werken, zullen we het R-pakket gebruiken telegram.bot.

Het installeren van pakketten in R gebeurt met behulp van de functie install.packages(), dus gebruik de opdracht om het pakket te installeren dat we nodig hebben install.packages("telegram.bot").

U kunt meer leren over het installeren van verschillende pakketten op deze video.

Nadat u het pakket hebt geΓ―nstalleerd, moet u het aansluiten:

library(telegram.bot)

Berichten verzenden van R naar Telegram

De bot die je hebt gemaakt, kan in Telegram worden gevonden met de login die is opgegeven tijdens het maken, in mijn geval is dat zo @my_test_bot.

Stuur de bot een bericht, zoals 'Hey bot'. Op dit moment hebben we dit nodig om de ID van je chat met de bot te krijgen.

Nu schrijven we de volgende code in R.

library(telegram.bot)

# создаём экзСмпляр Π±ΠΎΡ‚Π°
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π±ΠΎΡ‚Π΅
print(bot$getMe())

# ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ обновлСния Π±ΠΎΡ‚Π°, Ρ‚.Π΅. список ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π΅ΠΌΡƒ сообщСний
updates <- bot$getUpdates()

# Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‡Π°Ρ‚Π°
# ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΠ΅Ρ€Π΅Π΄ запросом ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ сообщСниС
chat_id <- updates[[1L]]$from_chat_id()

In eerste instantie maken we een exemplaar van onze bot met de functie Bot(), moet het eerder ontvangen token als argument worden doorgegeven.

Het wordt niet als beste praktijk beschouwd om het token in code op te slaan, dus u kunt het in een omgevingsvariabele opslaan en daaruit lezen. Standaard in pakket telegram.bot Ondersteuning voor omgevingsvariabelen met de volgende namen is geΓ―mplementeerd: R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π. In plaats van ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π vervang de naam die u hebt opgegeven bij het maken, in mijn geval zal het een variabele zijn R_TELEGRAM_BOT_My Test Bot.

Er zijn verschillende manieren om een ​​omgevingsvariabele te maken; ik zal je vertellen over de meest universele en platformonafhankelijke variabele. Maak het aan in uw thuismap (u kunt het vinden met behulp van de opdracht path.expand("~")) tekstbestand met de naam .Reviron. U kunt dit ook doen met behulp van het commando file.edit(path.expand(file.path("~", ".Renviron"))).

En voeg er de volgende regel aan toe.

R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π=123456789:abcdefghijklmnopqrstuvwxyz

Vervolgens kunt u het token gebruiken dat is opgeslagen in de omgevingsvariabele met behulp van de functie bot_token(), d.w.z. soortgelijk:

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

werkwijze getUpdates()stelt ons in staat bot-updates te krijgen, d.w.z. berichten die naar hem zijn verzonden. Methode from_chat_id(), kunt u de ID opvragen van de chat waaruit het bericht is verzonden. We hebben dit ID nodig om berichten van de bot te verzenden.

Naast de chat-ID van het object dat door de methode is verkregen getUpdates() je ontvangt ook nog wat andere nuttige informatie. Bijvoorbeeld informatie over de gebruiker die het bericht heeft verzonden.

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"

In dit stadium hebben we dus al alles wat we nodig hebben om een ​​bericht van een bot naar Telegram te sturen. Laten we de methode gebruiken sendMessage(), waarin u de chat-ID, berichttekst en berichttekstopmaaktype moet doorgeven. Het opmaaktype kan Markdown of HTML zijn en wordt ingesteld door het argument parse_mode.

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния
bot$sendMessage(chat_id,
                text = "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, *ΠΆΠΈΡ€Π½Ρ‹ΠΉ тСкст* _курсив_",
                parse_mode = "Markdown"
)

Basisprincipes van markdown-opmaak:

  • Vetgedrukte letters worden gemarkeerd met *:
    • voorbeeld: *ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ‚Ρ„*
    • resultaat: dikgedrukt lettertype
  • Cursief wordt aangegeven met onderstrepingstekens:
    • voorbeeld: _курсив_
    • resultaat: cursief
  • Het monospace-lettertype, dat meestal wordt gebruikt om programmacode te markeren, wordt gespecificeerd met behulp van apostrofs - `:
    • voorbeeld: `monospace-lettertype`
    • resultaat: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Basisprincipes van het opmaken van HTML-opmaak:
In HTML plaats je bijvoorbeeld het deel van de tekst dat gemarkeerd moet worden in tags <Ρ‚Π΅Π³>тСкст</Ρ‚Π΅Π³>.

  • <tag> - openingstag
  • - sluitlabel

HTML-opmaaktags

  • <b> - dikgedrukt lettertype
    • voorbeeld: <b>ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚</b>
    • resultaat dikgedrukt lettertype
  • <i> - cursief
    • voorbeeld: <i>курсив</i>
    • resultaat: cursief
  • β€” ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • voorbeeld: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • resultaat: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Naast tekst kunt u ook andere inhoud verzenden via speciale methoden:

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
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"
)

Die. bijvoorbeeld met behulp van de methode sendPhoto() u kunt een grafiek verzenden die is opgeslagen als een afbeelding die u met het pakket hebt gemaakt ggplot2.

De Windows Taakplanner controleren en meldingen verzenden over taken die abnormaal zijn beΓ«indigd

Om met Windows Task Scheduler te kunnen werken, moet u het pakket installeren taskscheduleRen voor het gemak van het werken met gegevens installeert u het pakket dplyr.

# Установка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
install.packages(c('taskscheduleR', 'dplyr'))
# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
library(taskscheduleR)
library(dplyr)

Gebruik vervolgens de functie taskscheduler_ls() wij vragen informatie over taken op bij onze planner. De functie gebruiken filter() uit het pakket dplyr We verwijderen uit de lijst met taken de taken die met succes zijn voltooid en een laatste resultaatstatus van 0 hebben, en de taken die nog nooit zijn gelanceerd en de status 267011 hebben, de uitgeschakelde taken en de taken die momenteel worden uitgevoerd.

# Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ список Π·Π°Π΄Π°Ρ‡
task <- task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011") & 
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

In het voorwerp task We hebben nu een lijst met taken die zijn mislukt, we moeten deze lijst naar Telegram sturen.

Als we elke opdracht in meer detail bekijken, dan:

  • filter() β€” filtert de lijst met taken volgens de hierboven beschreven voorwaarden
  • select() β€” laat slechts één veld in de tabel achter met de naam van de taken
  • unique() - verwijdert dubbele namen
  • unlist() β€” converteert de geselecteerde tabelkolom naar een vector
  • paste0() β€” verbindt de namen van taken op één regel en plaatst een regelinvoer als scheidingsteken, d.w.z. n.

Het enige dat ons nog rest is dit resultaat per telegram te verzenden.

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

Dus op dit moment ziet de botcode er als volgt uit:

Botcode voor taakbeoordeling

# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°
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"
  )

}

Wanneer u het bovenstaande voorbeeld gebruikt, vervangt u uw bottoken en uw chat-ID door de code.

U kunt voorwaarden toevoegen voor het filteren van taken, door bijvoorbeeld alleen de taken te controleren die u hebt gemaakt, met uitzondering van systeemtaken.

Je kunt ook verschillende instellingen in een apart configuratiebestand zetten en daarin het chat-ID en token opslaan. U kunt de configuratie bijvoorbeeld lezen met behulp van het pakket configr.

Voorbeeld ini-config

[telegram_bot]
;настройки Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π±ΠΎΡ‚Π° ΠΈ Ρ‡Π°Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ увСдомлСния
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Een voorbeeld van het lezen van variabelen uit een configuratie in R

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

Een schema instellen voor het uitvoeren van taakscans

Het proces van het volgens schema opzetten van de lancering van scripts wordt hierin gedetailleerder beschreven ΡΡ‚Π°Ρ‚ΡŒΠ΅. Ik beschrijf hier alleen de stappen die hiervoor gevolgd moeten worden. Als een van de stappen u niet duidelijk is, raadpleeg dan het artikel waarnaar ik een link heb verstrekt.

Laten we aannemen dat we onze botcode in een bestand hebben opgeslagen check_bot.R. Volg deze stappen om te plannen dat dit bestand regelmatig wordt uitgevoerd:

  1. Schrijf het pad naar de map waarin R is geΓ―nstalleerd in de systeemvariabele Path; in Windows zal het pad er ongeveer zo uitzien: C:Program FilesRR-4.0.2bin.
  2. Maak een uitvoerbaar bat-bestand met slechts één regel R CMD BATCH C:rscriptscheck_botcheck_bot.R. Vervangen C:rscriptscheck_botcheck_bot.R naar het volledige pad naar uw R-bestand.
  3. Gebruik vervolgens Windows Task Scheduler om een ​​startschema in te stellen, bijvoorbeeld elk half uur.

Conclusie

In dit artikel hebben we ontdekt hoe we een bot kunnen maken en deze kunnen gebruiken om verschillende meldingen in Telegram te verzenden.

Ik heb de taak beschreven van het monitoren van de Windows Task Scheduler, maar je kunt het materiaal in dit artikel gebruiken om eventuele meldingen te verzenden, van de weersvoorspelling tot aandelenkoersen op de beurs, omdat Met R kunt u verbinding maken met een groot aantal gegevensbronnen.

In het volgende artikel zullen we uitzoeken hoe we opdrachten en een toetsenbord aan de bot kunnen toevoegen, zodat deze niet alleen meldingen kan verzenden, maar ook complexere acties kan uitvoeren.

Bron: www.habr.com

Voeg een reactie