【问题标题】:Slack Event SubscriptionSlack 事件订阅
【发布时间】:2017-04-16 08:58:21
【问题描述】:

我目前正在尝试为我的软件团队创建一些非常定制的功能,并想出了一个使用 slack 事件订阅的绝佳解决方案。问题是,我在获取我所追求的事件信息时遇到问题......到目前为止,我已经设法配置 slack 来调用我的 WCF 服务,但是,包含我所追求的信息的“事件”参数总是空。

这是我目前所拥有的:

[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(因为 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; }
}

【问题讨论】:

  • @spuriousGreek 你能告诉我你是如何针对请求 URL 编写操作方法来返回挑战参数的吗?我有点坚持。我正在使用 ASP.Net Core Mvc

标签: c# wcf slack-api slack


【解决方案1】:

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. 分别实现处理验证握手和事件请求

【讨论】:

  • 我的课程非常不完整,我完全认为(我需要另一种方法来接受方法信息)......但是,我找不到任何关于如何实际触发事件请求的信息,即如何我告诉 Slack 调用一个单独的方法?现在调用的方法正在运行,因为 Slack 中有一个配置选项允许我为验证指定特定的 URL。
  • 好的,很酷。我认为我们走在正确的轨道上。 Slack 会将这两种请求类型发送到相同的 url,即您在配置窗口中指定的那个。一旦验证握手完成(您将在配置窗口中看到)并且您订阅的事件已经发生,您将收到事件请求。我建议订阅message,然后在频道中摆姿势来触发它。
  • 我已经编辑了原始帖子,以反映我为捕获被触发的事件数据所做的更改。我现在可以正确接收所有数据,除了事件信息(我真正想要的那个!)。我正在使用 Newtonsoft JSON 库来尝试捕获事件对象,但也许我误解了一些东西,因为 slackEvent 始终为空。可能是我必须映射到确切的“事件”,但由于它是一个关键字,我试图设置我创建的数据结构的 id,即 [JsonObject("event")]
猜你喜欢
  • 2018-02-26
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多