Slack API - 来自自定义机器人帖子的附件作为纯文本

时间:2017-01-21 05:33:06

标签: python slack-api slack

我使用Python 2.7和python-slackclient。我有一个像这样的附件结构:

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

然而,当这个帖子发布时,它只是发布明文,没有格式化:

  

{"附件":[{"标题":"将Grafana升级到3.0","颜色":" #7CD197   "," text":"嘿伙计们,我已经添加了JIRA maillist所以这封电子邮件   将创建一个我们可以将其排队支持的票据。\ u00a Eric如果你   我不介意只是回复这封电子邮件   信息?\ n \ n \ u00a \ n \ n \ u00a0 \ n \ n发布时间:8月8日星期四   25,2016 11:41 AM \ n"," title_link":   " https://jira.jr.com/browse/ops-164"," mrkdwn_in":[" text",   "借口","字段"],"借口":" ops-164"的详细摘要,   "后退":"将Grafana升级到3.0,   https://jira.jr.com/browse/ops-164"}]}

我做错了什么?我已尝试在attachments=self.msg调用中执行Send(),但在执行此操作时,我根本没有得到任何输出。

2 个答案:

答案 0 :(得分:6)

事实证明,呼吁

svn update

apears为您添加顶层slack_client.api_call("chat.postMessage", channel=self.channel, attachments=self.msg, as_user=True) 。因此,将我的{ "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"] }] 包装器,api能够按预期发布消息附件。

答案 1 :(得分:1)

chat.postMessage方法有一些怪癖 - 像大多数Slack的Web API一样,它只支持application/x-www-form-urlencoded内容类型,并且不支持JSON。更奇怪的是,attachments参数采用URL编码的JSON数组。现在,您似乎正在向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字段将成为可选字段。