我們用 R 語言編寫一個 telegram 機器人(第 1 部分):創建一個機器人並使用它向 telegram 發送消息

Telegram 的受眾每天都呈指數級增長,這得益於通訊工具的便利性、頻道的存在、聊天,當然還有創建機器人的能力。

機器人可用於完全不同的目的,從與客戶的自動通訊到管理您自己的任務。

本質上,您可以使用 telegram 透過機器人執行任何操作:發送或請求資料、在伺服器上運行任務、將資訊收集到資料庫、發送電子郵件等。

我計劃寫一系列關於如何使用 電報機器人 API,並編寫機器人來滿足您的需求。

我們用 R 語言編寫一個 telegram 機器人(第 1 部分):創建一個機器人並使用它向 telegram 發送消息

在第一篇文章中,我們將了解如何建立電報機器人並使用它在電報中發送通知。

因此,我們將有一個機器人來檢查 Windows 任務計劃程式中所有任務的上次執行狀態,並在其中任何任務失敗時向您發送通知。

但本系列文章的目的不是教您如何為特定的、狹窄的任務編寫機器人,而是一般性地向您介紹包的語法 telegram.bot,以及您可以用來編寫機器人來解決您自己的問題的程式碼範例。

Содержание

如果您對數據分析感興趣,您可能會對我的文章感興趣 電報 и YouTube的 渠道。 大部分內容專門介紹 R 語言。

  1. 創建電報機器人
  2. 安裝用於在 R 中使用電報機器人的軟體包
  3. 從 R 發送訊息到 Telegram
  4. 設定運行任務掃描的計劃
  5. 結論

創建電報機器人

首先,我們需要創建一個機器人。 這是使用特殊的機器人完成的 殭屍之父, 去 鏈接 並寫入機器人 /start.

之後您將收到一條包含命令清單的訊息:

來自 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

要建立新機器人,請發送命令 /newbot.

BotFather 會要求您輸入機器人的名稱和登入名稱。

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

您可以輸入任何名稱,但登入名稱必須以 bot.

如果您正確執行了所有操作,您將收到以下訊息:

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

接下來您將需要收到的 API 令牌,在我的範例中是 123456789:abcdefghijklmnopqrstuvwxyz.

到這一步,創建bot的準備工作就完成了。

安裝用於在 R 中使用電報機器人的軟體包

我假設您已經安裝了R語言和RStudio開發環境。 如果不是這種情況,那麼你可以看看這個 視訊課 關於如何安裝它們。

為了使用 Telegram Bot API,我們將使用 R 套件 電報機器人.

在 R 中安裝套件是使用該函數完成的 install.packages(),所以要安裝我們需要的套件,使用命令 install.packages("telegram.bot").

您可以了解有關安裝各種軟體包的更多信息 這個視頻.

安裝套件後,您需要連接它:

library(telegram.bot)

從 R 發送訊息到 Telegram

您創建的機器人可以使用創建期間指定的登入名稱在 Telegram 中找到,在我的例子中是 @my_test_bot.

向機器人發送任何訊息,例如“嘿機器人”。 目前,我們需要它來獲取您與機器人聊天的 ID。

現在我們在 R 中編寫以下程式碼。

library(telegram.bot)

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

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

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

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

最初,我們使用以下函數建立機器人的實例 Bot(),先前收到的令牌必須作為參數傳遞給它。

將令牌儲存在程式碼中不被認為是最佳實踐,因此您可以將其儲存在環境變數中並從中讀取。 預設在包中 telegram.bot 已實現對以下名稱的環境變數的支援: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА。 代替 ИМЯ_ВАШЕГО_БОТА 替換您在創建時指定的名稱,在我的例子中它將是一個變數 R_TELEGRAM_BOT_My Test Bot.

創建環境變數的方法有多種;我將告訴您最通用和跨平台的一種。 在你的主目錄中創建(你可以使用命令找到它 path.expand("~")) 具有名稱的文字文件 .Renviron。 您也可以使用命令來執行此操作 file.edit(path.expand(file.path("~", ".Renviron"))).

並在其中加入以下行。

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

接下來,您可以使用函數使用儲存在環境變數中的令牌 bot_token(), IE。 像這樣:

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

方法 getUpdates()允許我們獲取機器人更新,即發送給他的訊息。 方法 from_chat_id(),允許您取得發送訊息的聊天的 ID。 我們需要這個 ID 來從機器人發送訊息。

另外從該方法取得的物件中的chat id getUpdates() 您還會收到一些其他有用的信息。 例如,有關發送訊息的用戶的資訊。

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"

因此,現階段我們已經擁有從機器人向 Telegram 發送訊息所需的一切。 讓我們使用該方法 sendMessage(),您需要向其中傳遞聊天 ID、訊息文字和訊息文字標記類型。 標記類型可以是 Markdown 或 HTML,由參數設定 parse_mode.

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

Markdown 格式基礎知識:

  • 粗體字體以 * 反白顯示:
    • 例如: *жирный шритф*
    • 結果: 粗體
  • 斜體以底線表示:
    • 例如: _курсив_
    • 結果: 斜體字
  • 等寬字體通常用於突出顯示程式程式碼,使用撇號 - ` 指定:
    • 範例:`等寬字體`
    • 結果: моноширинный шрифт

HTML 標記格式的基礎知識:
在 HTML 中,您將需要突出顯示的文字部分包裝在標籤中,例如 <тег>текст</тег>.

  • <tag> - 開始標籤
  • - 結束標籤

HTML 標記

  • <b> - 粗體
    • 例如: <b>жирный шрифт</b>
    • 導致 粗體
  • <i> - 斜體
    • 例如: <i>курсив</i>
    • 結果: 斜體字
  • — моноширинный шрифт
    • 範例: моноширинный шрифт
    • 結果: моноширинный шрифт

除了文字之外,您還可以使用特殊方法發送其他內容:

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

那些。 例如使用該方法 sendPhoto() 您可以傳送使用該套件建立的另存為圖像的圖表 ggplot2.

檢查 Windows 工作排程器並發送有關異常終止的任務的通知

要使用 Windows 工作排程程序,您需要安裝該軟體包 taskscheduleR,並且為了方便處理數據,安裝該套件 dplyr.

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

接下來,使用函數 taskscheduler_ls() 我們向調度程序請求有關任務的資訊。 使用功能 filter() 從包裝中 dplyr 我們從任務清單中刪除那些已成功完成且最後結果狀態為 0 的任務、那些從未啟動且狀態為 267011 的任務、已停用的任務以及目前正在執行的任務。

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

在物件中 task 現在我們有了失敗任務的列表,我們需要將此列表發送到 Telegram。

如果我們更詳細地查看每個命令,那麼:

  • filter() — 根據上述條件過濾任務列表
  • select() — 表中僅留下一個包含任務名稱的字段
  • unique() - 刪除重複的名稱
  • unlist() — 將選取的表格列轉換為向量
  • paste0() — 將任務名稱連接成一行,並以換行符作為分隔符,即 n.

我們剩下的就是透過電報發送此結果。

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

因此,目前機器人程式碼如下所示:

任務審核機器人程式碼

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

}

使用上面的範例時,請將您的機器人令牌和聊天 ID 替換到程式碼中。

您可以新增過濾任務的條件,例如只檢查您建立的任務,排除系統任務。

您也可以將各種設定放入單獨的設定檔中,並將聊天 ID 和令牌儲存在其中。 您可以讀取配置,例如使用套件 configr.

ini 設定範例

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

從 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

設定運行任務掃描的計劃

設定按計劃啟動腳本的過程在此中有更詳細的描述。 文章。 這裡我只描述為此需要遵循的步驟。 如果您不清楚任何步驟,請參閱我提供連結的文章。

假設我們將機器人程式碼儲存到一個檔案中 check_bot.R。 若要安排此文件定期運行,請按照下列步驟操作:

  1. 將安裝 R 的資料夾的路徑寫入 Path 系統變數;在 Windows 中,路徑將如下所示: C:Program FilesRR-4.0.2bin.
  2. 只需一行即可建立可執行bat文件 R CMD BATCH C:rscriptscheck_botcheck_bot.R. 代替 C:rscriptscheck_botcheck_bot.R 到 R 檔案的完整路徑。
  3. 接下來,使用 Windows 任務計劃程式設定啟動計劃,例如每半小時一次。

結論

在本文中,我們了解如何建立機器人並使用它在電報中發送各種通知。

我描述了監視 Windows 任務規劃程式的任務,但您可以使用本文中的資料發送任何通知,從天氣預報到證券交易所的股票報價,因為R 讓您連接到大量資料來源。

在下一篇文章中,我們將了解如何為機器人添加命令和鍵盤,以便它不僅可以發送通知,還可以執行更複雜的操作。

來源: www.habr.com

添加評論