首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >松弛集成: 404个过期的url https://hooks.slack.com/commands

松弛集成: 404个过期的url https://hooks.slack.com/commands
EN

Stack Overflow用户
提问于 2016-09-30 09:40:35
回答 1查看 1.9K关注 0票数 4

下面是我的golang应用程序,它侦听来自松弛命令的请求:main.go

代码语言:javascript
运行
复制
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()
        }
    }
}

我做的是:

代码语言:javascript
运行
复制
$ go run main.go
listening 8383

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

代码语言:javascript
运行
复制
ngrok http 8383

我创建了带有/my-command选项的松弛斜杠命令POST,并粘贴了ngrok提供的https URL:

现在,当我在空闲中运行/my-command时,我得到了松弛的回复Test started。然后在第二次空白打印Test finished

现在,一切都很好。

问题

如果我换了线路

代码语言:javascript
运行
复制
time.Sleep(time.Second)

按线

代码语言:javascript
运行
复制
time.Sleep(time.Hour) // long test

我不会在一小时内把“考试完成”写得松懈。相反,我在我的应用程序日志中看到:

代码语言:javascript
运行
复制
responseUrl https://hooks.slack.com/commands/T3GBFUZ64/86817661808/XRmDO21jYaP1Wzu7GFpNw9eW
404
Expired url

看起来slack的响应URL有一个过期时间。如何扩展这个过期时间

或者在过期的情况下,是否有其他方式向用户发送关于测试完成的消息?我有一个启动/my-command的用户的名字和id

代码语言:javascript
运行
复制
req.PostFormValue("user_name")
req.PostFormValue("user_id")

因此,我想运行集成测试的松弛,这是超过2个小时,并得到一个响应后,完成这样的测试在松弛。

EN

回答 1

Stack Overflow用户

发布于 2016-10-03 08:36:37

不能增加URL的过期时间,该URL是Slack内部设置。

使用

您可以通过需要令牌的松弛Web API向任何用户发送无人值守的消息。

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

chat.postMessage

Slack有一个postMessage命令,允许用户通过IM通道(直接消息)向信道、slackbot通道和用户发送消息。似乎你想做后一件事,这很简单。

发送到IM频道

chat.postMessage#channels

方法Url:https://slack.com/api/chat.postMessage

当根据channel的值设置as_user的值时,将消息发送到IM通道会稍微复杂一些。

  • 如果as_user是假的:
    • 将用户名(@chris)作为channel的值传递给该用户的@slackbot通道作为bot。
    • 将IM通道的ID (D023BB3L2)作为channel的值传递给该IM通道作为bot。可以通过im.list API方法检索IM通道的ID。

  • 如果as_user是真的:
    • 将IM通道的ID (D023BB3L2)作为channel的值传递给该IM通道,作为经过身份验证的用户。可以通过im.list API方法检索IM通道的ID。若要向拥有在请求中使用的令牌的用户发送直接消息,请向通道字段提供在im.list等方法中找到的会话/IM ID值。

若要向拥有请求中使用的令牌的用户发送直接消息,请向channel字段提供在im.list之类的方法中找到的会话/ ID值。

im.list

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

im.open

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

有关im.open的文档可以找到这里

示例URL

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39788408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档