Telegram 的受众每天都在呈指数级增长,这得益于通讯工具的便利性、频道的存在、聊天,当然还有创建机器人的能力。
机器人可用于完全不同的目的,从与客户的自动通信到管理您自己的任务。
本质上,您可以使用 telegram 通过机器人执行任何操作:发送或请求数据、在服务器上运行任务、将信息收集到数据库、发送电子邮件等。
我计划写一系列关于如何使用
在第一篇文章中,我们将了解如何创建电报机器人并使用它在电报中发送通知。
因此,我们将有一个机器人来检查 Windows 任务计划程序中所有任务的上次执行状态,并在其中任何任务失败时向您发送通知。
但本系列文章的目的不是教您如何为特定的、狭窄的任务编写机器人,而是一般性地向您介绍包的语法 telegram.bot
,以及您可以用来编写机器人来解决您自己的问题的代码示例。
内容
如果您对数据分析感兴趣,您可能会对我的文章感兴趣
创建电报机器人
首先,我们需要创建一个机器人。 这是使用特殊的机器人完成的 僵尸之父, 去 /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
。 要安排此文件定期运行,请按照下列步骤操作:
- 将安装 R 的文件夹的路径写入 Path 系统变量;在 Windows 中,该路径将如下所示:
C:Program FilesRR-4.0.2bin
. - 只需一行即可创建可执行bat文件
R CMD BATCH C:rscriptscheck_botcheck_bot.R
. 代替C:rscriptscheck_botcheck_bot.R
到 R 文件的完整路径。 - 接下来,使用 Windows 任务计划程序设置启动计划,例如每半小时一次。
结论
在本文中,我们了解了如何创建机器人并使用它在电报中发送各种通知。
我描述了监视 Windows 任务计划程序的任务,但您可以使用本文中的材料发送任何通知,从天气预报到证券交易所的股票报价,因为R 允许您连接到大量数据源。
在下一篇文章中,我们将了解如何向机器人添加命令和键盘,以便它不仅可以发送通知,还可以执行更复杂的操作。
来源: habr.com