Задать вопрос
phtimofeeff
@phtimofeeff
МИРЭА Прикладная математика

VK API Error 15 & 100 при публикации фото на стену группы через WordPress: «Access denied» и «No photo given» при использовании токена сообщества?

Я разрабатываю плагин для WordPress (lakend-crossposter.php), который должен автоматически публиковать посты из блога в VK (стена группы). Использую официальный PHP SDK (vkcom/vk-php-sdk). Возникла проблема с загрузкой изображений: пост уходит, но без картинки. В логах две ошибки VK API:
1.
Access denied: no access to call this method. It cannot be called with current scopes. (Code: 15)

2.
One of the parameters specified was missing or invalid: Violated: link_photo_sizing_rule. No photo given (Code: 100)


Контекст и архитектура:
Плагин WordPress использует стандартные хуки (publish_post) для отправки.
Версия VK API: 5.131.
Токены:
group_token: Токен сообщества (используется для вызова wall.post).
user_token: Токен пользователя (планировался для загрузки фото, но сейчас не используется).
Сценарий: Плагин пытается загрузить миниатюру поста и прикрепить её к посту на стене.
Фрагменты кода (упрощенно):
Вот как происходит загрузка фото и отправка поста в классе CPA_VKontakte:

1. Инициализация и проверка токенов (__construct):
public function __construct() {
    $options = get_option('cpa_settings');
    $this->group_token = $options['vk_group_token'] ?? '';
    $this->group_id = $options['vk_group_id'] ?? '';
    // user_token загружается, но дальше не используется для фото
    error_log('CPA VK Construct: group_token ' . (!empty($this->group_token) ? '✅ найден' : '❌ отсутствует'));
}


2. Основной метод отправки (send_post):
public function send_post($post, $is_anniversary = false) {
    // ...
    $params = [
        'owner_id' => -intval($this->group_id),
        'from_group' => 1,
        'message' => $message,
        'v' => $this->api_version
    ];

    // Пытаемся загрузить фото (использует group_token)
    $attachments = $this->upload_post_attachments($post->ID);
    if (!empty($attachments)) {
        $params['attachments'] = implode(',', $attachments);
    } else {
        // Если нет фото, добавляем ссылку как вложение
        $params['attachments'] = get_permalink($post);
    }

    // Отправляем пост используя group_token
    $response = $this->vk->wall()->post($this->group_token, $params);
    // ...
}


3. Метод загрузки фото (upload_post_attachments):
private function upload_post_attachments($post_id) {
    // ...
    // ⚠️ ИСПОЛЬЗУЕМ ТОЛЬКО ТОКЕН СООБЩЕСТВА ДЛЯ ЗАГРУЗКИ ФОТО
    if (empty($this->group_token)) { /* ... */ }

    // 1. Получаем сервер для загрузки (через group_token)
    $upload_server = $this->vk->photos()->getWallUploadServer($this->group_token, [
        'group_id' => intval($this->group_id)
    ]);

    // 2. Скачиваем и загружаем файл на сервер VK
    $temp_file = $this->download_image($photo_url);
    $upload_response = $this->upload_file_to_vk($upload_server['upload_url'], $temp_file);

    // 3. Сохраняем фото на стене группы (тоже через group_token)
    $save_response = $this->vk->photos()->saveWallPhoto($this->group_token, [
        'group_id' => intval($this->group_id),
        'photo' => $upload_response['photo'],
        'server' => $upload_response['server'],
        'hash' => $upload_response['hash']
    ]);
    // ...
}


Логи:
[22-Feb-2026 09:57:41 UTC] CPA VK Construct: group_token ✅ найден
[22-Feb-2026 09:57:41 UTC] CPA VK Construct: group_id 236177157
[22-Feb-2026 09:57:41 UTC] CPA VK Construct: VK API client initialized
[22-Feb-2026 09:57:41 UTC] CPA VK (Post ID: 302): Photo upload failed: Access denied: no access to call this method. It cannot be called with current scopes. (Code: 15)
[22-Feb-2026 09:57:41 UTC] CPA VK (Post ID: 302) [DEBUG]: Sending post to VK...
[22-Feb-2026 09:57:41 UTC] CPA VK (Post ID: 302): VK API Error: One of the parameters specified was missing or invalid: Violated: link_photo_sizing_rule. No photo given (Code: 100)


Вопрос:
Ошибка Code: 15 возникает на этапе getWallUploadServer или saveWallPhoto (это видно по логу "Photo upload failed"). Я использую токен сообщества для всех вызовов, включая загрузку фото.
Почему токен сообщества, который успешно работает для wall.post (логов об ошибке wall.post нет), не имеет прав (scopes) для вызова photos.getWallUploadServer и photos.saveWallPhoto?
Документация VK гласит, что для загрузки фото на стену группы нужны права photos и wall, а также токен сообщества или пользователя с правами редактора. Токен сообщества генерировался в настройках сообщества с галочками напротив photos и wall. Этого недостаточно?
Нужно ли мне обязательно использовать токен пользователя (user_token) для шагов загрузки фото (получение сервера и сохранение), или проблема в другом (например, в правах самого приложения VK ID)?
Заранее спасибо за помощь! Полный код классов плагина приложил к вопросу для контекста.
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Skillbox
    Профессия PHP-разработчик с нуля до PRO
    7 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
для загрузки фото надо использовать user_token group_token для этого не работает
https://dev.vk.com/ru/method
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы