# VK API: Опубликовать пост с картинкой в сообществе

Сценарий из mcp-everything. Актуально на 2026-10-24.

Автопостинг: новости, акции, новые товары — на стену сообщества от его имени.

1. Нужен ключ пользователя — администратора сообщества (wall.post и загрузка фото на стену не работают с ключом сообщества).
2. Получи адрес загрузки: POST /method/photos.getWallUploadServer с group_id. Загрузи файл на upload_url полем photo в multipart-форме.
3. Сохрани фото: POST /method/photos.saveWallPhoto с group_id и значениями photo, server и hash из ответа сервера загрузки. В ответе — owner_id и id фото.
4. Опубликуй пост: POST /method/wall.post с owner_id = -ID сообщества (со знаком минус), from_group = 1, message и attachments = photo<owner_id>_<id>. Для отложенной публикации добавь publish_date в Unix-времени.

```bash
UPLOAD=$(curl -s https://api.vk.ru/method/photos.getWallUploadServer -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d group_id=123456 -d v=5.199 | jq -r .response.upload_url)
R=$(curl -s -F "photo=@promo.jpg" "$UPLOAD")

SAVED=$(curl -s https://api.vk.ru/method/photos.saveWallPhoto -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d group_id=123456 -d v=5.199 \
  --data-urlencode "photo=$(echo "$R" | jq -r .photo)" -d "server=$(echo "$R" | jq -r .server)" -d "hash=$(echo "$R" | jq -r .hash)")

curl https://api.vk.ru/method/wall.post -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d owner_id=-123456 -d from_group=1 -d v=5.199 \
  --data-urlencode 'message=Скидка 20% на всё до воскресенья!' \
  -d "attachments=photo$(echo "$SAVED" | jq -r '.response[0].owner_id')_$(echo "$SAVED" | jq -r '.response[0].id')"
```

## Базовые URL

- Боевой: `https://api.vk.ru`
- URL метода: `https://api.vk.ru/method/<имя-API-метода>`

## Авторизация

Тип: Bearer-токен

Ключ доступа передаётся в каждом запросе в заголовке `Authorization: Bearer <КЛЮЧ_ДОСТУПА>`. Тип ключа указан у каждого метода: ключ пользователя, ключ сообщества или сервисный ключ приложения.

Ответ:

```
curl 'https://api.vk.ru/method/users.get' \
  -H 'Authorization: Bearer <КЛЮЧ_ДОСТУПА>' \
  -F 'user_ids=743784474' \
  -F 'fields=bdate' \
  -F 'v=5.131'
```

## Методы сценария

### POST /method/wall.post — Публикация записи на стене

Ключ: пользователя. Также публикует предложенные и отложенные записи.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `v` | body | string | да | Версия API |
| `owner_id` | body | integer | нет | ID пользователя или сообщества (со знаком минус) |
| `message` | body | string | нет | Текст записи; обязателен, если нет attachments |
| `attachments` | body | array | нет | Вложения <owner_id>_<media_id> через запятую; обязательны, если нет message |
| `from_group` | body | boolean | нет | 1 — публикация от имени сообщества |
| `signed` | body | boolean | нет | Подписать запись именем автора (для from_group=1) |
| `publish_date` | body | integer | нет | Дата отложенной публикации, Unix time |
| `friends_only` | body | boolean | нет | Только для друзей |
| `post_id` | body | integer | нет | ID отложенной или предложенной записи для публикации |
| `mark_as_ads` | body | boolean | нет | Пометить как рекламу |
| `close_comments` | body | boolean | нет | Закрыть комментарии |

### POST /method/photos.getWallUploadServer — Адрес для загрузки фото на стену

Ключ: пользователя. Дальше файл загружается на полученный адрес, затем сохраняется методом `photos.saveWallPhoto`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `v` | body | string | да | Версия API |
| `group_id` | body | integer | нет | ID сообщества, на стену которого загружается фото |

### POST /method/photos.saveWallPhoto — Сохранение загруженного фото

Ключ: пользователя.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `v` | body | string | да | Версия API |
| `photo` | body | string | да | Значение photo из ответа сервера загрузки |
| `server` | body | integer | нет | Значение server из ответа сервера загрузки |
| `hash` | body | string | нет | Значение hash из ответа сервера загрузки |
| `user_id` | body | integer | нет | ID пользователя-владельца стены |
| `group_id` | body | integer | нет | ID сообщества-владельца стены |
| `caption` | body | string | нет | Описание фото, до 2048 символов |

## Нюансы

- HTTP-методы GET и POST равнозначны; только HTTPS.
- Обязательный во всех запросах параметр `v` — версия API. В документации указана актуальная версия 5.131, а официальная JSON-схема методов VK описывает версию 5.199.
- Тело POST — `application/x-www-form-urlencoded` или `multipart/form-data` (для файлов и данных больше 2 КБ); `application/json` не поддерживается.
- Имя метода чувствительно к регистру.
- Общие параметры для всех методов: `lang` (`ru`, `uk`, `be`, `en`, `es`, `fi`, `de`, `it`) и `test_mode=1`.
- ID сообщества в `owner_id` передаётся со знаком минус.
- Кроме ограничений частоты есть закрытые количественные лимиты на однотипные методы: при превышении метод может стать временно недоступен или потребовать капчу.

## Другие сценарии

- [Бот сообщества: принимать сообщения через Long Poll](https://mcp-everything.ru/integrations/vk-api/scenarios/bot-soobschestva-prinimat-soobscheniya.md)
- [Кнопки в боте сообщества](https://mcp-everything.ru/integrations/vk-api/scenarios/knopki-v-bote-soobschestva.md)
- [Узнать данные пользователя или сообщества по ссылке](https://mcp-everything.ru/integrations/vk-api/scenarios/uznat-dannye-polzovatelya-ili.md)
- [Выгрузить участников сообщества](https://mcp-everything.ru/integrations/vk-api/scenarios/vygruzit-uchastnikov-soobschestva.md)

---

Если этого недостаточно — официальная документация: https://dev.vk.com/ru/api/api-requests
Вся интеграция одним документом: https://mcp-everything.ru/integrations/vk-api.md
