R-da telegramma bot yozish (1-qism): Bot yaratish va undan telegrammada xabar yuborish uchun foydalanish

Telegram auditoriyasi har kuni eksponent ravishda o'sib bormoqda, bunga messenjerning qulayligi, kanallar, chatlarning mavjudligi va, albatta, botlarni yaratish qobiliyati yordam beradi.

Botlardan butunlay boshqa maqsadlarda, mijozlar bilan muloqotni avtomatlashtirishdan tortib, oβ€˜z vazifalaringizni boshqarishgacha foydalanish mumkin.

Asosan, siz bot orqali istalgan operatsiyalarni bajarish uchun telegramdan foydalanishingiz mumkin: ma'lumotlarni yuborish yoki so'rash, serverda vazifalarni bajarish, ma'lumotlar bazasiga ma'lumot to'plash, elektron pochta xabarlarini yuborish va hokazo.

Men qanday ishlash kerakligi haqida bir qator maqolalar yozishni rejalashtirmoqdaman telegram bot API, va ehtiyojlaringizga mos botlarni yozing.

R-da telegramma bot yozish (1-qism): Bot yaratish va undan telegrammada xabar yuborish uchun foydalanish

Ushbu birinchi maqolada biz telegram botini qanday yaratish va undan telegramda bildirishnomalarni yuborish uchun foydalanishni aniqlaymiz.

Natijada, Windows Task Scheduler-dagi barcha vazifalarning oxirgi bajarilishi holatini tekshiradigan va ulardan birontasi bajarilmasa, sizga xabarnoma yuboradigan botga ega bo'lamiz.

Ammo ushbu maqolalar turkumining maqsadi aniq, tor vazifa uchun qanday bot yozishni o'rgatish emas, balki sizni umuman paketning sintaksisi bilan tanishtirishdir. telegram.bot, va o'zingizning muammolaringizni hal qilish uchun botlarni yozishingiz mumkin bo'lgan kod misollari.

Mundarija

Agar siz ma'lumotlarni tahlil qilish bilan qiziqsangiz, meni qiziqtirishi mumkin telegramma ΠΈ youtube kanallar. Kontentning katta qismi R tiliga bag'ishlangan.

  1. Telegram bot yaratish
  2. R da telegram boti bilan ishlash paketini o'rnatish
  3. R-dan Telegram-ga xabarlar yuborish
  4. Vazifalarni skanerlash uchun jadvalni o'rnatish
  5. xulosa

Telegram bot yaratish

Birinchidan, biz bot yaratishimiz kerak. Bu maxsus bot yordamida amalga oshiriladi BotOta, ga boring aloqa va botga yozing /start.

Shundan so'ng siz buyruqlar ro'yxati bilan xabar olasiz:

BotFatherdan xabar

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

Yangi bot yaratish uchun buyruq yuboring /newbot.

BotFather sizdan bot nomi va login kiritishingizni so'raydi.

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

Siz istalgan nomni kiritishingiz mumkin, lekin login bilan tugashi kerak bot.

Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, siz quyidagi xabarni olasiz:

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

Keyinchalik sizga qabul qilingan API tokeni kerak bo'ladi, mening misolimda shunday 123456789:abcdefghijklmnopqrstuvwxyz.

Ushbu bosqichda botni yaratish uchun tayyorgarlik ishlari yakunlanadi.

R da telegram boti bilan ishlash paketini o'rnatish

Sizda allaqachon R tili va RStudio ishlab chiqish muhiti o'rnatilgan deb o'ylayman. Agar bunday bo'lmasa, unda siz buni ko'rishingiz mumkin video darslik ularni qanday o'rnatish haqida.

Telegram Bot API bilan ishlash uchun biz R paketidan foydalanamiz telegram.bot.

R da paketlarni o'rnatish funksiya yordamida amalga oshiriladi install.packages(), shuning uchun bizga kerak bo'lgan paketni o'rnatish uchun buyruqdan foydalaning install.packages("telegram.bot").

Turli paketlarni o'rnatish haqida ko'proq bilib olishingiz mumkin bu video.

Paketni o'rnatgandan so'ng, uni ulashingiz kerak:

library(telegram.bot)

R-dan Telegram-ga xabarlar yuborish

Siz yaratgan botni Telegramda yaratish vaqtida ko'rsatilgan login yordamida topish mumkin, mening holimda shunday @my_test_bot.

Botga har qanday xabarni yuboring, masalan, "Hey bot". Ayni paytda bot bilan suhbatingiz identifikatorini olish uchun bizga bu kerak.

Endi biz quyidagi kodni R ga yozamiz.

library(telegram.bot)

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

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

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

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

Dastlab, funksiya bilan botimizning namunasini yaratamiz Bot(), ilgari olingan token argument sifatida unga uzatilishi kerak.

Tokenni kodda saqlash eng yaxshi amaliyot deb hisoblanmaydi, shuning uchun uni muhit oΚ»zgaruvchisida saqlashingiz va undan oΚ»qishingiz mumkin. Paketda sukut bo'yicha telegram.bot Quyidagi nomdagi muhit o'zgaruvchilari uchun qo'llab-quvvatlash amalga oshirildi: R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π... Buning o'rniga ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π yaratishda siz ko'rsatgan nomni almashtiring, mening holimda u o'zgaruvchi bo'ladi R_TELEGRAM_BOT_My Test Bot.

Atrof-muhit o'zgaruvchisini yaratishning bir necha yo'li mavjud; men sizga eng universal va o'zaro faoliyat platformalar haqida gapirib beraman. Uy katalogingizda yarating (uni buyruq yordamida topishingiz mumkin path.expand("~")) nomli matn fayli .Renviron. Buni buyruq yordamida ham qilishingiz mumkin file.edit(path.expand(file.path("~", ".Renviron"))).

Va unga quyidagi qatorni qo'shing.

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

Keyinchalik, funksiyadan foydalanib, muhit o'zgaruvchisida saqlangan tokendan foydalanishingiz mumkin bot_token(), ya'ni. mana bunday:

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

usul getUpdates()bizga bot yangilanishlarini olish imkonini beradi, ya'ni. unga yuborilgan xabarlar. Usul from_chat_id(), xabar yuborilgan suhbatning identifikatorini olish imkonini beradi. Botdan xabar yuborish uchun bizga ushbu identifikator kerak.

Usul bilan olingan ob'ektdan suhbat identifikatoriga qo'shimcha ravishda getUpdates() boshqa foydali ma'lumotlarni ham olasiz. Masalan, xabarni yuborgan foydalanuvchi haqida ma'lumot.

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"

Shunday qilib, ushbu bosqichda bizda Telegram-ga botdan xabar yuborish uchun kerak bo'lgan hamma narsa mavjud. Keling, usuldan foydalanaylik sendMessage(), unga chat ID, xabar matni va xabar matni belgilash turini kiritishingiz kerak. Belgilash turi Markdown yoki HTML bo'lishi mumkin va argument tomonidan o'rnatiladi parse_mode.

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

Markdown formatlash asoslari:

  • Qalin shrift * bilan ta'kidlangan:
    • misol: *ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ‚Ρ„*
    • natija: qalin shrift
  • Kursiv pastki chiziq bilan ko'rsatilgan:
    • misol: _курсив_
    • natija: kursiv
  • Odatda dastur kodini ajratib ko'rsatish uchun ishlatiladigan monobo'shliq shrifti apostroflar yordamida belgilanadi - `:
    • misol: `bir fazo shrifti`
    • natija: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

HTML belgilarini formatlash asoslari:
HTMLda siz matnning teglarda ta'kidlanishi kerak bo'lgan qismini o'rab olasiz, masalan <Ρ‚Π΅Π³>тСкст</Ρ‚Π΅Π³>.

  • <tag> - ochilish tegi
  • - yopish belgisi

HTML belgilash teglari

  • <b> - qalin shrift
    • misol: <b>ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚</b>
    • ta'siri qalin shrift
  • <i> - kursiv
    • misol: <i>курсив</i>
    • natija: kursiv
  • β€” ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • misol: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • natija: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Matnga qo'shimcha ravishda siz maxsus usullardan foydalangan holda boshqa tarkibni yuborishingiz mumkin:

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

Bular. masalan, usuldan foydalanish sendPhoto() paket yordamida yaratilgan rasm sifatida saqlangan grafikni yuborishingiz mumkin ggplot2.

Windows Task Scheduler-ni tekshirish va g'ayritabiiy tarzda tugatilgan vazifalar haqida bildirishnomalarni yuborish

Windows Task Scheduler bilan ishlash uchun paketni o'rnatishingiz kerak taskscheduleR, va ma'lumotlar bilan ishlash qulayligi uchun paketni o'rnating dplyr.

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

Keyinchalik, funktsiyadan foydalaning taskscheduler_ls() biz rejalashtiruvchimizdan vazifalar haqida ma'lumot so'raymiz. Funktsiyadan foydalanish filter() paketdan dplyr Biz vazifalar ro'yxatidan muvaffaqiyatli bajarilgan va oxirgi natija holati 0 bo'lganlarni va hech qachon ishga tushirilmagan va 267011 maqomiga ega bo'lganlarni, o'chirilgan vazifalarni va hozirda ishlayotgan vazifalarni olib tashlaymiz.

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

Ob'ektda task Bizda endi bajarilmagan vazifalar roβ€˜yxati bor, bu roβ€˜yxatni Telegram’ga yuborishimiz kerak.

Har bir buyruqni batafsil ko'rib chiqsak, unda:

  • filter() β€” vazifalar roΚ»yxatini yuqorida tavsiflangan shartlarga muvofiq filtrlaydi
  • select() β€” vazifalar nomi bilan jadvalda faqat bitta maydon qoldiradi
  • unique() - takroriy nomlarni olib tashlaydi
  • unlist() β€” tanlangan jadval ustunini vektorga aylantiradi
  • paste0() β€” vazifalar nomlarini bir qatorga bogβ€˜laydi va ajratuvchi sifatida qator tasmasi qoβ€˜yadi, ya’ni. n.

Bizga qolgani shu natijani telegram orqali yuborish.

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

Shunday qilib, hozirda bot kodi quyidagicha ko'rinadi:

Vazifalarni ko'rib chiqish bot kodi

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

}

Yuqoridagi misolni ishlatganda, kodga bot tokeningiz va chat identifikatoringizni almashtiring.

Siz vazifalarni filtrlash uchun shartlarni qo'shishingiz mumkin, masalan, tizimdan tashqari faqat siz yaratgan vazifalarni tekshirish.

Shuningdek, siz turli xil sozlamalarni alohida konfiguratsiya fayliga qo'yishingiz va unda chat identifikatori va tokenni saqlashingiz mumkin. Konfiguratsiyani, masalan, paketdan foydalanib o'qishingiz mumkin configr.

ini konfiguratsiyasiga misol

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

R-dagi konfiguratsiyadan o'zgaruvchilarni o'qishga misol

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

Vazifalarni skanerlash uchun jadvalni o'rnatish

Jadval bo'yicha skriptlarni ishga tushirishni o'rnatish jarayoni bu erda batafsilroq tasvirlangan maqola. Bu erda men faqat buning uchun bajarilishi kerak bo'lgan qadamlarni tasvirlab beraman. Agar biron bir qadam sizga tushunarsiz bo'lsa, men havola bergan maqolaga qarang.

Faraz qilaylik, biz bot kodimizni faylga saqladik check_bot.R. Ushbu faylni muntazam ishga tushirishni rejalashtirish uchun quyidagi amallarni bajaring:

  1. Path tizimi o'zgaruvchisida R o'rnatilgan papkaga yo'lni yozing; Windowsda yo'l shunday bo'ladi: C:Program FilesRR-4.0.2bin.
  2. Bitta qator bilan bajariladigan bat faylini yarating R CMD BATCH C:rscriptscheck_botcheck_bot.R. O'zgartiring C:rscriptscheck_botcheck_bot.R R faylingizning to'liq yo'liga.
  3. Keyinchalik, ishga tushirish jadvalini o'rnatish uchun Windows Task Scheduler-dan foydalaning, masalan, har yarim soatda.

xulosa

Ushbu maqolada biz qanday qilib bot yaratish va undan telegramda turli bildirishnomalarni yuborish uchun foydalanishni aniqladik.

Men Windows Task Scheduler-ni kuzatish vazifasini tasvirlab berdim, ammo siz ushbu maqoladagi materialdan ob-havo prognozidan tortib birjadagi birja kotirovkalarigacha har qanday bildirishnomalarni yuborish uchun foydalanishingiz mumkin, chunki R sizga juda ko'p ma'lumot manbalariga ulanish imkonini beradi.

Keyingi maqolada biz botga buyruqlar va klaviaturani qanday qo'shishni aniqlaymiz, shunda u nafaqat bildirishnomalarni yuborishi, balki murakkabroq harakatlarni ham bajarishi mumkin.

Manba: www.habr.com

a Izoh qo'shish