2017-01-21 6 views
7

Я использую Python 2.7 вместе с python-slackclient. У меня есть структура вложений, как так:Slack API - Утилиты из пользовательского сообщения бота как обычный текст

self.msg = { 
    "attachments": [ 
     { 
      "fallback": "%s, %s" % (self.jiraIssueObj.fields.summary, self.link), 
      "pretext": "Detail summary for %s" % self.jiraIssueObj, 
      "title": self.jiraIssueObj.fields.summary, 
      "title_link": self.link, 
      "text": self.jiraIssueObj.fields.description[0:self.maxSummary], 
      "color": "#7CD197", 
      "mrkdwn_in": ["text", "pretext", "fields"] 
     } 
    ] 
} 

затем,

def Send(self): 
     if (self.msg): 
      slack_client.api_call("chat.postMessage", channel=self.channel, text=self.msg, as_user=True) 
      self.msg = None 

Однако, когда эти сообщения, он просто отправляет в открытый текст, без форматирования:

{ "вложения" : [{"title": «Обновление Grafana до 3.0», «color»: «# 7CD197 », «текст»: «Привет, ребята, я добавил, что мой e-mail создаст билет, который мы можем поставить в очередь это в поддержку. \ u00a0 Эрик, если у ou wouldn \ u2019t mind просто отвечающий на это письмо с дополнительным info? \ n \ n \ u00a0 \ n \ n \ u00a0 \ n \ nОтсутствие: Четверг, Август 25, 2016 11:41 AM \ n "," title_link ": " https://jira.jr.com/browse/ops-164 "," mrkdwn_in ": [" text ", " pretext "," fields "]," pretext ":" Подробное резюме для ops-164 ", " fallback ":" Обновление Grafana до 3.0 , https://jira.jr.com/browse/ops-164 "}]}

Что я делаю неправильно? Я также пробовал делать attachments=self.msg в вызове Send(), но при этом я не получаю никакого вывода на свой слабый канал.

ответ

5

Как оказалось, вызов

slack_client.api_call("chat.postMessage", channel=self.channel, attachments=self.msg, as_user=True) 

apears добавить верхний слой { "attachments": ... } для вас. Таким образом, путем изменения моего self.msg просто быть:

self.format = [{ 
    "fallback": "%s, %s" % (self.jiraIssueObj.fields.summary, self.link), 
    "pretext": "Detail summary for %s" % self.jiraIssueObj, 
    "title": self.jiraIssueObj.fields.summary, 
    "title_link": self.link, 
    "text": self.jiraIssueObj.fields.description[0:self.maxSummary], 
    #"color": "#7CD197", 
    "mrkdwn_in": ["text", "pretext", "fields"] 
}] 

без этого внешняя { "attachments": ... } обертке, то апи смог опубликовать приложение сообщения, как и ожидалось.

1

Метод chat.postMessage имеет пару причуд - как и большинство веб-интерфейсов Slack, он поддерживает только типы контента application/x-www-form-urlencoded и не поддерживает JSON. Аспект quirkier заключается в том, что параметр attachments принимает массив JSON, кодированный по URL-адресу. Прямо сейчас, похоже, вы отправляете параметр text в собственный массив Python.

Чтобы Slack понял эту структуру, вам сначала нужно превратить ее в строку JSON. Оболочка API, которую вы используете, вероятно, может обрабатывать следующий шаг преобразования в URL-кодированное представление.

И, наконец, само приложение не помещается в сообщение text - это отдельное поле. Вы хотите, чтобы указать, что-то больше, как это, после определения вашей строки JSON, как self.attachments:

slack_client.api_call("chat.postMessage", channel=self.channel, attachments=self.attachments, as_user=True)

text Поля становится необязательным, как только вы включаете вложения.

+0

Я попытался выполнить 'attachments = json.dumps (self.msg)', и, хотя это создало строку JSON (https://gist.github.com/calebtote/80a3803a717b1d908fc48986d8e876e3), она по-прежнему не отправляет сообщения на канал ничего. – MrDuk

 Смежные вопросы

  • Нет связанных вопросов^_^