如何使用 slackr 改进松弛消息的格式?

How to improve formatting of slack messages using slackr?

我正在使用 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 我可以调用它来获取我的文本并将其格式化为 slack?

我愿意接受任何建议。

附录: 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。

我通过使用 httr 包执行 post 图像功能来解决这个问题。

感谢 Adil B. 提供解决方案:

我不确定这是否是您的意思,但我通过更改 slackr_bot() 函数并在它显示文本的代码。然后就叫它slackr_bot1()什么的,然后就可以post格式化消息了。这是去除反引号后的函数:

    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")