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