Scrivere un bot di Telegram in R (parte 1): creare un bot e utilizzarlo per inviare messaggi in Telegram

Il pubblico di Telegram cresce esponenzialmente ogni giorno, questo è facilitato dalla comodità del messenger, dalla presenza di canali, chat e ovviamente dalla possibilità di creare bot.

I bot possono essere utilizzati per scopi completamente diversi, dall'automazione delle comunicazioni con i clienti alla gestione delle proprie attività.

In sostanza, puoi utilizzare Telegram per eseguire qualsiasi operazione tramite un bot: inviare o richiedere dati, eseguire attività sul server, raccogliere informazioni in un database, inviare e-mail e così via.

Ho intenzione di scrivere una serie di articoli su come lavorare con API del bot di Telegrame scrivi bot adatti alle tue esigenze.

Scrivere un bot di Telegram in R (parte 1): creare un bot e utilizzarlo per inviare messaggi in Telegram

In questo primo articolo scopriremo come creare un bot di Telegram e utilizzarlo per inviare notifiche in Telegram.

Di conseguenza, avremo un bot che controllerà lo stato dell'ultima esecuzione di tutte le attività nell'Utilità di pianificazione di Windows e ti invierà notifiche se qualcuna di esse fallisce.

Ma lo scopo di questa serie di articoli non è insegnarti come scrivere un bot per un compito specifico e ristretto, ma introdurti in generale alla sintassi del pacchetto telegram.boted esempi di codice con cui puoi scrivere bot per risolvere i tuoi problemi.

contenuto

Se sei interessato all'analisi dei dati, potresti essere interessato al mio Telegram и youtube canali. La maggior parte del contenuto è dedicata al linguaggio R.

  1. Creazione di un bot di Telegram
  2. Installazione di un pacchetto per lavorare con un bot di Telegram in R
  3. Invio di messaggi da R a Telegram
  4. Impostazione di una pianificazione per l'esecuzione delle scansioni delle attività
  5. conclusione

Creazione di un bot di Telegram

Per prima cosa dobbiamo creare un bot. Questo viene fatto utilizzando un bot speciale BotPadre, vai a collegamento e scrivi al bot /start.

Dopodiché riceverai un messaggio con un elenco di comandi:

Messaggio da 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

Per creare un nuovo bot, invia il comando /newbot.

BotFather ti chiederà di inserire il nome del bot e di effettuare il login.

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

È possibile inserire qualsiasi nome, ma il login deve terminare con bot.

Se hai fatto tutto correttamente, riceverai il seguente messaggio:

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

Successivamente avrai bisogno del token API ricevuto, nel mio esempio lo è 123456789:abcdefghijklmnopqrstuvwxyz.

A questo punto il lavoro preparatorio per la creazione del bot è completato.

Installazione di un pacchetto per lavorare con un bot di Telegram in R

Presumo che tu abbia già installato il linguaggio R e l'ambiente di sviluppo RStudio. Se questo non è il caso, puoi guardare questo video tutorial su come installarli.

Per lavorare con l'API Bot di Telegram utilizzeremo il pacchetto R telegram.bot.

L'installazione dei pacchetti in R viene eseguita utilizzando la funzione install.packages(), quindi per installare il pacchetto di cui abbiamo bisogno, utilizziamo il comando install.packages("telegram.bot").

Puoi saperne di più sull'installazione di vari pacchetti da questo video.

Dopo aver installato il pacchetto, è necessario collegarlo:

library(telegram.bot)

Invio di messaggi da R a Telegram

Il bot che hai creato può essere trovato in Telegram utilizzando il login specificato durante la creazione, nel mio caso lo è @my_test_bot.

Invia al bot qualsiasi messaggio, ad esempio "Ehi bot". Al momento, ne abbiamo bisogno per ottenere l'ID della tua chat con il bot.

Ora scriviamo il seguente codice in R.

library(telegram.bot)

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

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

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

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

Inizialmente creiamo un'istanza del nostro bot con la funzione Bot(), il token ricevuto in precedenza deve essere passato come argomento.

Non è considerata una procedura consigliata archiviare il token nel codice, quindi è possibile archiviarlo in una variabile di ambiente e leggerlo da essa. Per impostazione predefinita nel pacchetto telegram.bot È stato implementato il supporto per le variabili di ambiente con i seguenti nomi: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Anziché ИМЯ_ВАШЕГО_БОТА sostituisci il nome che hai specificato durante la creazione, nel mio caso sarà una variabile R_TELEGRAM_BOT_My Test Bot.

Esistono diversi modi per creare una variabile d'ambiente; ti parlerò di quello più universale e multipiattaforma. Crea nella tua home directory (puoi trovarla usando il comando path.expand("~")) file di testo con il nome .Renviron. Puoi farlo anche usando il comando file.edit(path.expand(file.path("~", ".Renviron"))).

E aggiungi la seguente riga.

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

Successivamente, puoi utilizzare il token salvato nella variabile di ambiente utilizzando la funzione bot_token(), cioè. come questo:

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

metodo getUpdates()ci consente di ottenere aggiornamenti dai bot, ad es. messaggi che gli sono stati inviati. Metodo from_chat_id(), permette di ottenere l'ID della chat da cui è stato inviato il messaggio. Abbiamo bisogno di questo ID per inviare messaggi dal bot.

Oltre all'ID chat dell'oggetto ottenuto con il metodo getUpdates() riceverai anche altre informazioni utili. Ad esempio, informazioni sull'utente che ha inviato il messaggio.

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"

Quindi, a questo punto abbiamo già tutto ciò che ci serve per inviare un messaggio da un bot a Telegram. Usiamo il metodo sendMessage(), in cui devi passare l'ID della chat, il testo del messaggio e il tipo di markup del testo del messaggio. Il tipo di markup può essere Markdown o HTML ed è impostato dall'argomento parse_mode.

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

Nozioni di base sulla formattazione di Markdown:

  • Il carattere in grassetto è evidenziato con *:
    • Esempio: *жирный шритф*
    • il risultato: carattere in grassetto
  • Il corsivo è indicato da un trattino basso:
    • Esempio: _курсив_
    • il risultato: corsivo
  • Il carattere a spaziatura fissa, solitamente utilizzato per evidenziare il codice del programma, viene specificato utilizzando gli apostrofi - `:
    • esempio: "carattere a spaziatura fissa".
    • il risultato: моноширинный шрифт

Nozioni di base sulla formattazione del markup HTML:
In HTML, racchiudi la parte del testo che deve essere evidenziata nei tag, ad esempio <тег>текст</тег>.

  • <tag> - tag di apertura
  • - cartellino di chiusura

Tag di markup HTML

  • <b> - carattere grassetto
    • Esempio: <b>жирный шрифт</b>
    • provocare audace
  • <i> - corsivo
    • Esempio: <i>курсив</i>
    • il risultato: corsivo
  • — моноширинный шрифт
    • esempio: моноширинный шрифт
    • il risultato: моноширинный шрифт

Oltre al testo, puoi inviare altri contenuti utilizzando metodi speciali:

# Отправить изображение
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"
)

Quelli. ad esempio utilizzando il metodo sendPhoto() puoi inviare un grafico salvato come immagine creata utilizzando il pacchetto ggplot2.

Controllo dell'Utilità di pianificazione di Windows e invio di notifiche sulle attività che sono state terminate in modo anomalo

Per lavorare con l'Utilità di pianificazione di Windows è necessario installare il pacchetto taskscheduleRe, per comodità di lavorare con i dati, installa il pacchetto dplyr.

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

Successivamente, utilizzando la funzione taskscheduler_ls() richiediamo informazioni sulle attività dal nostro pianificatore. Utilizzando la funzione filter() dal pacchetto dplyr Rimuoviamo dall'elenco delle attività quelle che sono state completate con successo e hanno uno stato dell'ultimo risultato pari a 0 e quelle che non sono mai state avviate e hanno uno stato di 267011, le attività disabilitate e le attività attualmente in esecuzione.

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

Nell'oggetto task Ora abbiamo un elenco di attività non riuscite, dobbiamo inviare questo elenco a Telegram.

Se esaminiamo ciascun comando in modo più dettagliato, allora:

  • filter() — filtra l'elenco delle attività in base alle condizioni sopra descritte
  • select() — lascia solo un campo nella tabella con il nome delle attività
  • unique() - rimuove i nomi duplicati
  • unlist() — converte la colonna della tabella selezionata in un vettore
  • paste0() — collega i nomi delle attività in un'unica riga e inserisce un avanzamento riga come separatore, ad es. n.

Non ci resta che inviare questo risultato tramite telegramma.

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

Quindi, al momento il codice del bot è simile a questo:

Codice del bot di revisione delle attività

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

}

Quando utilizzi l'esempio precedente, sostituisci il token del bot e l'ID della chat nel codice.

Puoi aggiungere condizioni per filtrare le attività, ad esempio controllando solo le attività che hai creato, escluse quelle di sistema.

Puoi anche inserire varie impostazioni in un file di configurazione separato e memorizzare l'ID chat e il token al suo interno. Puoi leggere la configurazione, ad esempio, utilizzando il pacchetto configr.

Esempio di configurazione ini

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

Un esempio di lettura di variabili da una configurazione 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

Impostazione di una pianificazione per l'esecuzione delle scansioni delle attività

Il processo di impostazione dell'avvio degli script in base a una pianificazione è descritto più dettagliatamente in questo Articolo. Qui descriverò solo i passaggi che devono essere seguiti per questo. Se uno qualsiasi dei passaggi non ti è chiaro, fai riferimento all'articolo a cui ho fornito un collegamento.

Supponiamo di aver salvato il codice del nostro bot in un file check_bot.R. Per pianificare l'esecuzione regolare di questo file, attenersi alla seguente procedura:

  1. Scrivi il percorso della cartella in cui è installato R nella variabile di sistema Path; in Windows il percorso sarà simile a questo: C:Program FilesRR-4.0.2bin.
  2. Crea un file bat eseguibile con una sola riga R CMD BATCH C:rscriptscheck_botcheck_bot.R. Sostituire C:rscriptscheck_botcheck_bot.R al percorso completo del file R.
  3. Successivamente, utilizza l'Utilità di pianificazione di Windows per impostare una pianificazione del lancio, ad esempio ogni mezz'ora.

conclusione

In questo articolo abbiamo capito come creare un bot e utilizzarlo per inviare varie notifiche in Telegram.

Ho descritto l'attività di monitoraggio dell'Utilità di pianificazione di Windows, ma puoi utilizzare il materiale di questo articolo per inviare eventuali notifiche, dalle previsioni del tempo alle quotazioni di borsa, perché R ti consente di connetterti a un numero enorme di origini dati.

Nel prossimo articolo scopriremo come aggiungere comandi e una tastiera al bot in modo che possa non solo inviare notifiche, ma anche eseguire azioni più complesse.

Fonte: habr.com

Aggiungi un commento