Pagsusulat ng telegram bot sa R ​​(bahagi 1): Paglikha ng bot at paggamit nito upang magpadala ng mga mensahe sa telegram

Ang madla ng Telegram ay lumalaki nang malaki araw-araw, ito ay pinadali ng kaginhawaan ng messenger, ang pagkakaroon ng mga channel, mga chat, at siyempre ang kakayahang lumikha ng mga bot.

Maaaring gamitin ang mga bot para sa ganap na magkakaibang layunin, mula sa pag-automate ng mga komunikasyon sa iyong mga customer hanggang sa pamamahala ng sarili mong mga gawain.

Sa pangkalahatan, maaari mong gamitin ang telegram upang magsagawa ng anumang mga operasyon sa pamamagitan ng bot: magpadala o humiling ng data, magpatakbo ng mga gawain sa server, mangolekta ng impormasyon sa isang database, magpadala ng mga email, at iba pa.

Plano kong magsulat ng isang serye ng mga artikulo kung paano magtrabaho kasama telegram bot API, at sumulat ng mga bot upang umangkop sa iyong mga pangangailangan.

Pagsusulat ng telegram bot sa R ​​(bahagi 1): Paglikha ng bot at paggamit nito upang magpadala ng mga mensahe sa telegram

Sa unang artikulong ito, malalaman natin kung paano lumikha ng isang telegram bot at gamitin ito upang magpadala ng mga abiso sa telegrama.

Bilang resulta, magkakaroon kami ng bot na susuri sa katayuan ng huling pagpapatupad ng lahat ng gawain sa Windows Task Scheduler, at magpapadala sa iyo ng mga abiso kung nabigo ang alinman sa mga ito.

Ngunit ang layunin ng seryeng ito ng mga artikulo ay hindi upang turuan ka kung paano magsulat ng isang bot para sa isang tiyak, makitid na gawain, ngunit sa pangkalahatan ay ipakilala sa iyo ang syntax ng package telegram.bot, at mga halimbawa ng code kung saan maaari kang sumulat ng mga bot upang malutas ang iyong sariling mga problema.

nilalaman

Kung interesado ka sa pagsusuri ng data, maaaring interesado ka sa aking telegram ΠΈ youtube mga channel. Karamihan sa nilalaman ay nakatuon sa wikang R.

  1. Paglikha ng telegram bot
  2. Pag-install ng isang pakete para sa pagtatrabaho sa isang telegram bot sa R
  3. Nagpapadala ng mga mensahe mula sa R ​​hanggang Telegram
  4. Pagse-set up ng iskedyul para sa pagpapatakbo ng mga pag-scan ng gawain
  5. Konklusyon

Paglikha ng telegram bot

Una, kailangan nating gumawa ng bot. Ginagawa ito gamit ang isang espesyal na bot BotAma, pumunta sa link at sumulat sa bot /start.

Pagkatapos nito makakatanggap ka ng isang mensahe na may isang listahan ng mga utos:

Mensahe mula sa 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

Para gumawa ng bagong bot, ipadala ang command /newbot.

Hihilingin sa iyo ng BotFather na ipasok ang pangalan ng bot at mag-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

Maaari kang magpasok ng anumang pangalan, ngunit ang pag-login ay dapat magtapos sa bot.

Kung ginawa mo nang tama ang lahat, matatanggap mo ang sumusunod na mensahe:

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

Susunod na kakailanganin mo ang natanggap na token ng API, sa aking halimbawa ito ay 123456789:abcdefghijklmnopqrstuvwxyz.

Sa hakbang na ito, nakumpleto ang paghahanda sa paggawa ng bot.

Pag-install ng isang pakete para sa pagtatrabaho sa isang telegram bot sa R

Ipinapalagay ko na mayroon ka nang naka-install na wikang R at ang kapaligiran ng pag-unlad ng RStudio. Kung hindi ito ang kaso, maaari mong tingnan ito aralin sa video sa kung paano i-install ang mga ito.

Upang gumana sa Telegram Bot API gagamitin namin ang R package telegram.bot.

Ang pag-install ng mga pakete sa R ​​ay ginagawa gamit ang function install.packages(), kaya para mai-install ang package na kailangan namin, gamitin ang command install.packages("telegram.bot").

Maaari kang matuto nang higit pa tungkol sa pag-install ng iba't ibang mga pakete mula sa ang video na ito.

Pagkatapos i-install ang package, kailangan mong ikonekta ito:

library(telegram.bot)

Nagpapadala ng mga mensahe mula sa R ​​hanggang Telegram

Ang bot na iyong nilikha ay matatagpuan sa Telegram gamit ang pag-login na tinukoy sa panahon ng paglikha, sa aking kaso ito ay @my_test_bot.

Ipadala sa bot ang anumang mensahe, gaya ng "Hey bot." Sa ngayon, kailangan namin ito para makuha ang id ng iyong chat sa bot.

Ngayon isinusulat namin ang sumusunod na code sa R.

library(telegram.bot)

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

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

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

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

Sa una, gumawa kami ng isang instance ng aming bot na may function Bot(), ang dating natanggap na token ay dapat ipasa dito bilang argumento.

Hindi itinuturing na pinakamahusay na kasanayan ang pag-imbak ng token sa code, upang maiimbak mo ito sa isang variable ng kapaligiran at basahin ito mula dito. Bilang default sa package telegram.bot Naipatupad ang suporta para sa mga variable ng kapaligiran ng mga sumusunod na pangalan: R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π... sa halip na ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π palitan ang pangalan na iyong tinukoy noong lumilikha, sa aking kaso ito ay magiging isang variable R_TELEGRAM_BOT_My Test Bot.

Mayroong ilang mga paraan upang lumikha ng isang variable ng kapaligiran; Sasabihin ko sa iyo ang tungkol sa pinaka-unibersal at cross-platform. Lumikha sa iyong home directory (makikita mo ito gamit ang command path.expand("~")) text file na may pangalan .Renviron. Magagawa mo rin ito gamit ang command file.edit(path.expand(file.path("~", ".Renviron"))).

At idagdag ang sumusunod na linya dito.

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

Susunod, maaari mong gamitin ang token na naka-save sa environment variable gamit ang function bot_token(), ibig sabihin. ganito:

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

pamamaraan getUpdates()nagbibigay-daan sa amin na makakuha ng mga update sa bot, ibig sabihin. mga mensaheng ipinadala sa kanya. Pamamaraan from_chat_id(), ay nagbibigay-daan sa iyong makuha ang ID ng chat kung saan ipinadala ang mensahe. Kailangan namin ang ID na ito upang magpadala ng mga mensahe mula sa bot.

Bilang karagdagan sa chat id mula sa bagay na nakuha ng pamamaraan getUpdates() makakatanggap ka rin ng ilang iba pang kapaki-pakinabang na impormasyon. Halimbawa, impormasyon tungkol sa user na nagpadala ng mensahe.

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"

Kaya, sa yugtong ito mayroon na kami ng lahat ng kailangan namin upang magpadala ng mensahe mula sa isang bot patungo sa Telegram. Gamitin natin ang pamamaraan sendMessage(), kung saan kailangan mong ipasa ang chat ID, message text, at message text markup type. Ang uri ng markup ay maaaring Markdown o HTML at itinakda ng argumento parse_mode.

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

Mga pangunahing kaalaman sa pag-format ng markdown:

  • Ang naka-bold na font ay naka-highlight sa *:
    • Halimbawa: *ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ‚Ρ„*
    • resulta: naka-bold na font
  • Ang mga Italic ay ipinahiwatig ng mga salungguhit:
    • Halimbawa: _курсив_
    • resulta: italics
  • Ang monospace na font, na karaniwang ginagamit upang i-highlight ang code ng programa, ay tinukoy gamit ang mga kudlit - `:
    • halimbawa: `monospace font`
    • resulta: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Mga pangunahing kaalaman sa pag-format ng HTML markup:
Sa HTML, binabalot mo ang bahagi ng teksto na kailangang i-highlight sa mga tag, halimbawa <Ρ‚Π΅Π³>тСкст</Ρ‚Π΅Π³>.

  • <tag> - pambungad na tag
  • - closing tag

Mga HTML markup tag

  • <b> - naka-bold na font
    • Halimbawa: <b>ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚</b>
    • magbunga naka-bold na font
  • <i> - italics
    • Halimbawa: <i>курсив</i>
    • resulta: italics
  • β€” ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • halimbawa: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • resulta: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Bilang karagdagan sa teksto, maaari kang magpadala ng iba pang nilalaman gamit ang mga espesyal na pamamaraan:

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

Yung. halimbawa gamit ang pamamaraan sendPhoto() maaari kang magpadala ng isang graph na na-save bilang isang imahe na iyong nilikha gamit ang package ggplot2.

Sinusuri ang Windows Task Scheduler at pagpapadala ng mga abiso tungkol sa mga gawain na hindi normal na natapos

Upang gumana sa Windows Task Scheduler kailangan mong i-install ang package taskscheduleR, at para sa kaginhawaan ng pagtatrabaho sa data, i-install ang package dplyr.

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

Susunod, gamit ang function taskscheduler_ls() humihiling kami ng impormasyon tungkol sa mga gawain mula sa aming scheduler. Gamit ang function filter() mula sa pakete dplyr Aalisin namin mula sa listahan ng mga gawain ang mga matagumpay na nakumpleto at may huling katayuan ng resulta na 0, at ang mga hindi pa nailunsad at may status na 267011, mga naka-disable na gawain, at mga gawain na kasalukuyang tumatakbo.

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

Sa bagay task Mayroon na kaming listahan ng mga gawain na nabigo, kailangan naming ipadala ang listahang ito sa Telegram.

Kung titingnan natin ang bawat utos nang mas detalyado, kung gayon:

  • filter() β€” sinasala ang listahan ng mga gawain ayon sa mga kondisyong inilarawan sa itaas
  • select() - nag-iiwan lamang ng isang patlang sa talahanayan na may pangalan ng mga gawain
  • unique() - nag-aalis ng mga duplicate na pangalan
  • unlist() β€” kino-convert ang napiling column ng talahanayan sa isang vector
  • paste0() β€” ikinokonekta ang mga pangalan ng mga gawain sa isang linya, at naglalagay ng line feed bilang isang separator, i.e. n.

Ang natitira na lang sa amin ay ipadala ang resultang ito sa pamamagitan ng telegrama.

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

Kaya, sa sandaling ito ang bot code ay ganito ang hitsura:

Code ng bot ng pagsusuri sa gawain

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

}

Kapag ginagamit ang halimbawa sa itaas, palitan ang iyong bot token at ang iyong chat ID sa code.

Maaari kang magdagdag ng mga kundisyon para sa pag-filter ng mga gawain, halimbawa, pagsuri lamang sa mga gawaing ginawa mo, hindi kasama ang mga gawain ng system.

Maaari ka ring maglagay ng iba't ibang setting sa isang hiwalay na configuration file, at iimbak dito ang chat id at token. Maaari mong basahin ang config, halimbawa, gamit ang package configr.

Halimbawa ng config

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

Isang halimbawa ng pagbabasa ng mga variable mula sa isang config sa 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

Pagse-set up ng iskedyul para sa pagpapatakbo ng mga pag-scan ng gawain

Ang proseso ng pag-set up ng paglulunsad ng mga script sa isang iskedyul ay inilalarawan nang mas detalyado dito Artikulo. Dito ko lang ilalarawan ang mga hakbang na kailangang sundin para dito. Kung ang alinman sa mga hakbang ay hindi malinaw sa iyo, pagkatapos ay sumangguni sa artikulo kung saan ako nagbigay ng isang link.

Ipagpalagay natin na na-save namin ang aming bot code sa isang file check_bot.R. Upang iiskedyul ang file na ito na tumakbo nang regular, sundin ang mga hakbang na ito:

  1. Isulat ang path sa folder kung saan naka-install ang R sa Path system variable; sa Windows, ang path ay magiging ganito: C:Program FilesRR-4.0.2bin.
  2. Gumawa ng executable bat file na may isang linya lang R CMD BATCH C:rscriptscheck_botcheck_bot.R. Palitan C:rscriptscheck_botcheck_bot.R sa buong landas sa iyong R file.
  3. Susunod, gamitin ang Windows Task Scheduler upang mag-set up ng iskedyul ng paglulunsad, halimbawa, bawat kalahating oras.

Konklusyon

Sa artikulong ito, nalaman namin kung paano lumikha ng isang bot at gamitin ito upang magpadala ng iba't ibang mga abiso sa telegrama.

Inilarawan ko ang gawain ng pagsubaybay sa Windows Task Scheduler, ngunit maaari mong gamitin ang materyal sa artikulong ito upang magpadala ng anumang mga abiso, mula sa taya ng panahon hanggang sa mga stock quote sa stock exchange, dahil Pinapayagan ka ng R na kumonekta sa isang malaking bilang ng mga mapagkukunan ng data.

Sa susunod na artikulo, malalaman natin kung paano magdagdag ng mga utos at keyboard sa bot upang hindi lamang ito makapagpadala ng mga abiso, ngunit magsagawa rin ng mas kumplikadong mga aksyon.

Pinagmulan: www.habr.com

Magdagdag ng komento