Menulis bot telegram dalam R (bahagian 1): Mencipta bot dan menggunakannya untuk menghantar mesej dalam telegram

Penonton Telegram berkembang pesat setiap hari, ini difasilitasi oleh kemudahan messenger, kehadiran saluran, sembang, dan sudah tentu keupayaan untuk mencipta bot.

Bot boleh digunakan untuk tujuan yang berbeza, daripada mengautomasikan komunikasi dengan pelanggan anda kepada mengurus tugas anda sendiri.

Pada asasnya, anda boleh menggunakan telegram untuk melakukan sebarang operasi melalui bot: menghantar atau meminta data, menjalankan tugas pada pelayan, mengumpul maklumat ke dalam pangkalan data, menghantar e-mel dan sebagainya.

Saya bercadang untuk menulis satu siri artikel tentang cara bekerja dengannya API bot telegram, dan tulis bot untuk memenuhi keperluan anda.

Menulis bot telegram dalam R (bahagian 1): Mencipta bot dan menggunakannya untuk menghantar mesej dalam telegram

Dalam artikel pertama ini, kami akan memikirkan cara membuat bot telegram dan menggunakannya untuk menghantar pemberitahuan dalam telegram.

Akibatnya, kami akan mempunyai bot yang akan menyemak status pelaksanaan terakhir semua tugasan dalam Penjadual Tugas Windows dan menghantar pemberitahuan kepada anda jika mana-mana daripadanya gagal.

Tetapi tujuan siri artikel ini bukan untuk mengajar anda cara menulis bot untuk tugas khusus dan sempit, tetapi untuk memperkenalkan anda secara am kepada sintaks pakej telegram.bot, dan contoh kod yang boleh anda gunakan untuk menulis bot untuk menyelesaikan masalah anda sendiri.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Jika anda berminat dengan analisis data, anda mungkin berminat dengan saya telegram ΠΈ youtube saluran. Kebanyakan kandungan didedikasikan untuk bahasa R.

  1. Mencipta bot telegram
  2. Memasang pakej untuk bekerja dengan bot telegram dalam R
  3. Menghantar mesej dari R ke Telegram
  4. Menyediakan jadual untuk menjalankan imbasan tugas
  5. Kesimpulan

Mencipta bot telegram

Pertama, kita perlu membuat bot. Ini dilakukan menggunakan bot khas BotBapa, pergi ke pautan dan tulis kepada bot /start.

Selepas itu anda akan menerima mesej dengan senarai arahan:

Mesej daripada 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

Untuk membuat bot baharu, hantar arahan /newbot.

BotFather akan meminta anda memasukkan nama bot dan log masuk.

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

Anda boleh memasukkan sebarang nama, tetapi log masuk mesti berakhir dengan bot.

Jika anda melakukan semuanya dengan betul, anda akan menerima mesej berikut:

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

Seterusnya anda memerlukan token API yang diterima, dalam contoh saya ialah 123456789:abcdefghijklmnopqrstuvwxyz.

Pada langkah ini, kerja persediaan untuk mencipta bot telah selesai.

Memasang pakej untuk bekerja dengan bot telegram dalam R

Saya menganggap bahawa anda sudah mempunyai bahasa R dan persekitaran pembangunan RStudio yang dipasang. Jika ini tidak berlaku, maka anda boleh melihat ini tutorial video tentang cara memasangnya.

Untuk bekerja dengan Telegram Bot API kami akan menggunakan pakej R telegram.bot.

Memasang pakej dalam R dilakukan menggunakan fungsi install.packages(), jadi untuk memasang pakej yang kami perlukan, gunakan arahan install.packages("telegram.bot").

Anda boleh mengetahui lebih lanjut tentang memasang pelbagai pakej daripada video ini.

Selepas memasang pakej, anda perlu menyambungkannya:

library(telegram.bot)

Menghantar mesej dari R ke Telegram

Bot yang anda buat boleh didapati di Telegram menggunakan log masuk yang ditentukan semasa penciptaan, dalam kes saya ia adalah @my_test_bot.

Hantar bot sebarang mesej, seperti "Hei bot." Pada masa ini, kami memerlukan ini untuk mendapatkan id sembang anda dengan bot.

Sekarang kita tulis kod berikut dalam R.

library(telegram.bot)

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

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

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

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

Pada mulanya, kami mencipta contoh bot kami dengan fungsi tersebut Bot(), token yang diterima sebelum ini mesti dihantar ke dalamnya sebagai hujah.

Ia tidak dianggap sebagai amalan terbaik untuk menyimpan token dalam kod, jadi anda boleh menyimpannya dalam pembolehubah persekitaran dan membacanya daripadanya. Secara lalai dalam pakej telegram.bot Sokongan untuk pembolehubah persekitaran bagi nama berikut telah dilaksanakan: R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π... Sebaliknya ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π gantikan nama yang anda tentukan semasa mencipta, dalam kes saya ia akan menjadi pembolehubah R_TELEGRAM_BOT_My Test Bot.

Terdapat beberapa cara untuk mencipta pembolehubah persekitaran; Saya akan memberitahu anda tentang yang paling universal dan merentas platform. Buat dalam direktori rumah anda (anda boleh menemuinya menggunakan arahan path.expand("~")) fail teks dengan nama .Persekitaran. Anda juga boleh melakukan ini menggunakan arahan file.edit(path.expand(file.path("~", ".Renviron"))).

Dan tambahkan baris berikut kepadanya.

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

Seterusnya, anda boleh menggunakan token yang disimpan dalam pembolehubah persekitaran menggunakan fungsi tersebut bot_token(), iaitu seperti ini:

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

Kaedah getUpdates()membolehkan kami mendapatkan kemas kini bot, i.e. mesej yang dihantar kepadanya. Kaedah from_chat_id(), membolehkan anda mendapatkan ID sembang dari mana mesej itu dihantar. Kami memerlukan ID ini untuk menghantar mesej daripada bot.

Sebagai tambahan kepada id sembang dari objek yang diperolehi oleh kaedah getUpdates() anda juga menerima beberapa maklumat lain yang berguna. Contohnya, maklumat tentang pengguna yang menghantar mesej.

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"

Jadi, pada peringkat ini kami sudah mempunyai semua yang kami perlukan untuk menghantar mesej dari bot ke Telegram. Jom guna kaedah sendMessage(), yang mana anda perlu menghantar ID sembang, teks mesej dan jenis penanda teks mesej. Jenis markup boleh menjadi Markdown atau HTML dan ditetapkan oleh hujah parse_mode.

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

Asas pemformatan turun harga:

  • Fon tebal diserlahkan dengan *:
    • contoh: *ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ‚Ρ„*
    • hasil: fon tebal
  • Italic ditunjukkan dengan garis bawah:
    • contoh: _курсив_
    • hasil: huruf condong
  • Fon monospace, yang biasanya digunakan untuk menyerlahkan kod program, ditentukan menggunakan apostrof - `:
    • contoh: `fon ruang tunggal`
    • hasil: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Asas pemformatan markup HTML:
Dalam HTML, anda membalut bahagian teks yang perlu diserlahkan dalam teg, contohnya <Ρ‚Π΅Π³>тСкст</Ρ‚Π΅Π³>.

  • <tag> - teg pembukaan
  • - tag penutup

Tag markup HTML

  • <b> - fon tebal
    • contoh: <b>ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚</b>
    • mengakibatkan fon tebal
  • <i> - huruf condong
    • contoh: <i>курсив</i>
    • hasil: huruf condong
  • β€” ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • contoh: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
    • hasil: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Selain teks, anda boleh menghantar kandungan lain menggunakan kaedah khas:

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

Itu. contohnya menggunakan kaedah sendPhoto() anda boleh menghantar graf yang disimpan sebagai imej yang anda cipta menggunakan pakej tersebut ggplot2.

Menyemak Penjadual Tugas Windows dan menghantar pemberitahuan tentang tugas yang telah ditamatkan secara tidak normal

Untuk bekerja dengan Windows Task Scheduler anda perlu memasang pakej tersebut taskscheduleR, dan untuk kemudahan bekerja dengan data, pasang pakej dplyr.

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

Seterusnya, menggunakan fungsi taskscheduler_ls() kami meminta maklumat tentang tugas daripada penjadual kami. Menggunakan fungsi filter() daripada pakej dplyr Kami mengalih keluar daripada senarai tugasan yang berjaya disiapkan dan mempunyai status keputusan terakhir 0 dan tugasan yang tidak pernah dilancarkan dan mempunyai status 267011, tugasan yang dilumpuhkan dan tugasan yang sedang dijalankan.

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

Dalam objek task Kami kini mempunyai senarai tugas yang gagal, kami perlu menghantar senarai ini ke Telegram.

Jika kita melihat setiap arahan dengan lebih terperinci, maka:

  • filter() β€” menapis senarai tugas mengikut syarat yang diterangkan di atas
  • select() β€” meninggalkan hanya satu medan dalam jadual dengan nama tugasan
  • unique() - membuang nama pendua
  • unlist() β€” menukar lajur jadual yang dipilih kepada vektor
  • paste0() β€” menyambungkan nama tugas ke dalam satu baris, dan meletakkan suapan baris sebagai pemisah, i.e. n.

Apa yang tinggal untuk kami ialah menghantar keputusan ini melalui telegram.

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

Jadi, pada masa ini kod bot kelihatan seperti ini:

Kod bot semakan tugas

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

}

Apabila menggunakan contoh di atas, gantikan token bot anda dan ID sembang anda ke dalam kod.

Anda boleh menambah syarat untuk menapis tugas, contohnya, menyemak hanya tugasan yang anda buat, tidak termasuk tugasan sistem.

Anda juga boleh meletakkan pelbagai tetapan ke dalam fail konfigurasi yang berasingan, dan menyimpan id dan token sembang di dalamnya. Anda boleh membaca konfigurasi, contohnya, menggunakan pakej configr.

Contoh konfigurasi ini

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

Contoh membaca pembolehubah daripada konfigurasi dalam 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

Menyediakan jadual untuk menjalankan imbasan tugas

Proses menyediakan pelancaran skrip pada jadual diterangkan dengan lebih terperinci dalam perkara ini artikel. Di sini saya hanya akan menerangkan langkah-langkah yang perlu diikuti untuk ini. Jika mana-mana langkah tidak jelas kepada anda, rujuk artikel yang saya berikan pautannya.

Mari kita anggap bahawa kita telah menyimpan kod bot kita pada fail check_bot.R. Untuk menjadualkan fail ini berjalan dengan kerap, ikut langkah berikut:

  1. Tulis laluan ke folder di mana R dipasang dalam pembolehubah sistem Laluan; dalam Windows, laluannya akan menjadi seperti ini: C:Program FilesRR-4.0.2bin.
  2. Buat fail kelawar boleh laku dengan hanya satu baris R CMD BATCH C:rscriptscheck_botcheck_bot.R. Gantikan C:rscriptscheck_botcheck_bot.R ke laluan penuh ke fail R anda.
  3. Seterusnya, gunakan Windows Task Scheduler untuk menyediakan jadual pelancaran, contohnya, setiap setengah jam.

Kesimpulan

Dalam artikel ini, kami mengetahui cara membuat bot dan menggunakannya untuk menghantar pelbagai pemberitahuan dalam telegram.

Saya menerangkan tugas memantau Penjadual Tugas Windows, tetapi anda boleh menggunakan bahan dalam artikel ini untuk menghantar sebarang pemberitahuan, daripada ramalan cuaca kepada sebut harga saham di bursa saham, kerana R membolehkan anda menyambung kepada sejumlah besar sumber data.

Dalam artikel seterusnya, kami akan memikirkan cara menambah arahan dan papan kekunci pada bot supaya ia bukan sahaja boleh menghantar pemberitahuan, tetapi juga melakukan tindakan yang lebih kompleks.

Sumber: www.habr.com

Tambah komen