2017-01-21 28 views
7

Używam Pythona 2.7 wraz z python-slackclient. Mam struktura przywiązanie tak:Interfejs API luzu - Attatchments z niestandardowego postu na bot jako zwykły tekst

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"] 
     } 
    ] 
} 

wtedy,

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

Jednak, gdy ten posty, to właśnie księguje zwykłego tekstu, bez formatowania:

{ "dodatki" : [{"title": "Upgrade Grafana do 3.0", "color": "# 7CD197 ", "text": "Hej chłopaki, dodałem listę mailową JIRA, więc ten e-mail utworzy bilet, który możemy umieścić w kolejce to wsparcie. \ u00a0 Eric jeśli y ou Czy po prostu nie odpowiadasz na tę wiadomość e-mail z dodatkowymi informacjami: ? \ n \ n \ u00a0 \ n \ n \ u00a0 \ n \ nUstawiono: czwartek, sierpień 25, 2016 11:41 AM \ n "," title_link ": " https://jira.jr.com/browse/ops-164 "," mrkdwn_in ": [" text ", " pretext "," fields "]," pretext ":" Podsumowanie szczegółów dla ops-164 ", " fallback ":" Upgrade Grafana do 3.0 , https://jira.jr.com/browse/ops-164 "}]}

Co robię źle? Próbowałem też wykonywać attachments=self.msg w wywołaniu Send(), ale nie robię żadnego wyjścia do mojego wolnego kanału, kiedy to robię.

Odpowiedz

5

Jak się okazuje, wezwanie do

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

apears dodać górną warstwę { "attachments": ... } dla Ciebie. Tak zmieniając mój self.msg po prostu być:

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"] 
}] 

bez tej zewnętrznej { "attachments": ... } owijki, API był w stanie odpowiedzieć załącznik wiadomości zgodnie z oczekiwaniami.

1

Metoda chat.postMessage ma kilka dziwactw - podobnie jak większość internetowych API Slacka, obsługuje tylko typy zawartości application/x-www-form-urlencoded i nie obsługuje JSON. Najdziwniejszym aspektem jest to, że parametr attachments przyjmuje tablicę JSON zakodowaną w adresie URL. Obecnie wydaje się, że wysyłasz parametr text do rodzimej tablicy Pythona.

Aby Slack zrozumiał tę strukturę, należy ją najpierw przekształcić w ciąg JSON. Opakowanie interfejsu API, z którego korzystasz, prawdopodobnie obsłuży następny krok konwersji w postaci zakodowanej za pomocą adresu URL.

Wreszcie sam załącznik nie zostanie umieszczony w komunikacie text - to oddzielne pole. Będziemy chcieli, aby określić coś więcej jak to, po zdefiniowaniu swój ciąg JSON jako self.attachments:

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

Pole text staje opcjonalnie po zawierać załączniki.

+0

Próbowałem robić 'attachments = json.dumps (self.msg)', i podczas gdy to wyprodukowało ciąg JSON (https://gist.github.com/calebtote/80a3803a717b1d908fc48986d8e876e3) nadal nie publikuje do channelować wszystko. – MrDuk