2017-01-21 62 views
7

我正在使用Python 2.7以及python-slackclient。我有一個固定的結構,像這樣:Slack API - 作爲純文本的自定義bot帖子的附件

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」,「顏色」:「#7CD197 」,「文字」:「嗨,我添加了JIRA maillist,所以這個電子郵件地址 會創建一個票我們可以排隊它在支持。\埃裏克如果y ou 不介意回覆此電子郵件並附加 信息?\ n \ n \ n00a0 \ n \ n \ n00a0 \ n \ n發送:8月4日,星期四 25,2016 11:41上午\ 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「}]}

我在做什麼錯?我也試過在Send()的調用中做attachments=self.msg,但是當我這樣做時,我根本沒有輸出到我的鬆弛頻道。

回答

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": ... }包裝,該API能夠發佈消息附件如預期。

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場變成可選。

+0

我試着做'attachments = json.dumps(self.msg)',雖然這產生了一個JSON字符串(https://gist.github.com/calebtote/80a3803a717b1d908fc48986d8e876e3)它仍然不會實際發佈到通道任何東西 – MrDuk