слабая интеграция: 404 URL с истекшим сроком действия https://hooks .slack.com/commands

#go #slack

#Вперед #slack

Вопрос:

Вот мое приложение 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
  

Я создал команду slack slash /my-command с POST опцией и вставил URL-адрес https, который дал ngrok:

параметры команды slash - slack

Теперь, когда я запускаю /my-command slack, я получаю ответ slack Test started . А затем через секунду slack печатает Test finished

На данный момент все в порядке.

Проблема

Если я заменю строку

 time.Sleep(time.Second)
  

по строке

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

Я не получаю печать slack «Тест завершен» через час. Вместо этого я вижу в своих журналах приложений:

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

Похоже, что URL-адрес ответа slack имеет время истечения срока действия. Как продлить это время истечения срока действия?

Или, в случае истечения срока действия, есть ли другой способ отправить пользователю сообщение о завершении теста? У меня есть имя и идентификатор пользователя, запускающего /my-command

 req.PostFormValue("user_name")
req.PostFormValue("user_id")
  

Итак, я хочу запустить интеграционные тесты с помощью slack, которые длятся более 2 часов, и получить ответ после завершения таких тестов в slack.

Комментарии:

1. Я ничего об этом не знаю (потому что я новичок в программировании), но мне нравится изучать подобные вещи, можете ли вы сказать, что это такое, и надеюсь, что эта ссылка поможет вам, если не извините меня: ( gist.github.com/jmervine/8321794 Удачи @Maxim 🙂

Ответ №1:

Вы не можете увеличить время истечения срока действия для URL-адреса, который является внутренним параметром Slack.

Использование Slack Web API

Вы можете отправлять автоматические сообщения любому пользователю через Slack Web API, для которого вам нужен токен.

Для получения дополнительной информации проверьте: https://api.slack.com/web .

чат.postMessage

В Slack API есть postMessage команда, которая позволяет пользователю отправлять сообщения каналу, slackbot каналу и пользователю через IM канал (прямое сообщение). Кажется, вы хотите сделать позже, что довольно просто.

Отправка сообщения на канал обмена мгновенными сообщениями

chat.postMessage#каналы

URL-адрес метода: https://slack.com/api/chat.postMessage

Отправка на канал обмена мгновенными сообщениями немного сложнее, когда значение параметра channel зависит от значения as_user .

  • Если as_user равно false:
    • Передайте username ( @chris ) в качестве значения channel для публикации на канале @slackbot этого пользователя в качестве бота.
    • Передайте идентификатор канала обмена мгновенными сообщениями ( D023BB3L2 ) в качестве значения channel для отправки на этот канал обмена мгновенными сообщениями в качестве бота. Идентификатор канала обмена мгновенными сообщениями можно получить с помощью обмена мгновенными сообщениями.метод API списка.
  • Если as_user значение true:
    • Передайте идентификатор канала обмена мгновенными сообщениями ( D023BB3L2 ) в качестве значения channel для отправки на этот канал обмена мгновенными сообщениями в качестве аутентифицированного пользователя. Идентификатор канала обмена мгновенными сообщениями можно получить с помощью обмена мгновенными сообщениями.метод API списка. Чтобы отправить прямое сообщение пользователю, владеющему токеном, используемым в запросе, укажите в поле канала значение идентификатора разговора / обмена мгновенными сообщениями, найденное в таком методе, как im.list.

Чтобы отправить прямое сообщение пользователю, владеющему токеном, используемым в запросе, укажите в channel поле значение a conversation / IM ID, найденное в таком методе, как im.list.

im.list

Этот метод вернет список каналов прямых сообщений, если у вас еще нет открытого канала с пользователем, который вы можете вызвать im.open .

им.открой

Этот метод используется для open прямого сообщения channel с указанным пользователем.

Документацию о im.open нем можно найти здесь .

Пример URL-адреса

https://slack.com/api/chat.postMessage?token=**TOKEN**amp;channel=**Direct Channel ID**amp;text=HelloWorldamp;as_user=trueamp;pretty=1

Просто замените **TOKEN** и **Direct Channel ID** своими значениями, и он должен отправить прямое сообщение указанному пользователю.