Интерактивные кнопки
Интерактивные сообщения состоят могут содержать кнопки, которые можно комбинировать, изменять и удалять на основе ответов вашего сервера для создания удобного интерактивного взаимодействия.
Что бы добавить кнопки в сообщение, можно воспользоваться полем 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
- при нажатии на кнопку - будет отправлен
На основе ответа сервера, изначальное сообщение может быть изменено, и/или создано дополнительное эфемерное сообщение.
Самый простой вариант реализации сервера, который при нажатии на кнопку - отредактирует сообщение с упоминание пользователя
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))
}