gpt4 book ai didi

go - 松弛集成 : 404 Expired url https://hooks. slack.com/commands

转载 作者:IT王子 更新时间:2023-10-29 01:41:55 24 4
gpt4 key购买 nike

这是我的 golang 应用监听来自 slack 命令的请求:main.go:

package main

import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)

type SlackCmdResponse struct {
Text string `json:"text"`
}

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
if err := req.ParseForm(); err != nil {
panic(err)
}
responseUrl := req.PostFormValue("response_url")
go func() {
time.Sleep(time.Second)
postBack(responseUrl)
}()
rj, err := json.Marshal(SlackCmdResponse{Text: "Test started"})
if err != nil {
panic(err)
}
w.Header().Set("Content-Type", "application/json")
w.Write(rj)

})
fmt.Println("listening 8383")
if err := http.ListenAndServe(":8383", nil); err != nil {
panic(err)
}
}

func postBack(responseUrl string) {
fmt.Println("responseUrl", responseUrl)
cResp := SlackCmdResponse{
Text: "Test finished",
}
cj, err := json.Marshal(cResp)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", responseUrl, bytes.NewReader(cj))
req.Header.Set("Content-Type", "application/json")

resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
if resp != nil {
fmt.Println(resp.StatusCode)
if b, err := ioutil.ReadAll(resp.Body); err != nil {
panic(err)
} else {
fmt.Println(string(b))
}
if resp.Body != nil {
resp.Body.Close()
}
}
}

我运行它:

$ go run main.go
listening 8383

我使用 ngrok 使其可以从互联网访问:

ngrok http 8383

我使用 POST 选项创建了斜杠命令 /my-command 并粘贴了 ngrok 提供的 https URL:

slash command options - slack

现在,当我在 slack 中运行 /my-command 时,我得到 slack 回复 Test started。然后在一秒钟内打印 Test finished

目前,一切都很好。

问题

如果我换行

time.Sleep(time.Second)

按行

time.Sleep(time.Hour) // long test

我没有在一小时内打印出“测试完成”。相反,我在我的应用日志中看到:

responseUrl https://hooks.slack.com/commands/T3GBFUZ64/86817661808/XRmDO21jYaP1Wzu7GFpNw9eW
404
Expired url

看起来 slack 的响应 URL 有过期时间。如何延长这个到期时间

或者在过期的情况下,是否有另一种方式向用户发送有关测试已完成的消息?我有用户启动 /my-command

的名称和 ID
req.PostFormValue("user_name")
req.PostFormValue("user_id")

所以我想通过 slack 运行超过 2 小时的集成测试,并在 slack 完成此类测试后得到响应。

最佳答案

You can not increase the expire time for the URL that is a Slack internal setting.

使用 Slack Web API

您可以通过 Slack Web API 向任何用户发送无人值守的消息你需要一个 token 。

更多信息请查看:https://api.slack.com/web .

chat.postMessage

Slack API 有一个 postMessage 命令,允许用户将消息发布到 channel 、slackbot channel 以及通过 IM channel (直接消息)。看来你想稍后做这很简单。

发布到 IM channel

chat.postMessage#channels

方法网址:https://slack.com/api/chat.postMessage

根据 as_user 的值设置 channel 的值时,发布到 IM channel 会稍微复杂一些。

  • 如果 as_user 为假:
    • 将用户名 (@chris) 作为 channel 的值传递,以作为机器人发布到该用户的@slackbot channel 。
    • 将 IM channel 的 ID (D023BB3L2) 作为 channel 的值传递,以作为机器人发布到该 IM channel 。可以通过 im.list 检索 IM channel 的 ID API 方法。
  • 如果 as_user 为真:
    • 将 IM channel 的 ID (D023BB3L2) 作为 channel 的值传递,以作为经过身份验证的用户发布到该 IM channel 。可以通过 im.list API 方法检索 IM channel 的 ID。要向拥有请求中使用的 token 的用户发送直接消息,请为 channel 字段提供对话/IM ID 值,该值在类似 im.list 的方法中找到。 .

要向 拥有请求中使用的 token 的用户发送直接消息,请在 channel 字段中提供对话/IM在类似 im.list 的方法中找到的 ID 值.

im.列表

如果您没有与用户打开的 channel 但您可以调用 im.open,此方法将返回直接消息 channel 列表。

im.打开

此方法用于打开与指定用户的直接消息 channel

可以找到关于im.open 的文档here .

示例网址

https://slack.com/api/chat.postMessage?token=**TOKEN**&channel=**Direct Channel ID**&text=HelloWorld&as_user=true&pretty=1

只需将 **TOKEN****Direct Channel ID** 替换为您的值,它就会向指定用户发送一条直接消息。

关于go - 松弛集成 : 404 Expired url https://hooks. slack.com/commands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com