【问题标题】:How to delete ephemeral Slack message如何删除临时 Slack 消息
【发布时间】:2020-02-04 00:26:19
【问题描述】:

当用户使用斜杠命令时,我会向该用户发布一条临时消息。当他们单击按钮时,我希望删除或更新该短暂消息。现在我只是想让删除部分工作。

在 Slack API 文档中,它说要向 response_url 发送 HTTP POST。当用户单击按钮时,我得到的唯一 response_url 是这样的:https://hooks.slack.com/actions/XXXXXXXXX/YYYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ

当我向该 url 发送 POST 时,我收到一个错误(我不确定错误是什么,我只知道我的代码在 try/catch 上失败)。

我发送到该 URL 的 JSON 如下所示:

        {
            "response_type" = "ephemeral",
            "replace_original" = "true",
            "delete_original" = "true",
            "text" = ""
        };

我在 Slack API 文档中看到它说我应该将该 JSON 发送到以 https://hooks.slack.com/services/ 开头的 URL,但是我没有收到任何包含 /services/ 的 response_url。

这是我用来发送响应的 C# 代码:

       var replaceMsg = new NameValueCollection();
       replaceMsg["delete_original"] = "true";
       replaceMsg["replace_original"] = "true";
       replaceMsg["response_type"] = "ephemeral";
       replaceMsg["text"] = "";                    
       var responseReplace = client.UploadValues(button.response_url, "POST", replaceMsg);

编辑:当我尝试发送时,我似乎遇到了 404 错误

Exception: System.Net.WebException: The remote server returned an error: (404) Not Found.

但是,当我将确切的 URL 粘贴到浏览器中时,我没有收到 404,而是看到了 JSON。

谁能指引我正确的方向?谢谢。

【问题讨论】:

  • 尝试检查成功和失败请求的标头以查看是否存在差异(使用浏览器网络选项卡)

标签: c# slack slack-api


【解决方案1】:

不久前我做了一些非常相似的事情并且能够让它工作,虽然它很棘手。

这篇文章对我帮助很大:How to remove Ephemeral Messages

我会做两件事:

1) 确保您知道 POST 响应失败是什么,因为它可能包含有用的信息。

2) 看起来您发送的是字符串 "true" 而不是布尔值,我猜您可能想要发送布尔值:

{
   "response_type" = "ephemeral",
   "replace_original" = true,
   "delete_original" = true,
   "text" = ""
};

【讨论】:

  • 那么这可能是C#问题,我会用代码更新我的主帖。
  • 可能。您所说的错误的帖子的完整响应是什么?
  • 看起来我收到 404 错误:“异常:System.Net.WebException:远程服务器返回错误:(404) 未找到。”奇怪,因为当我将 response_url 粘贴到浏览器中时,我看到一个 JSON,没有 404。
  • 这是有用的信息。然后,我会查看您从代码中发出的 HTTP 请求,并尝试找出它返回 404 而不是 200 响应代码的原因。您可能传入了错误的 URL,或者正如 @theMayer 指出的那样,您可能缺少必需的 HTTP 标头。
【解决方案2】:

@theMayer 和@Aaron 关于标题错误的说法是正确的。

设置标题解决了这个问题,如下所示:

var client = new WebClient();
client.Headers.Add("Content-Type", "text/html");
var response = client.UploadData(button.response_url, "POST", Encoding.Default.GetBytes("{\"response_type\": \"ephemeral\",\"replace_original\": \"true\",\"delete_original\": \"true\",\"text\": \"\"}"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2019-09-10
    • 2018-06-30
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多