Как улучшить форматирование слабых сообщений с помощью slackr? - PullRequest
0 голосов
/ 04 сентября 2018

Я использую 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:

enter image description here

Вот пример того, как я хотел бы, чтобы это выглядело:

enter image description here

slackr, похоже, не имеет много вариантов форматирования. Я думал о создании изображения и его вставке, но у меня возникают проблемы при создании изображения из текстового файла с использованием R.

Возможно, есть еще один API, который я мог бы назвать, который мог бы взять мой текст и отформатировать его для слабины?

Я открыт для любых предложений.

Добавление: У Slackr есть возможность загружать файлы, поэтому моя последняя попытка - создать изображение из текстового сообщения и загрузить этот объект.

Я могу создать png-файл из текстового сообщения, используя библиотеку magick. Я создал изображение с цветным фоном и просто добавляю текст сообщения к изображению:

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

enter image description here

Изображение выглядит довольно хорошо (хотя, кажется, нет простого способа выделить жирным шрифтом или подчеркнуть отдельные слова в сообщении), но теперь препятствием является то, что я не могу заставить команду загрузки работать.

slackr_upload(filename = "alert_picture.png")

Я не получаю никаких сообщений об ошибках, но ничего не загружается.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я не уверен, что вы это имели в виду, но я решил разрешить форматирование, как в обычном слабом сообщении, изменив функцию 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")

enter image description here

0 голосов
/ 08 сентября 2018

Я справился с этой проблемой, используя пакет httr для выполнения функции post image, чтобы расслабиться.

Спасибо Адилу Б. за предоставленное решение:

Публикация изображения в Slack с использованием пакета HTTR в R

...