mirror of
https://gitverse.ru/kpa39l/md2vk.git
synced 2026-09-29 01:50:04 +00:00
83 lines
5.2 KiB
Markdown
83 lines
5.2 KiB
Markdown
# md2vk — Взаимодействие с VK API
|
||
|
||
> Источник: официальная документация VK (dev.vk.com / id.vk.ru), проверено 2026-09.
|
||
> Услуга работает через официальный протокол OAuth 2.0 и VK API — никакого «взлома».
|
||
|
||
## Как это работает
|
||
|
||
1. **OAuth-авторизация.** Пользователь нажимает «Прикрепить аккаунт» → редирект на VK.
|
||
Пользователь подтверждает вход и выдаёт приложению права (scopes, обязателен `wall`).
|
||
Сервис не получает пароль — только временный код/токен.
|
||
2. **Access Token.** VK возвращает сервису access token — цифровой ключ с ограниченными правами
|
||
(например, только публикация записей).
|
||
3. **Публикация через API.** Сервис вызывает `wall.post` с текстом/вложениями, `owner_id`, `from_group`.
|
||
Авторизация — `access_token` в параметрах запроса.
|
||
|
||
## Ссылки на официальную документацию
|
||
|
||
| Что | Ссылка |
|
||
|-----|--------|
|
||
| Создание и настройка приложения (VK ID, Standalone) | https://id.vk.com/about/business/go/docs/ru/vkid/latest/vk-id/connection/create-application |
|
||
| Общая документация по API | https://dev.vk.com/ru/reference |
|
||
| Авторизация (OAuth 2.0/2.1) | https://id.vk.com/about/business/go/docs/ru/vkid/latest/vk-id/connection/start-integration/auth-without-sdk/auth-without-sdk-web |
|
||
| Метод wall.post | https://dev.vk.com/ru/method/wall.post |
|
||
| Создать приложение (dev.vk.com) | https://dev.vk.com |
|
||
|
||
## OAuth-флоу (ссылка для получения токена)
|
||
|
||
```
|
||
https://oauth.vk.com/authorize?client_id=<client_id>&scope=wall,offline&redirect_uri=<redirect>&response_type=token
|
||
```
|
||
|
||
- `client_id` — ID приложения VK (см. VK ID).
|
||
- `scope` — обязателен `wall`; `offline` — долгоживущий токен.
|
||
- `response_type=token` — токен приходит в фрагменте редиректа.
|
||
- После ответа: `access_token`, `user_id`, `expires_in` (0 = бессрочно).
|
||
|
||
## Публикация (wall.post)
|
||
|
||
```
|
||
https://api.vk.com/method/wall.post
|
||
POST data: access_token, v=5.199, owner_id, message, from_group, attachments, publish_date, format_data
|
||
```
|
||
|
||
Параметры в нашем клиенте (`app/vk_client.py`):
|
||
|
||
| Параметр | Когда | Значение |
|
||
|----------|-------|----------|
|
||
| `owner_id` | группа | отрицательный ID сообщества (`-123`), для пользователя не передаём |
|
||
| `from_group` | группа | `1` — пост от имени группы |
|
||
| `friends_only` | опц. | только друзьям |
|
||
| `publish_date` | отложка | Unix timestamp |
|
||
| `attachments` | опц. | `photo123_456,...` |
|
||
| `signed` | группа | подпись автора |
|
||
| `format_data` | всегда | JSON `{"version":1,"items":[...]}` |
|
||
|
||
Ответ: `{"response":{"post_id":N,"owner_id":M}}` → URL `https://vk.com/wall{M}_{N}`.
|
||
|
||
### Важно про токены
|
||
|
||
- Для **личной стены** — токен пользователя.
|
||
- Для **стены сообщества** — токен **администратора группы** с правами `wall` и `photos`.
|
||
- Токены сообщества из настроек группы («Работа с API») для `wall.post` **не подходят** —
|
||
нужен именно пользовательский токен.
|
||
|
||
## Лонгриды (статьи) — ограничение
|
||
|
||
- **Создавать статьи через официальный VK API нельзя.** В FAQ VK: «методов для работы с лонгридами пока что нет».
|
||
- Можно **опубликовать на стене существующую статью** через `wall.post`:
|
||
`attachments=articleXXX_YYY`, где `XXX` — ID автора (для сообщества — с минусом), `YYY` — ID статьи.
|
||
Статья должна быть уже опубликована (черновик прикрепить нельзя).
|
||
- Значит, полный автоматический дубликат блога (генерация лонгридов «из коробки») невозможен.
|
||
Варианты: посты+фото+ссылки через API, статьи вручную, гибрид.
|
||
|
||
## Версия API
|
||
|
||
- В конфиге `VK_API_VERSION=5.199` (`app/config.py`).
|
||
- Проверка токена: `users.get` (пустой user_ids → текущий пользователь).
|
||
|
||
## Ошибки
|
||
|
||
Формат ошибки VK: `{"error":{"error_code":N,"error_msg":"..."}}`.
|
||
Наш клиент бросает `VkApiError(error_code, error_msg)`; в API публикации ошибка пишется в
|
||
`publications.error_message`, ответ `success=false`. |