Интерактивные кнопки
Интерактивные сообщения могут содержать кнопки, которые можно комбинировать, изменять и удалять на основе ответов вашего сервера для создания удобного интерактивного взаимодействия.
Что бы добавить кнопки в сообщение, можно воспользоваться полем attachments при создании или редактировании поста
curl --location 'https://<API_URL>/api/v4/posts' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer Token' \
--data '{
"peer": "@yoona",
"message": "Source message",
"props": {
"attachments": [
{
"text": "Attachment message",
"actions": [
{
"id": "message",
"name": "Press me!",
"integration": {
"url": "https://<INTEGRATION_API_URL>"
}
}
]
}
]
}
}'
При отправке этого запроса, будет создано сообщение, которое включает в себя:
-
Текст
Source Message -
Интерактивный блок с сообщением
Attachment Message -
Кнопка с текстом
Press Me-
при нажатии на кнопку - будет отправлен
POSTзапрос на указанный адрес в полеurl -
стурктура запроса на указанный адрес в поле
urlвыглядит следующим образом:
-
type PostActionIntegrationRequest struct {
UserId string `json:"user_id"` // ID пользваотеля, инициирующего действие
UserName string `json:"user_name"` // Имя пользователя, инициирующего действие
ChannelId string `json:"channel_id"` // ID канала, в котором находится сообщение
ChannelName string `json:"channel_name"` // Имя канала, в котором находится сообщение
TeamId string `json:"team_id"` // ID команды, которой принадлежит канал
TeamName string `json:"team_domain"` // Имя команды, которой принадлежит канал
PostId string `json:"post_id"` // ID сообщения для действия
TriggerId string `json:"trigger_id"` // ID триггера действия
Type string `json:"type"` // Тип действия над сообщением
DataSource string `json:"data_source"` // Определяет источник данных для выбранного действия
Context map[string]interface{} `json:"context,omitempty"` // Контекст выполнения действия над сообщением
}
На основе ответа сервера, изначальное сообщение может быть изменено, и/или создано дополнительное эфемерное сообщение.
Самый простой вариант реализации сервера, который при нажатии на кнопку - отредактирует сообщение с упоминание пользователя
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
)
type Post struct { // Сокращена структура для краткости примера
Message string `json:"message"`
}
type PostActionIntegrationResponse struct {
Update *Post `json:"update"`
EphemeralText string `json:"ephemeral_text"`
SkipSlackParsing bool `json:"skip_slack_parsing"` // Set to `true` to skip the Slack-compatibility handling of Text.
}
type PostActionIntegrationRequest struct {
UserName string `json:"user_name"`
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading request body", http.StatusInternalServerError)
return
}
var request PostActionIntegrationRequest
err = json.Unmarshal(body, &request)
if err != nil {
http.Error(w, "Error unmarshalling request", http.StatusBadRequest)
return
}
responseJson, err := json.Marshal(PostActionIntegrationResponse{
Update: &Post{
Message: fmt.Sprintf("@%s, hello!", request.UserName),
},
EphemeralText: "You updated the post!",
})
if err != nil {
http.Error(w, "Error marshalling response", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(responseJson)
})
log.Fatal(http.ListenAndServe(":8090", nil))
}