#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:
Теперь, когда я запускаю /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
канал (прямое сообщение). Кажется, вы хотите сделать позже, что довольно просто.
Отправка сообщения на канал обмена мгновенными сообщениями
URL-адрес метода: https://slack.com/api/chat.postMessage
Отправка на канал обмена мгновенными сообщениями немного сложнее, когда значение параметра channel
зависит от значения as_user
.
- Если
as_user
равно false:- Передайте username (
@chris
) в качестве значенияchannel
для публикации на канале @slackbot этого пользователя в качестве бота. - Передайте идентификатор канала обмена мгновенными сообщениями (
D023BB3L2
) в качестве значенияchannel
для отправки на этот канал обмена мгновенными сообщениями в качестве бота. Идентификатор канала обмена мгновенными сообщениями можно получить с помощью обмена мгновенными сообщениями.метод API списка.
- Передайте username (
- Если
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**
своими значениями, и он должен отправить прямое сообщение указанному пользователю.