松弛事件订阅

时间:2017-04-14 16:38:48

标签: c# wcf slack-api slack

我目前正在尝试为我的软件团队创建一些非常定制的功能,并想到使用松弛事件订阅的一个很好的解决方案。问题是,我在获取事件信息时遇到问题...到目前为止,我已设法配置slack来调用我的WCF服务,但是,包含我所依赖的信息的'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根据this文档发送的信息。其他参数都正确填充,而不是slackEvent对象:(

起初我认为这是因为参数名称并不完全匹配,但即使使用@event(因为事件是C#中的关键字)似乎也不起作用。我不确定我是否错误地使用了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; }
}

1 个答案:

答案 0 :(得分:0)

C#有点生疏,但据我所知,你的SlackTrelloService类实现看起来不完整。

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. 确保您已成功订阅Slack应用中的活动。如果不是您目前获得的是验证握手,则不包括该事件。

  2. 单独实施以处理验证握手和事件请求