Как правильно сделать пост на стене группы при помощи Вконтакте API wall.post?

Зарегистрировал вконтакте standalone приложение, получил токен при помощи урла:
https://oauth.vk.com/authorize?client_id=[тут id моего приложения]&scope=manage,groups,wall,offline&redirect_uri=oauth.vk.com/blank.html&response_type=token

Делаю запрос для поста на стене сообщества:
public function post(){
        $result['request']['url'] = 'https://api.vk.com/method/wall.post';
        $result['request']['params'] = array(
            'owner_id' => '-'.$this->owner_id,    // id сообщества
            'access_token' => $this->token,  // access_token
            'friends_only' => 0,
            'from_group' => 1,
            'message' => 'test post'
        );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $result['request']['url']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query( $result['request']['params'] ));
        $response = curl_exec($ch);
        $result['response'] = json_decode($response);

        return $result;
    }

Получаю следующий ответ:
[error_code] => 15
[error_msg] => Access denied: no access to call this method


В документации указанно, что доступ к wall.post имеют только standalone приложения, я его и зарегистрировал.
Подскажите, почему ВК не дает права на доступ к методу? Может я что-то упустил.
  • Вопрос задан
  • 5631 просмотр
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Токен нужно получить с того же IP, что и будет вызываться метод. Будете вызывать с сервера – надо получать токен, используя этот сервер как прокси для захода браузером в ВК.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
zorca
@zorca
Рабочий вариант:
<?php
CONST TOKEN = '?:%*?:%*?:%*?:%*?:%*';
$user_id = 666;
$text = 'Постим на страничку от имени Steelcat';
$image_name = 'steelcat.jpg';
$image = __DIR__ . DIRECTORY_SEPARATOR . $image_name;
$upload_url = vkAPI('photos.getWallUploadServer', ['owner_id' => $user_id])->response->upload_url;
try {
    $ch = curl_init($upload_url);
    $cfile = curl_file_create($image, mime_content_type($image), $image_name);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, ['photo' => $cfile]);
    $responseUpload = json_decode(curl_exec($ch));
    curl_close($ch);
    echo 'Картинка успешно загружена<br>';
} catch (Exception $e) {
    exit('Неизвестная ошибка при попытке загрузки картинки');
}
$responseSave = vkAPI('photos.saveWallPhoto', [
    'owner_id' => $user_id,
    'photo' => stripslashes($responseUpload->photo),
    'server' => $responseUpload->server,
    'hash' => $responseUpload->hash,
]);
if ($responseSave->error) {
    exit('Неизвестная ошибка при попытке сохранения картинки');
} else {
    echo 'Картинка успешно сохранена<br>';
}
$responsePost = vkAPI('wall.post', [
    'owner_id' => $user_id,
    'message' => $text,
    'attachments' => $responseSave->response[0]->id,
    'hash' => $responseSave->response[0]->hash,
]);
if ($responsePost->error) {
    if ($responsePost->error->error_code == 214) {
        exit('Стена закрыта для постинга');
    } else {
        exit('Неизвестная ошибка при попытке постинга');
    }
} else {
    echo 'Пост успешно добавлен';
}
function vkAPI($method, array $data = [])
{
    $params = [];
    foreach ($data as $name => $val) {
        $params[$name] = $val;
        $params['access_token'] = TOKEN;
    }
    $json = file_get_contents('https://api.vk.com/method/' . $method . '?' . http_build_query($params));
    return json_decode($json);
}
Ответ написан
SimBioT19
@SimBioT19
{{ user.about }}
Ничего не выйдет. Вы не можете вызывать с сервера метод wall.post. У ВК идет проверка ip.
Если ip, которому был выдан токен, не совпадает с ip, с которого идёт вызов метода — получите error.
Ответ написан
e-rentier
@e-rentier
А как вызвать с сервера получение токена?
Ответ написан
Ваш ответ на вопрос

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

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