Автоматическая отправка публикаций в сообщество «ВКонтакте» (VK) и канал мессенджера «Макс» (Max) на языке Go
Ручная публикация анонсов в несколько каналов одновременно — это рутина, которую можно и нужно автоматизировать. В этой статье мы разберем, как с нуля реализовать систему автоматической отправки постов в сообщество «ВКонтакте» и канал мессенджера «Макс» (Max), используя язык Go (Golang).
Кросспостинг
Кросспостинг — это одновременная или последовательная публикация одинакового или адаптированного контента (текста, фото, видео) сразу на нескольких различных интернет-площадках: в социальных сетях, мессенджерах, на сайтах или в блогах.
Автоматизация публикаций - основа эффективного SMM (Social Media Marketing / маркетинг в социальных сетях). В этой статье мы разберем, как написать на языке Go сервис, который будет одновременно отправлять посты в две популярные российские платформы: ВКонтакте (VK API) и быстро растущий национальный мессенджер МАКС (MAX API).
Мы будем использовать официальные HTTP-эндпоинты обеих платформ и стандартные библиотеки Go (Golang) для построения чистого и легко поддерживаемого решения. Перед тем как писать код, необходимо получить ключи доступа (токены) для обеих платформ.
1. Перейдите на VK для разработчиков и создайте приложение (тип «Инструменты»)
2. В настройках приложения получите Токен доступа сообщества с правами wall и photos
3. Узнайте ID вашего сообщества (в API он передается со знаком минус, например -123456)
1. Зарегистрируйте организацию или ИП на платформе МАКС и подтвердите цифровой ID
2. Создайте бота и получите Access Token
3. Добавьте бота в ваш канал в качестве администратора с правом отправки сообщений
4. Узнайте ID канала (chat_id)
Национальный мессенджер МАКС использует современную и защищенную инфраструктуру. С мая 2026 года платформа перешла на работу через обновленный домен platform-api2.max.ru.
⚠️ Для отправки запросов к API МАКС на сервере должен быть установлен доверенный корневой сертификат Минцифры.
ℹ️ Для деталей лучше обратиться к официальной документации платформ, т.к. данные экосистемы постоянно развиваются и меняют свой пользовательский интерфейс.
Ниже представлен код процедуры на Go для отправки сообщений в MAX:
1package utils
2
3import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "io"
8 "net/http"
9 "net/url"
10)
11
12// Структура запроса в соответствии с MAX Bot API
13type MaxPostRequest struct {
14 ChatID string `json:"chat_id"` // ID канала или чата
15 Text string `json:"text"` // Текст поста
16 Format string `json:"format"`
17}
18
19func PostMAX(botToken string, chat_id string, apiURL string, textPost string) error {
20
21 if botToken == "" {
22 return fmt.Errorf("❌ Ошибка: Переменная окружения MAX_BOT_TOKEN не задана")
23 }
24
25 // Формируем публикацию для канала
26 post := MaxPostRequest{
27 Text: textPost,
28 Format: "markdown",
29 }
30
31 jsonData, err := json.Marshal(post)
32 if err != nil {
33 fmt.Printf("❌ Ошибка: %v\n", err)
34 return err
35 }
36
37 // Парсим базовый URL в объект *url.URL
38 parsedURL, err := url.Parse(apiURL)
39 if err != nil {
40 // Обработка ошибки парсинга
41 }
42
43 // Добавляем путь "messages" к объекту
44 parsedURL = parsedURL.JoinPath("messages")
45
46 query := parsedURL.Query()
47 query.Set("chat_id", chat_id)
48 parsedURL.RawQuery = query.Encode()
49
50 // готовая строка URL:
51 finalURLString := parsedURL.String()
52
53 req, err := http.NewRequest("POST", finalURLString, bytes.NewBuffer(jsonData))
54 if err != nil {
55 fmt.Printf("❌ Ошибка создания HTTP-запроса: %v\n", err)
56
57 }
58
59 // Установка обязательных заголовков
60 req.Header.Set("Content-Type", "application/json")
61 req.Header.Set("Authorization", botToken) // Передача токена в заголовке
62
63 // Отправка запроса на сервер MAX
64 client := &http.Client{}
65
66 resp, err := client.Do(req)
67
68 // СНАЧАЛА проверяем ошибку сети/SSL
69 if err != nil {
70 fmt.Printf("❌ Ошибка при отправке запроса: %v\n", err)
71 return err
72 }
73
74 // закрываем Body (теперь resp точно не nil!)
75 defer resp.Body.Close()
76
77 // Проверяем статус-код
78 if resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusCreated {
79 fmt.Println("✅ Пост успешно опубликован в канале MAX!")
80 } else if resp.StatusCode == http.StatusBadRequest {
81 body, _ := io.ReadAll(resp.Body)
82 fmt.Printf("❌ Ошибка MAX. Сервер вернул ошибку 400! Детали: %s\n", string(body))
83 } else {
84 fmt.Printf("❌ Ошибка публикации MAX. Код ответа сервера: %d\n", resp.StatusCode)
85 }
86
87 return nil
88}
Код процедуры на Go для отправки сообщений в ВКонтакте:
1package utils
2
3import (
4 "fmt"
5 "io"
6 "net/http"
7 "net/url"
8 "os"
9)
10
11// PublishPost отправляет запись на стену ВКонтакте.
12// ownerID: ID пользователя или сообщества (для сообществ число должно быть отрицательным, например -12345)
13func PostVK(accessToken string, ownerID string, textPost string) error {
14
15 // Текст публикации
16 message := textPost
17
18 // Формируем параметры запроса
19 data := url.Values{}
20 data.Set("owner_id", ownerID)
21 data.Set("message", message)
22 data.Set("from_group", "1")
23 data.Set("access_token", accessToken)
24 data.Set("v", "5.199") // Актуальная версия API
25
26 // Отправляем POST-запрос
27 resp, err := http.PostForm("https://api.vk.com/method/wall.post", data)
28 if err != nil {
29 fmt.Printf("❌ Ошибка отправки запроса: %v\n", err)
30 os.Exit(1)
31 }
32 defer resp.Body.Close()
33
34 // Читаем ответ от сервера ВКонтакте
35 body, err := io.ReadAll(resp.Body)
36 if err != nil {
37 fmt.Printf("❌ Ошибка чтения ответа: %v\n", err)
38 os.Exit(1)
39 }
40
41 // В случае успеха вернется JSON с ID созданного поста: {"response":{"post_id":123}}
42 fmt.Println("✅ Ответ от VK API:", string(body))
43
44 return nil
45}
Готовы вас проконсультировать
Задайте интересующие вас вопросы специалистам компании