首页 > 解决方案 > 如何使用 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。

标签: rslack

解决方案


我不确定这是否是您的意思,但是我通过更改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")

在此处输入图像描述


推荐阅读