2017-04-14 61 views
0

我目前正在爲我的軟件團隊創建一些非常定製的功能,並且想到使用鬆散事件訂閱的一個很好的解決方案。問題是,我在獲取事件信息後遇到了問題......到目前爲止,我已經成功配置了slack來調用我的WCF服務,但是,包含我之後的信息的'event'參數始終空值。Slack Event訂閱

這是我到目前爲止有:

[ServiceContract] 
public interface ISlackTrelloService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "SlackPost", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
    string SlackPost(string type, string token, string challenge, string team_id, SlackEvent slackEvent); 
} 

具體實現:

public class SlackTrelloService : ISlackTrelloService 
{ 
    public string SlackPost(string type, string token, string challenge, string team_id, SlackEvent slackEvent) 
    { 
     return challenge; 
    } 
} 

的SlackEvent類:

[JsonObject(Id = "event", Description = "event", Title = "event")] 
public class SlackEvent 
{ 
    [JsonProperty(PropertyName = "type")] 
    public string Type { get; set; } 

    [JsonProperty(PropertyName = "event_ts")] 
    public string EventTimestamp { get; set; } 

    [JsonProperty(PropertyName = "user")] 
    public string User { get; set; } 

    [JsonProperty(PropertyName = "ts")] 
    public string Timestamp { get; set; } 

    [JsonProperty(PropertyName = "item")] 
    public string Item { get; set; } 
} 

現在,SlackEvent對象是有問題的位的代碼,因爲我希望它包含由Slack根據發送的信息文檔。其他參數都正確填充,只是不是slackEvent對象:(

起初我以爲這是因爲參數名稱不完全匹配,但即使使用@event(因爲事件是C#中的關鍵字)didn 「T似乎工作我不知道如果我使用Newtonsoft JSON庫不正確,或者如果有別的東西,我很想念

編輯:。 新方法來捕獲的數據格式正確

string SlackPost(string token, string team_id, string api_app_id, SlackEvent slackEvent, string type, string[] authed_users, string event_id, string event_time); 

SlackEvent結構:

[JsonObject("event")] 
public class Event 
{ 
    [JsonProperty(PropertyName = "type")] 
    public string Type { get; set; } 

    [JsonProperty(PropertyName = "channel")] 
    public string Channel { get; set; } 

    [JsonProperty(PropertyName = "user")] 
    public string User { get; set; } 

    [JsonProperty(PropertyName = "text")] 
    public string Text { get; set; } 

    [JsonProperty(PropertyName = "ts")] 
    public string TimeStamp { get; set; } 
} 

回答

0

通過C#是有點生疏,但從我能理解它看起來好像你的類實現不完整。

Slack發送兩個不同的事件請求:驗證握手和實際事件。你們班的目標是在一個班級中涵蓋這兩種類型,我認爲不會像目前實施的那樣工作。

驗證握手僅在事件訂閱期間使用一次,並且不包含任何事件信息。它看起來是這樣的:(從官方文檔)

{ 
    "token": "Jhj5dZrVaK7ZwHHjRyZWjbDl", 
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P", 
    "type": "url_verification" 
} 

您的應用程序需要正確回答驗證握手,使一個成功的事件訂閱。

實際事件後發出這樣的:(從官方文檔再次)

{ 
     "token": "z26uFbvR1xHJEdHE1OQiO6t8", 
     "team_id": "T061EG9RZ", 
     "api_app_id": "A0FFV41KK", 
     "event": { 
       "type": "reaction_added", 
       "user": "U061F1EUR", 
       "item": { 
         "type": "message", 
         "channel": "C061EG9SL", 
         "ts": "1464196127.000002" 
       }, 
       "reaction": "slightly_smiling_face" 
     }, 
     "event_ts": "1465244570.336841", 
     "type": "event_callback", 
     "authed_users": [ 
       "U061F7AUR" 
     ] 
} 

正如你可以看到它不具有challenge財產,而是其他許多人。

您還縫了只在類中返回challenge,但不是實際的事件信息。

因此,這裏是我的建議:

  1. 確保您已成功訂閱事件你鬆弛的應用程序中。如果您當前沒有收到的是不包含該事件的驗證握手。

  2. 讓不同的實現應對驗證握手和事件請求

+0

我的類是非常不完整,我想正是(我需要另一種方法來接受方法的信息)......然而,我找不到任何有關如何實際觸發事件請求的信息,即如何告訴Slack調用單獨的方法? 現在正在調用的方法正在工作,因爲在Slack中有一個配置選項,允許我指定特定的URL進行驗證。 – spuriousGeek

+0

好的,很酷。我認爲我們正走在正確的軌道上。 Slack會將兩種請求類型發送到相同的url,這是您在配置窗口中指定的那個。驗證握手完成後(您將在配置窗口中看到)以及您訂閱的事件已發生,您將收到事件請求。我建議訂閱[消息](https://api.slack.com/events/message),然後在某個頻道中引起某種觸發。 –

+0

我編輯了原始帖子,以反映我捕獲正在被解僱的事件數據所做的更改。我現在正確地接收了所有的數據,除了事件信息(我實際上是在!之後!)。我正在使用Newtonsoft JSON庫嘗試捕獲事件對象,但也許我誤解了某些內容,因爲slackEvent始終爲空。這可能是我必須映射到確切的「事件」,但由於它是一個關鍵字,我嘗試設置我創建的數據結構的id,即[JsonObject(「event」)] – spuriousGeek