Chúng tôi viết bot telegram bằng ngôn ngữ R (phần 1): Tạo bot và gửi tin nhắn đến telegram bằng nó

Khán giả điện tín đang tăng lên theo cấp số nhân mỗi ngày, điều này được hỗ trợ bởi sự tiện lợi của trình nhắn tin, sự sẵn có của các kênh, cuộc trò chuyện và tất nhiên là khả năng tạo bot.

Bot có thể được sử dụng cho nhiều mục đích khác nhau, từ tự động giao tiếp với khách hàng của bạn đến quản lý các nhiệm vụ của riêng bạn.

Trên thực tế, thông qua bot, bạn có thể sử dụng telegram để thực hiện bất kỳ thao tác nào: gửi hoặc yêu cầu dữ liệu, chạy các tác vụ trên máy chủ, thu thập thông tin trong cơ sở dữ liệu, gửi email, v.v.

Tôi dự định viết một loạt bài về cách làm việc với R trong R. API bot điện tín, và viết bot cho nhu cầu của bạn.

Chúng tôi viết bot telegram bằng ngôn ngữ R (phần 1): Tạo bot và gửi tin nhắn đến telegram bằng nó

Trong bài viết đầu tiên này, chúng ta sẽ tìm hiểu cách tạo bot telegram và gửi thông báo tới telegram bằng cách sử dụng nó.

Do đó, chúng tôi sẽ có một bot sẽ kiểm tra trạng thái thực thi lần cuối của tất cả các tác vụ trong Bộ lập lịch tác vụ của Windows và gửi cho bạn thông báo nếu có bất kỳ lỗi nào.

Nhưng mục đích của loạt bài viết này không phải là hướng dẫn bạn cách viết bot cho một tác vụ cụ thể, hẹp, mà là giới thiệu cho bạn cú pháp của gói nói chung. telegram.botvà các ví dụ về mã mà bạn có thể viết bot để giải quyết các vấn đề của riêng mình.

nội dung

Nếu bạn quan tâm đến phân tích dữ liệu, bạn có thể quan tâm đến tôi điện tín и youtube kênh truyền hình. Hầu hết nội dung được dành cho ngôn ngữ R.

  1. Tạo một bot điện tín
  2. Cài đặt gói để làm việc với bot telegram trên R
  3. Gửi tin nhắn từ R đến Telegram
  4. Định cấu hình lịch khởi chạy quét tác vụ
  5. Kết luận

Tạo một bot điện tín

Đầu tiên, chúng ta cần tạo một bot. Điều này được thực hiện bằng cách sử dụng một bot đặc biệt bố bot, đi đến liên kết và viết thư cho bot /start.

Sau đó, bạn sẽ nhận được một tin nhắn với một danh sách các lệnh:

Tin nhắn từ 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

Để tạo một bot mới, hãy gửi lệnh /newbot.

BotFather sẽ yêu cầu bạn nhập tên và thông tin đăng nhập của bot.

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

Bạn có thể nhập một tên tùy ý và đăng nhập phải kết thúc bằng bot.

Nếu bạn đã làm đúng mọi thứ, bạn sẽ nhận được thông báo sau:

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

Tiếp theo, bạn sẽ cần mã thông báo API đã nhận, trong ví dụ của tôi là 123456789:abcdefghijklmnopqrstuvwxyz.

Đến bước này, công việc chuẩn bị để tạo bot đã hoàn tất.

Cài đặt gói để làm việc với bot telegram trên R

Tôi cho rằng bạn đã cài đặt ngôn ngữ R và môi trường phát triển RStudio. Nếu đây không phải là trường hợp, thì bạn có thể xem cái này video hướng dẫn về cách cài đặt chúng.

Để làm việc với Telegram Bot API, chúng tôi sẽ sử dụng gói R điện tín.bot.

Việc cài đặt các gói trong R được thực hiện bởi hàm install.packages(), vì vậy để cài đặt gói chúng ta cần, hãy sử dụng lệnh install.packages("telegram.bot").

Để biết thêm thông tin về cách cài đặt các gói khác nhau, hãy xem Video này.

Sau khi cài đặt gói, bạn cần kết nối nó:

library(telegram.bot)

Gửi tin nhắn từ R đến Telegram

Có thể tìm thấy bot bạn đã tạo trong Telegram bằng cách sử dụng thông tin đăng nhập được chỉ định trong quá trình tạo, trong trường hợp của tôi, đó là @my_test_bot.

Gửi bất kỳ tin nhắn nào tới bot, chẳng hạn như "Xin chào bot". Hiện tại, chúng tôi cần điều này để lấy id cuộc trò chuyện của bạn với bot.

Bây giờ trong R, chúng tôi viết đoạn mã sau.

library(telegram.bot)

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

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

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

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

Ban đầu, chúng tôi tạo một phiên bản bot của mình với chức năng Bot(), làm đối số, bạn phải chuyển mã thông báo đã nhận trước đó cho nó.

Lưu trữ mã thông báo trong mã được coi là thông lệ không tốt, vì vậy bạn có thể lưu trữ mã thông báo trong một biến môi trường và đọc mã từ đó. Theo mặc định trong gói telegram.bot hỗ trợ đã triển khai cho các biến môi trường có tên sau: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Thay vì ИМЯ_ВАШЕГО_БОТА thay thế tên mà bạn đặt khi tạo, trong trường hợp của tôi, nó sẽ là một biến R_TELEGRAM_BOT_My Test Bot.

Bạn có thể tạo một biến môi trường theo nhiều cách, tôi sẽ nói về cách phổ biến nhất và đa nền tảng. Tạo trong thư mục chính của bạn (bạn có thể tìm thấy nó bằng lệnh path.expand("~")) tệp văn bản có tên .viron. Bạn cũng có thể làm điều này với lệnh file.edit(path.expand(file.path("~", ".Renviron"))).

Và thêm dòng sau vào nó.

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

Sau đó, bạn có thể sử dụng mã thông báo được lưu trữ trong biến môi trường với chức năng bot_token(), I E. như thế này:

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

Phương thức getUpdates()cho phép chúng tôi nhận các bản cập nhật bot, tức là tin nhắn gửi đến anh. Phương pháp from_chat_id(), cho phép bạn lấy ID của cuộc trò chuyện mà tin nhắn được gửi từ đó. Chúng tôi cần số nhận dạng này để gửi tin nhắn từ bot.

Ngoài id trò chuyện từ đối tượng nhận được bằng phương thức getUpdates() bạn cũng nhận được một số thông tin hữu ích khác. Ví dụ: thông tin về người dùng đã gửi tin nhắn.

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"

Vì vậy, ở giai đoạn này, chúng tôi đã có mọi thứ cần thiết để gửi tin nhắn từ bot đến điện tín. Hãy sử dụng phương pháp sendMessage(), mà bạn cần chuyển ID trò chuyện, nội dung tin nhắn và loại đánh dấu của nội dung tin nhắn. Loại đánh dấu có thể là Markdown hoặc HTML và được đặt theo đối số parse_mode.

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

Khái niệm cơ bản về định dạng Markdown:

  • Phông chữ đậm được đánh dấu *:
    • Ví dụ: *жирный шритф*
    • kết quả: chữ in đậm
  • Chữ nghiêng được đưa ra bởi dấu gạch dưới:
    • Ví dụ: _курсив_
    • kết quả: chữ in nghiêng
  • Phông chữ không gian cố định, thường được sử dụng để làm nổi bật mã chương trình, được chỉ định bằng dấu nháy đơn - `:
    • ví dụ: `phông chữ đơn cách`
    • kết quả: моноширинный шрифт

Khái niệm cơ bản về định dạng đánh dấu HTML:
Trong HTML, bạn bọc phần văn bản bạn muốn làm nổi bật trong các thẻ, ví dụ <тег>текст</тег>.

  • <tag> — thẻ mở
  • - thẻ đóng

Thẻ đánh dấu HTML

  • <b> - kiểu chữ in đậm
    • Ví dụ: <b>жирный шрифт</b>
    • kết quả kiểu chữ in đậm
  • <i> - chữ in nghiêng
    • Ví dụ: <i>курсив</i>
    • kết quả: chữ in nghiêng
  • — моноширинный шрифт
    • ví dụ: моноширинный шрифт
    • kết quả: моноширинный шрифт

Ngoài văn bản, bạn có thể gửi nội dung khác bằng các phương thức đặc biệt:

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

Những thứ kia. ví dụ sử dụng phương pháp sendPhoto() bạn có thể gửi một cốt truyện được lưu dưới dạng hình ảnh mà bạn đã tạo bằng gói ggplot2.

Kiểm tra Trình lập lịch tác vụ Windows và gửi thông báo về các tác vụ đã bị lỗi

Để làm việc với Windows Task Scheduler, bạn cần cài đặt gói taskscheduleRvà để thuận tiện khi làm việc với dữ liệu, hãy cài đặt gói dplyr.

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

Tiếp theo, sử dụng chức năng taskscheduler_ls() chúng tôi yêu cầu thông tin về các nhiệm vụ từ bộ lập lịch của chúng tôi. Sử dụng chức năng filter() từ gói dplyr chúng tôi xóa khỏi danh sách các tác vụ đã hoàn thành thành công và có trạng thái kết quả cuối cùng là 0 và những tác vụ chưa bao giờ được chạy và có trạng thái 267011, các tác vụ đã vô hiệu hóa và các tác vụ hiện đang chạy.

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

trong đối tượng task bây giờ chúng tôi có một danh sách các tác vụ có lỗi kết thúc công việc, chúng tôi cần gửi danh sách này tới Telegram.

Nếu chúng ta xem xét từng lệnh chi tiết hơn, thì:

  • filter() — lọc danh sách các nhiệm vụ theo các điều kiện được mô tả ở trên
  • select() - chỉ để lại một trường có tên của các nhiệm vụ trong bảng
  • unique() - xóa tên trùng lặp
  • unlist() - dịch cột bảng đã chọn thành một vectơ
  • paste0() - kết nối tên của các tác vụ thành một dòng và đặt một ký tự dòng mới làm dấu phân cách, tức là n.

Tất cả những gì còn lại đối với chúng tôi là gửi kết quả này đến điện tín.

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

Vì vậy, tại thời điểm mã bot trông như thế này:

Mã bot kiểm tra tác vụ

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

}

Khi sử dụng ví dụ trên, hãy thay thế mã thông báo bot và ID trò chuyện của bạn vào mã.

Bạn có thể thêm các điều kiện lọc tác vụ, chẳng hạn như chỉ kiểm tra những tác vụ do bạn tạo, ngoại trừ các tác vụ hệ thống.

Bạn cũng có thể đặt các cài đặt khác nhau trong một tệp cấu hình riêng và lưu id trò chuyện cũng như mã thông báo trong đó. Bạn có thể đọc cấu hình, ví dụ, sử dụng gói configr.

Ví dụ cấu hình ini

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

Ví dụ về đọc các biến từ cấu hình trong 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

Thiết lập lịch khởi chạy quét tác vụ

Quá trình định cấu hình khởi chạy tập lệnh theo lịch trình được mô tả chi tiết hơn trong phần này Bài viết. Ở đây tôi sẽ chỉ mô tả các bước phải được tuân theo cho việc này. Nếu bất kỳ bước nào không rõ ràng đối với bạn, thì hãy tham khảo bài viết mà tôi đã cung cấp liên kết.

Giả sử chúng tôi lưu mã bot của mình vào một tệp check_bot.R. Để lên lịch chạy tệp này thường xuyên, hãy làm theo các bước sau:

  1. Viết đường dẫn đến thư mục đã cài đặt R trong biến hệ thống Đường dẫn, trên Windows đường dẫn sẽ giống như sau: C:Program FilesRR-4.0.2bin.
  2. Tạo một tệp bat thực thi chỉ với một dòng R CMD BATCH C:rscriptscheck_botcheck_bot.R. Thay thế C:rscriptscheck_botcheck_bot.R đến đường dẫn đầy đủ đến tệp R của bạn.
  3. Tiếp theo, sử dụng Windows Task Scheduler để đặt lịch khởi động, chẳng hạn như cứ sau nửa giờ.

Kết luận

Trong bài viết này, chúng tôi đã tìm ra cách tạo bot và sử dụng nó để gửi các thông báo khác nhau đến telegram.

Tôi đã mô tả nhiệm vụ giám sát Trình lập lịch tác vụ của Windows, nhưng bạn có thể sử dụng tài liệu trong bài viết này để gửi bất kỳ thông báo nào, từ dự báo thời tiết đến báo giá chứng khoán trên sàn giao dịch chứng khoán, bởi vì. R cho phép bạn kết nối với một số lượng lớn nguồn dữ liệu.

Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu cách thêm lệnh và bàn phím vào bot để nó không chỉ gửi thông báo mà còn thực hiện các hành động phức tạp hơn.

Nguồn: www.habr.com

Thêm một lời nhận xét