Menulis bot telegram di R (bagian 1): Membuat bot dan menggunakannya untuk mengirim pesan di telegram

Pemirsa Telegram tumbuh secara eksponensial setiap hari, hal ini difasilitasi oleh kenyamanan messenger, kehadiran saluran, obrolan, dan tentu saja kemampuan membuat bot.

Bot dapat digunakan untuk tujuan yang sangat berbeda, mulai dari mengotomatiskan komunikasi dengan pelanggan hingga mengelola tugas Anda sendiri.

Pada dasarnya, Anda dapat menggunakan telegram untuk melakukan operasi apa pun melalui bot: mengirim atau meminta data, menjalankan tugas di server, mengumpulkan informasi ke dalam database, mengirim email, dan sebagainya.

Saya berencana untuk menulis serangkaian artikel tentang cara bekerja dengannya API bot telegram, dan tulis bot sesuai kebutuhan Anda.

Menulis bot telegram di R (bagian 1): Membuat bot dan menggunakannya untuk mengirim pesan di telegram

Pada artikel pertama ini kita akan mengetahui cara membuat bot telegram dan menggunakannya untuk mengirim notifikasi di telegram.

Hasilnya, kami akan memiliki bot yang akan memeriksa status eksekusi terakhir semua tugas di Penjadwal Tugas Windows, dan mengirimi Anda pemberitahuan jika ada yang gagal.

Namun tujuan dari rangkaian artikel ini bukan untuk mengajari Anda cara menulis bot untuk tugas yang spesifik dan sempit, tetapi untuk memperkenalkan Anda secara umum pada sintaksis paket. telegram.bot, dan contoh kode yang dapat digunakan untuk menulis bot untuk menyelesaikan masalah Anda sendiri.

kadar

Jika Anda tertarik dengan analisis data, Anda mungkin tertarik dengan saya Telegram ΠΈ Youtube saluran. Sebagian besar konten didedikasikan untuk bahasa R.

  1. Membuat bot telegram
  2. Menginstal paket untuk bekerja dengan bot telegram di R
  3. Mengirim pesan dari R ke Telegram
  4. Menyiapkan jadwal untuk menjalankan pemindaian tugas
  5. Kesimpulan

Membuat bot telegram

Pertama, kita perlu membuat bot. Ini dilakukan dengan menggunakan bot khusus ayah kedua, pergi ke link dan menulis ke bot /start.

Setelah itu Anda akan menerima pesan dengan daftar perintah:

Pesan dari Ayah Bot

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 baru, kirimkan perintah /newbot.

Botfather akan meminta Anda memasukkan nama bot dan 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

Anda dapat memasukkan nama apa pun, tetapi login harus diakhiri dengan bot.

Jika Anda melakukan semuanya dengan benar, Anda akan menerima pesan 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

Selanjutnya Anda memerlukan token API yang diterima, dalam contoh saya 123456789:abcdefghijklmnopqrstuvwxyz.

Pada langkah ini, pekerjaan persiapan untuk membuat bot selesai.

Menginstal paket untuk bekerja dengan bot telegram di R

Saya berasumsi Anda sudah menginstal bahasa R dan lingkungan pengembangan RStudio. Jika tidak demikian, Anda dapat melihatnya pelajaran video tentang cara menginstalnya.

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

Menginstal paket di R dilakukan dengan menggunakan fungsi install.packages(), jadi untuk menginstal paket yang kita perlukan, gunakan perintah install.packages("telegram.bot").

Anda dapat mempelajari lebih lanjut tentang menginstal berbagai paket dari video ini.

Setelah menginstal paket, Anda perlu menghubungkannya:

library(telegram.bot)

Mengirim pesan dari R ke Telegram

Bot yang Anda buat dapat ditemukan di Telegram menggunakan login yang ditentukan saat pembuatan, dalam kasus saya demikian @my_test_bot.

Kirimkan pesan apa pun kepada bot, seperti "Hai bot". Saat ini, kami memerlukannya untuk mendapatkan id obrolan Anda dengan bot.

Sekarang kita menulis kode berikut di R.

library(telegram.bot)

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

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

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

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

Awalnya, kami membuat instance bot kami dengan fungsi tersebut Bot(), token yang diterima sebelumnya harus diteruskan ke dalamnya sebagai argumen.

Menyimpan token dalam kode bukanlah praktik terbaik, sehingga Anda dapat menyimpannya dalam variabel lingkungan dan membacanya. Secara default dalam paket telegram.bot Dukungan untuk variabel lingkungan dengan nama berikut telah diterapkan: R_TELEGRAM_BOT_ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π... Dari pada ИМЯ_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π gantikan nama yang Anda tentukan saat membuat, dalam kasus saya itu akan menjadi variabel R_TELEGRAM_BOT_My Test Bot.

Ada beberapa cara untuk membuat variabel lingkungan, saya akan memberi tahu Anda tentang cara yang paling universal dan lintas platform. Buat di direktori home Anda (Anda dapat menemukannya menggunakan perintah path.expand("~")) file teks dengan nama .Renviron. Anda juga dapat melakukan ini menggunakan perintah file.edit(path.expand(file.path("~", ".Renviron"))).

Dan tambahkan baris berikut ke dalamnya.

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

Selanjutnya, Anda dapat menggunakan token yang disimpan dalam variabel lingkungan menggunakan fungsi tersebut bot_token(), yaitu. seperti ini:

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

metode getUpdates()memungkinkan kita mendapatkan pembaruan bot, mis. pesan-pesan yang dikirimkan kepadanya. metode from_chat_id(), memungkinkan Anda mendapatkan ID obrolan tempat pesan dikirim. Kami membutuhkan ID ini untuk mengirim pesan dari bot.

Selain id chat dari objek yang diperoleh dengan metode tersebut getUpdates() Anda juga menerima beberapa informasi berguna lainnya. Misalnya informasi tentang pengguna yang mengirim pesan.

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 tahap ini kita sudah memiliki semua yang kita perlukan untuk mengirim pesan dari bot ke Telegram. Ayo gunakan metode ini sendMessage(), yang mana Anda harus meneruskan ID obrolan, teks pesan, dan jenis markup teks pesan. Jenis markup dapat berupa Markdown atau HTML dan ditentukan oleh argumen parse_mode.

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

Dasar-dasar pemformatan penurunan harga:

  • Font tebal disorot dengan *:
    • contoh: *ΠΆΠΈΡ€Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ‚Ρ„*
    • hasil: Huruf tebal
  • Huruf miring ditandai dengan garis bawah:
    • contoh: _курсив_
    • hasil: huruf miring
  • Font monospace, yang biasanya digunakan untuk menyorot kode program, ditentukan menggunakan apostrof - `:
    • contoh: `font monospace`
    • hasil: ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚

Dasar-dasar memformat markup HTML:
Dalam HTML, Anda membungkus bagian teks yang perlu disorot dalam tag, misalnya <Ρ‚Π΅Π³>тСкст</Ρ‚Π΅Π³>.

  • <tag> - tag pembuka
  • - tanda penutup

Tag markup HTML

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

Selain teks, Anda dapat mengirim konten lain menggunakan metode khusus:

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
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. misalnya menggunakan metode sendPhoto() Anda dapat mengirim grafik yang disimpan sebagai gambar yang Anda buat menggunakan paket ggplot2.

Memeriksa Penjadwal Tugas Windows dan mengirimkan pemberitahuan tentang tugas yang dihentikan secara tidak normal

Untuk bekerja dengan Penjadwal Tugas Windows, Anda perlu menginstal paketnya taskscheduleR, dan untuk kenyamanan bekerja dengan data, instal paketnya dplyr.

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

Selanjutnya, menggunakan fungsi tersebut taskscheduler_ls() kami meminta informasi tentang tugas dari penjadwal kami. Menggunakan fungsi filter() dari paket dplyr Kami menghapus dari daftar tugas yang berhasil diselesaikan dan memiliki status hasil terakhir 0, dan tugas yang belum pernah diluncurkan dan berstatus 267011, tugas yang dinonaktifkan, dan tugas yang sedang berjalan.

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

Di dalam objek task Kami sekarang memiliki daftar tugas yang gagal, kami perlu mengirimkan daftar ini ke Telegram.

Jika kita melihat setiap perintah lebih detail, maka:

  • filter() β€” memfilter daftar tugas berdasarkan kondisi yang dijelaskan di atas
  • select() β€” hanya menyisakan satu bidang di tabel dengan nama tugas
  • unique() - menghapus nama duplikat
  • unlist() β€” mengonversi kolom tabel yang dipilih menjadi vektor
  • paste0() β€” menghubungkan nama-nama tugas ke dalam satu baris, dan menempatkan umpan baris sebagai pemisah, mis. n.

Yang tersisa bagi kami hanyalah mengirimkan hasil ini melalui telegram.

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

Jadi, saat ini kode botnya terlihat seperti ini:

Kode bot peninjauan 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"
  )

}

Saat menggunakan contoh di atas, gantikan token bot dan ID chat Anda ke dalam kode.

Anda dapat menambahkan ketentuan untuk memfilter tugas, misalnya, hanya memeriksa tugas yang Anda buat, tidak termasuk tugas sistem.

Anda juga dapat memasukkan berbagai pengaturan ke dalam file konfigurasi terpisah, dan menyimpan id obrolan dan token di dalamnya. Anda dapat membaca konfigurasinya, misalnya menggunakan paket configr.

Contoh konfigurasi ini

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

Contoh membaca variabel dari konfigurasi di 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

Menyiapkan jadwal untuk menjalankan pemindaian tugas

Proses pengaturan peluncuran skrip sesuai jadwal dijelaskan lebih detail di sini Artikel. Disini saya hanya akan menjelaskan langkah-langkah yang perlu diikuti untuk itu. Jika ada langkah yang tidak jelas bagi Anda, lihat artikel yang saya berikan tautannya.

Mari kita asumsikan bahwa kita menyimpan kode bot kita ke sebuah file check_bot.R. Untuk menjadwalkan file ini agar berjalan secara rutin, ikuti langkah-langkah berikut:

  1. Tulis path ke folder tempat R diinstal di variabel sistem Path; di Windows, pathnya akan seperti ini: C:Program FilesRR-4.0.2bin.
  2. Buat file bat yang dapat dieksekusi hanya dengan satu baris R CMD BATCH C:rscriptscheck_botcheck_bot.R. Mengganti C:rscriptscheck_botcheck_bot.R ke path lengkap ke file R Anda.
  3. Selanjutnya, gunakan Windows Task Scheduler untuk mengatur jadwal peluncuran, misalnya setiap setengah jam.

Kesimpulan

Pada artikel ini, kami menemukan cara membuat bot dan menggunakannya untuk mengirim berbagai notifikasi di telegram.

Saya telah menjelaskan tugas memantau Penjadwal Tugas Windows, tetapi Anda dapat menggunakan materi dalam artikel ini untuk mengirimkan pemberitahuan apa pun, mulai dari ramalan cuaca hingga harga saham di bursa, karena R memungkinkan Anda terhubung ke sejumlah besar sumber data.

Pada artikel selanjutnya, kita akan mengetahui cara menambahkan perintah dan keyboard ke bot sehingga tidak hanya dapat mengirim notifikasi, tetapi juga melakukan tindakan yang lebih kompleks.

Sumber: www.habr.com

Tambah komentar