在 R 中编写电报机器人(第 1 部分):创建机器人并使用它在电报中发送消息

Telegram 的受众每天都在呈指数级增长,这得益于通讯工具的便利性、频道的存在、聊天,当然还有创建机器人的能力。

机器人可用于完全不同的目的,从与客户的自动通信到管理您自己的任务。

本质上,您可以使用 telegram 通过机器人执行任何操作:发送或请求数据、在服务器上运行任务、将信息收集到数据库、发送电子邮件等。

我计划写一系列关于如何使用 电报机器人 API,并编写机器人来满足您的需求。

在 R 中编写电报机器人(第 1 部分):创建机器人并使用它在电报中发送消息

在第一篇文章中,我们将了解如何创建电报机器人并使用它在电报中发送通知。

因此,我们将有一个机器人来检查 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 允许您连接到大量数据源。

在下一篇文章中,我们将了解如何向机器人添加命令和键盘,以便它不仅可以发送通知,还可以执行更复杂的操作。

来源: habr.com

添加评论