We schrijven een Telegram-bot in de programmeertaal R (deel 1): We maken een bot en sturen met behulp daarvan berichten naar Telegram.

Het publiek van Telegram groeit dagelijks met een geometrische progressie, wat te danken is aan het gebruiksgemak van de messenger, de aanwezigheid van kanalen, chats en natuurlijk de mogelijkheid om bots te creëren.

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

In wezen kunt u via een bot in Telegram verschillende handelingen uitvoeren: gegevens verzenden of opvragen, taken op de server starten, informatie in een database verzamelen, e-mails versturen, enzovoort.

Ik ben van plan een reeks artikelen te schrijven over hoe je met telegram bot API, bots kunt schrijven voor uw eigen behoeften.

We schrijven een Telegram-bot in de programmeertaal R (deel 1): We maken een bot en sturen met behulp daarvan berichten naar Telegram.

In dit eerste artikel zullen we bekijken hoe we een Telegram-bot kunnen maken en via deze bot meldingen naar Telegram kunnen sturen.

Hierdoor krijgen we een bot die de status van de laatste uitvoering van alle taken in de Windows Taakplanner controleert en u meldingen stuurt als sommige taken met een fout zijn afgelopen.

Maar het doel van deze reeks artikelen is niet om u te leren een bot voor een specifieke, smalle taak te schrijven, maar om u in het algemeen kennis te laten maken met de syntaxis van het pakket telegram.bot, en codevoorbeelden waarmee u bots kunt schrijven om uw eigen taken op te lossen.

Inhoud

Als u geïnteresseerd bent in data-analyse, is het mogelijk dat mijn telegram en youtube kanalen interessant voor u zijn. Het grootste deel van de inhoud is gewijd aan de taal R.

  1. Het creëren van een Telegram-bot
  2. Installeren van het pakket voor het werken met Telegram-bots in R
  3. Berichten verzenden van R naar Telegram
  4. Instellen van de planning voor het controleren van taken
  5. Conclusie

Het creëren van een Telegram-bot

Om te beginnen moeten we een bot maken. Dit gebeurt via een speciale bot BotFather, ga naar de link en schrijf naar de bot /start.

U zult vervolgens een bericht ontvangen met een lijst van opdrachten:

Bericht van BotFather

Ik kan je helpen bij het creëren en beheren van Telegram-bots. Als je nieuw bent met de Bot API, zie dan de handleiding (https://core.telegram.org/bots).

Je kunt me bedienen door deze opdrachten te sturen:

/newbot - maak een nieuwe bot aan
/mybots - bewerk je bots [beta]

Bewerk Bots
/setname - verander de naam van een bot
/setdescription - verander de beschrijving van de bot
/setabouttext - verander de info over de bot
/setuserpic - verander de profielfoto van de bot
/setcommands - verander de lijst met opdrachten
/deletebot - verwijder een bot

Botinstellingen
/token - genereer een autorisatietoken
/revoke - reviseer het toegangstoken van de bot
/setinline - schakel de inline modus in (https://core.telegram.org/bots/inline)
/setinlinegeo - schakel inline locatieverzoeken in (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - verander inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) instellingen
/setjoingroups - kan je bot aan groepen worden toegevoegd?
/setprivacy - schakel de privacy-modus (https://core.telegram.org/bots#privacy-mode) in groepen in

Spellen
/mygames - bewerk je spellen (https://core.telegram.org/bots/games) [beta]
/newgame - maak een nieuw spel aan (https://core.telegram.org/bots/games)
/listgames - krijg een lijst van je spellen
/editgame - bewerk een spel
/deletegame - verwijder een bestaand spel

Om een nieuwe bot aan te maken, sturen we de opdracht /newbot.

BotFather zal je vragen de naam en gebruikersnaam van de bot in te voeren.

BotFather, [25.07.20 09:39]
Oké, een nieuwe bot. Hoe gaan we deze noemen? Kies een naam voor je bot.

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

BotFather, [25.07.20 09:40]
Goed. Laten we nu een gebruikersnaam voor je bot kiezen. Het moet eindigen op `bot`. Bijvoorbeeld: TetrisBot of tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

De naam kun je willekeurig invullen, maar de gebruikersnaam moet eindigen op bot.

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

Klaar! Gefeliciteerd met je nieuwe bot. Je vindt het op t.me/my_test_bot. Je kunt nu een beschrijving, een over-sectie en een profielfoto voor je bot toevoegen, zie /help voor een lijst met opdrachten. Trouwens, als je klaar bent met het maken van je coole bot, neem dan contact op met onze Bot Support als je een betere gebruikersnaam wilt. Zorg ervoor dat de bot volledig operationeel is voordat je dit doet.

Gebruik deze token om toegang te krijgen tot de HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

Voor een beschrijving van de Bot API, zie deze pagina: https://core.telegram.org/bots/api

Vervolgens heb je de verkregen API-token nodig, in mijn voorbeeld is dat 123456789:abcdefghijklmnopqrstuvwxyz.

Op deze stap zijn de voorbereidende werkzaamheden voor het maken van de bot afgerond.

Installeren van het pakket voor het werken met Telegram-bots in R

Ik ga ervan uit dat je de R-taal en de RStudio-ontwikkelomgeving al hebt geïnstalleerd. Als dat niet het geval is, kun je deze videoles bekijken over hoe je ze kunt installeren.

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

Pakketten in R worden geïnstalleerd met de functie install.packages(), dus gebruik de opdracht om het benodigde pakket te installeren install.packages("telegram.bot").

Meer informatie over het installeren van verschillende pakketten vind je in deze video.

Na de installatie van het pakket moet deze worden geladen:

library(telegram.bot)

Berichten verzenden van R naar Telegram

Je gemaakte bot kun je in Telegram vinden met de gebruikersnaam die je bij het maken hebt ingevoerd, in mijn geval is dat @my_test_bot.

Stuur de bot een bericht, bijvoorbeeld "Hallo bot". Op dit moment is dit nodig om de ID van uw chat met de bot te verkrijgen.

Laten we nu de volgende code in R schrijven.

library(telegram.bot)

# Maak een instantie van de bot
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Vraag informatie over de bot aan
print(bot$getMe())

# Verkrijg de updates van de bot, d.w.z. de lijst met berichten die naar hem gestuurd zijn
updates <- bot$getUpdates()

# Vraag het chat-id aan
# Opmerking: voordat u updates opvraagt, moet u de bot een bericht sturen
chat_id <- updates[[1L]]$from_chat_id()

Eerst maken we een instantie van onze bot met de functie Bot(), waarbij we de eerder verkregen token als argument moeten doorgeven.

Het is niet de beste praktijk om de token in de code op te slaan, dus u kunt deze in een omgevingsvariabele Opslaan en deze vanuit daar opvragen. Standaard ondersteunt het pakket telegram.bot omgevingsvariabelen met de volgende naam: R_TELEGRAM_BOT_uw_bot_naam. In plaats van uw_bot_naam vervang het door de naam die u bij het creëren hebt gegeven, in mijn geval zal de variabele zijn R_TELEGRAM_BOT_My Test Bot.

U kunt omgevingsvariabelen op verschillende manieren aanmaken; ik zal u de meest universele en cross-platform methode vertellen. Maak in uw home directory (deze kunt u achterhalen met de opdracht path.expand("~")) een tekstbestand met de naam .Renviron. Dit kan ook gedaan worden met de opdracht file.edit(path.expand(file.path("~", ".Renviron"))).

En voeg de volgende regel toe.

R_TELEGRAM_BOT_uw_bot_naam=123456789:abcdefghijklmnopqrstuvwxyz

Vervolgens kunt u de opgeslagen token in de omgevingsvariabele gebruiken met de functie bot_token(), dat wil zeggen, zo:

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

Methode getUpdates()stelt ons in staat om de updates van de bot te verkrijgen, dat wil zeggen, de berichten die naar hem zijn gestuurd. De methode from_chat_id(), geeft ons het chat-id van waaruit het bericht is verzonden. Dit id hebben we nodig om berichten van de bot te verzenden.

Naast de chat-id uit het object dat door de methode getUpdates() krijgt u ook 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"

Dus op dit moment hebben we al alles wat we nodig hebben om een bericht van de bot naar Telegram te sturen. Laten we de methode gebruiken. sendMessage(), waarin het chat-ID, de tekst van het bericht en het type markup van het bericht moeten worden doorgegeven. Het type markup kan Markdown of HTML zijn en wordt ingesteld met een argument parse_mode.

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

Basisprincipes van Markdown markup:

  • Vette tekst wordt gemarkeerd met een *:
    • voorbeeld: *vette tekst*
    • resultaat: vette tekst
  • Cursieve tekst wordt aangegeven met een underscore:
    • voorbeeld: _cursief_
    • resultaat: cursief
  • Monospace tekst, dat gewoonlijk voor programmatuurcode wordt gebruikt, wordt aangegeven met accenttekens — `:
    • voorbeeld: `monospace tekst`
    • resultaat: monospace tekst

Basisprincipes van HTML markup:
In HTML omhul je het deel van de tekst dat je wilt markeren met tags, voorbeeld tekst.

  • — openings-tag
  • — sluit-tag

HTML markup tags

  • <b> — vette tekst
    • voorbeeld: <b>vetgedrukt</b>
    • het resultaat vetgedrukt
  • — cursief
    • voorbeeld: cursief
    • resultaat: cursief
  • — monospace tekst
    • voorbeeld: monospace tekst
    • resultaat: monospace tekst

Naast tekst kun je ook andere inhoud verzenden met 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"
)

Dat wil zeggen, bijvoorbeeld met de methode sendPhoto() kun je een grafiek die je hebt gemaakt met het pakket ggplot2.

Controle van de Windows Taakplanner en het verzenden van meldingen over taken die onverwacht zijn beëindigd

Voor het werken met de Windows Taakplanner moet je het pakket taskscheduleR, en voor het gemak van het werken met gegevens installeren we het pakket dplyr.

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

Vervolgens vragen we met de functie taskscheduler_ls() informatie over taken uit onze planner. Met de functie filter() uit het pakket dplyr verwijderen we de taken uit de lijst die succesvol zijn uitgevoerd en een status van het laatste resultaat van 0 hebben, en die welke nog nooit zijn uitgevoerd en een status van 267011 hebben, uitgeschakelde taken, en 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 object task hebben we nu een lijst van taken waarvan het werk is beëindigd met een fout, deze lijst moeten we naar Telegram sturen.

Als we elke opdracht nader bekijken, dan:

  • filter() — filtert de lijst van taken volgens de hierboven beschreven voorwaarden
  • select() — laat alleen één kolom met de naam van de taken in de tabel over
  • unique() — verwijdert dubbele namen
  • unlist() — converteert de gekozen kolom van de tabel naar een vector
  • paste0() — voegt de namen van de taken samen in één regel, met als scheidingsteken een nieuwe regel, dat wil zeggen. n.

Alles wat we nog hoeven te doen is dit resultaat naar Telegram te sturen.

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

Tot nu toe ziet de code van de bot er als volgt uit:

De code van de bot die taken controleert

# Подключение пакета
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"
  )

}

Bij het gebruik van het bovenstaande voorbeeld vervangt u in de code de token van uw bot en uw chat-ID.

U kunt filtervoorwaarden voor taken toevoegen, bijvoorbeeld door alleen die taken te controleren die door u zijn aangemaakt, met uitzondering van systeemtaken.

U kunt ook verschillende instellingen in een afzonderlijk configuratiebestand plaatsen en daarin de chat-ID en token opslaan. Het configuratiebestand kan bijvoorbeeld worden gelezen met behulp van het pakket configr.

Voorbeeld ini-configuratie

[telegram_bot]
;instellingen voor de Telegram-bot en de chat waarin de meldingen zullen binnenkomen
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Voorbeeld van het lezen van variabelen uit de configuratie in R

library(configr)

# lezen van de configuratie
config <- read.config('C:/pad_naar_config/config.cfg', rcmd.parse = TRUE)

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

Het inplannen van de taakcontrole

Het proces van het inplannen van scripts wordt het meest gedetailleerd beschreven in dit artikel. artikel. Hier beschrijf ik alleen de stappen die moeten worden uitgevoerd. Als een van de stappen niet duidelijk is, raadpleeg dan het artikel waarnaar ik verwijs.

Laten we aannemen dat we de code van onze bot in het bestand check_bot.R. Om de reguliere uitvoering van dit bestand te plannen, voert u de volgende stappen uit:

  1. Voeg het pad naar de map waarin R is geïnstalleerd toe aan de systeemvariabele Path; onder Windows is het pad ongeveer als volgt: C:Program FilesRR-4.0.2bin.
  2. Maak een uitvoerbaar bat-bestand aan met slechts één regel R CMD BATCH C:rscriptscheck_botcheck_bot.R. Vervang C:rscriptscheck_botcheck_bot.R naar het volledige pad naar uw R-bestand.
  3. Stel vervolgens via de Windows Taakplanner een schema in voor uitvoering, bijvoorbeeld elke half uur.

Conclusie

In dit artikel hebben we bekeken hoe we een bot kunnen maken en met behulp daarvan verschillende meldingen naar Telegram kunnen verzenden.

Ik heb de taak van het controleren van de Windows Taakplanner beschreven, maar u kunt het materiaal van dit artikel gebruiken voor het verzenden van elke soort meldingen, van weersvoorspellingen tot aandelenkoersen op de beurs, omdat R u in staat stelt om verbinding te maken met een enorme hoeveelheid gegevensbronnen.

In het volgende artikel zullen we bekijken hoe we het botcommando en het toetsenbord kunnen toevoegen, zodat het niet alleen meldingen kan verzenden, maar ook complexere acties kan uitvoeren.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster