Логотип 2А СОФТ

Автоматическая отправка публикаций в сообщество «ВКонтакте» (VK) и канал мессенджера «Макс» (Max) на языке Go

Общий

Ручная публикация анонсов в несколько каналов одновременно — это рутина, которую можно и нужно автоматизировать. В этой статье мы разберем, как с нуля реализовать систему автоматической отправки постов в сообщество «ВКонтакте» и канал мессенджера «Макс» (Max), используя язык Go (Golang).

4 мин
Доступно для: Программист
статья api

Кросспостинг

Кросспостинг — это одновременная или последовательная публикация одинакового или адаптированного контента (текста, фото, видео) сразу на нескольких различных интернет-площадках: в социальных сетях, мессенджерах, на сайтах или в блогах.

Автоматизация публикаций - основа эффективного SMM (Social Media Marketing / маркетинг в социальных сетях). В этой статье мы разберем, как написать на языке Go сервис, который будет одновременно отправлять посты в две популярные российские платформы: ВКонтакте (VK API) и быстро растущий национальный мессенджер МАКС (MAX API).

Мы будем использовать официальные HTTP-эндпоинты обеих платформ и стандартные библиотеки Go (Golang) для построения чистого и легко поддерживаемого решения. Перед тем как писать код, необходимо получить ключи доступа (токены) для обеих платформ.

VK
Настройка ВКонтакте (VK)
1. Перейдите на VK для разработчиков и создайте приложение (тип «Инструменты»)
2. В настройках приложения получите Токен доступа сообщества с правами wall и photos
3. Узнайте ID вашего сообщества (в API он передается со знаком минус, например -123456)
MAX
Настройка мессенджера МАКС (MAX)
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}

Готовы вас проконсультировать

Задайте интересующие вас вопросы специалистам компании