r - 如何使用 slackr 改进 slack 消息的格式?
问题描述
我正在使用 slackr 向 Slack 频道发送警报消息。它工作得很好,除了消息格式不是很好,我想改进它。
install_github("hrbrmstr/slackr")
library(slackr)
slackr_setup(channel="#alerts", username="Mark Davis",
incoming_webhook_url = "https://hooks.slack.com/services/T31P8UDAB/BCH4HKQSC/*********",
api_token = "*********", echo = F)
alert="On Monday, 2018-09-03 @ 2pm Pacific..."
slackr(alert)
以下是来自 slackr 的消息在 Slack 中的外观示例:
这是我希望它看起来如何的示例:
slackr 在格式化的方式上似乎没有太多选择。我正在考虑构建一个图像并插入它,但是我在使用 R 从文本文件中构建图像时遇到了麻烦。
也许我可以调用另一个 api 来获取我的文本并将其格式化为松弛?
我愿意接受任何建议。
附录:Slackr 有一个上传文件的选项,所以我最近的尝试是从文本消息中创建一个图像并上传该对象。
我可以使用 magick 库从文本消息中创建一个 png 文件。我创建了一个带有彩色背景的图像,我只是将消息文本添加到图像中:
library(magick)
alert_picture <- image_read('alert_480x150_dark_red.png')
alert_picture=image_annotate(alert_picture, DreamCloud_Alert, size = 20, gravity = "southwest",
color = "white", location = "+10+10")
image_write(alert_picture, path = "alert_picture.png", format = "png")
图片看起来很不错(虽然似乎没有一种简单的方法可以在消息中加粗或下划线),但现在的障碍是我无法让上传命令工作。
slackr_upload(filename = "alert_picture.png")
我没有收到任何错误消息,但没有任何内容上传到 slack。
解决方案
我不确定这是否是您的意思,但是我通过更改slackr_bot()
函数并仅删除代码末尾显示文本的 2 组 3 个反引号解决了允许像在常规松弛消息中一样格式化的问题。然后只需调用它slackr_bot1()
或其他东西,然后您就可以发布格式化的消息。这是删除反引号后的功能:
slackr_bot1 <- function(...,
channel=Sys.getenv("SLACK_CHANNEL"),
username=Sys.getenv("SLACK_USERNAME"),
icon_emoji=Sys.getenv("SLACK_ICON_EMOJI"),
incoming_webhook_url=Sys.getenv("SLACK_INCOMING_URL_PREFIX")) {
if (incoming_webhook_url == "") {
stop("No incoming webhook URL specified. Did you forget to call slackr_setup()?", call. = FALSE)
}
if (icon_emoji != "") { icon_emoji <- sprintf(', "icon_emoji": "%s"', icon_emoji) }
resp_ret <- ""
if (!missing(...)) {
# mimics capture.output
# get the arglist
args <- substitute(list(...))[-1L]
# setup in-memory sink
rval <- NULL
fil <- textConnection("rval", "w", local = TRUE)
sink(fil)
on.exit({
sink()
close(fil)
})
# where we'll need to eval expressions
pf <- parent.frame()
# how we'll eval expressions
evalVis <- function(expr) withVisible(eval(expr, pf))
# for each expression
for (i in seq_along(args)) {
expr <- args[[i]]
# do something, note all the newlines...Slack ``` needs them
tmp <- switch(mode(expr),
# if it's actually an expresison, iterate over it
expression = {
cat(sprintf("> %s\n", deparse(expr)))
lapply(expr, evalVis)
},
# if it's a call or a name, eval, printing run output as if in console
call = ,
name = {
cat(sprintf("> %s\n", deparse(expr)))
list(evalVis(expr))
},
# if pretty much anything else (i.e. a bare value) just output it
integer = ,
double = ,
complex = ,
raw = ,
logical = ,
numeric = cat(sprintf("%s\n\n", as.character(expr))),
character = cat(sprintf("%s\n\n", expr)),
stop("mode of argument not handled at present by slackr"))
for (item in tmp) if (item$visible) { print(item$value, quote = FALSE); cat("\n") }
}
on.exit()
sink()
close(fil)
# combined all of them (rval is a character vector)
output <- paste0(rval, collapse="\n")
loc <- Sys.getlocale('LC_CTYPE')
Sys.setlocale('LC_CTYPE','C')
on.exit(Sys.setlocale("LC_CTYPE", loc))
resp <- POST(url = incoming_webhook_url, encode = "form",
add_headers(`Content-Type` = "application/x-www-form-urlencoded",
Accept = "*/*"), body = URLencode(sprintf("payload={\"channel\": \"%s\", \"username\": \"%s\", \"text\": \"%s\"%s}",
channel, username, output, icon_emoji)))
warn_for_status(resp)
}
return(invisible())
}
slackr_bot1("*test* on time")
推荐阅读
- javascript - Vanilla Js 和 AWS Cognito (AWS Amplify) - 安全吗?
- python - 带有 python、Boto3 和 QuickSight 开发工具包的 AWS Lambda 函数,收到错误消息:InvalidParameterValueException/Invalid ResourceId
- c# - 在服务器和客户端(C# Asp Core)之间共享 HTTP API 接口并在编译时进行验证
- java - 在我的 Minecraftserver 上,我的插件无法加载
- git - 不小心把我的整个C盘变成了本地git仓库
- python - 无法在 Linux 上激活虚拟环境(Docker 快速入门终端虚拟机)
- javascript - 将全局变量传递给ajax函数,发布到php,保存到数据库
- c - 当你在 C 中达到一个句点时如何停止读取文件
- reactjs - React,Typescript - 找不到模块...或其相应的类型声明
- c - 测试代码没问题,但是提交后显示内存泄漏