Как опубликовать сообщение с картинкой вложением на стене профиля ВКонтакте (Open API)

Итак, для начала отмечу, что некоторое описание процесса загрузки файлов на сервера социальной сети ВКонтакте с помощью VKontakte Open API дано на вот этой веб-страничке — http://vk.com/dev/upload_files?f=Загрузка фотографий на стену пользователя.

Размещение картинки на стене пользователя ВКонтакте

Для начала зарегистрируйте свое приложение для ВКонтакте. Как это сделать я уже описывал ранее.

А теперь давайте на практике, что называется посмотрим, вот собственно код:

<script src="http://yandex.st/jquery/2.0.1/jquery.min.js"></script>

<!-- Подключение Open API -->
<script src="http://vk.com/js/api/openapi.js" type="text/javascript"></script>

<a onclick="RedBookCMSvkPosting();" href="#">Опубликовать на стене профиля сообщение с вложенной картинкой</a>

<script language="javascript">
VK.init({
    apiId: **65*** /* сюда выписываем идентификатор приложения */
});

function RedBookCMSvkPosting() {

    VK.Auth.login(function(response) {

        if (response.session) {

            var userId = response.session.mid;
            var content = "VK Open API проверка автопостинга." +
            "Ссылка http://red-book-cms.ru " + 
            "Более 1 ссылки в сообщении размещать запрещено вроде бы, - вылезет капча.";

            VK.Api.call('photos.getWallUploadServer', {group_id: userId}, function(r) {

                if (r.response) {

                    $.post('upload.php', {
                        url: r.response.upload_url
                    }, function (data) {

                        var p = JSON.parse(data);

                        VK.Api.call('photos.saveWallPhoto', {
                            user_id: userId,
                            group_id: userId,
                            photo: p.photo,
                            server: p.server,
                            hash: p.hash
                        }, function (s) {
                            VK.Api.call('wall.post', {message: content, attachments: s.response[0].id}, function(r) { }); 
                        }); // / photos.saveWallPhoto()

                    });

                } 

            }); // / photos.getWallUploadServer()

        }

    }, 4); // / VK.Auth.login()

}
</script>

1. Цифра 4 в одной из последних строк означает права доступа приложения к фотографиям пользователя, — читайте http://vk.com/dev/permissions.

2. По второму шагу, вот где строчки

Приложение формирует POST-запрос на полученный адрес.
Запрос должен включать поле photo, содержащее файл с изображением (JPG, PNG, BMP или GIF)

в официальной документации.

Скрипт на PHP, файл upload.php, собственно он и загружает на сервер ВКонтакте нашу картинку, возвращает ответ в  JSON-формате с сервера социальной сети, где мы уже с помощью JSON.parse() извлекаем часть входных параметров для метода photos.saveWallPhoto(), позже вызвав wall.post():

<?php
if (isset($_POST["url"])) {

    $upload_url = $_POST["url"];

    $post_params['photo'] = '@' . 'kartinka.jpg'; // kartinka.jpg к примеру лежит в той же папке, что и наш upload.php

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $upload_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
    $result = curl_exec($ch);
    curl_close($ch);

    echo $result;

}
?>

3. Из нюансов, внимание это очень важно!

В документации к методу photos.saveWallPhoto() содержится ошибка, в частности входные параметры user_id и group_id также являются обязательными, и в нашем случае т.к. мы публикуем на стену пользователя, а не группы, пишем в group_id наш user_id. Если этого не сделать будет возвращаться код ошибки 121, что означает неверный хэш.

Ну а так в общем-то все.

Опубликовано 22-07-2014 в 13:12


Комментариев к записи: 5

  1. nob:

    Спасибо за код. Но скажите, почему браузеры блокируют окно добавления записи на стену?

    • Администратор:

      Да, я тоже заметил такой косяк… на рабочем проекте. Разберусь с текучкой и буду смотреть, что там можно сделать.

    • Администратор:

      VK.Api.call('wall.post') создает окно (подтверждение публикации на стене пользователя), чтобы браузер его не блокировал, оно должно создаваться по событию onclick.

  2. Padavan:

    ВК присылает ошибку «security breach2″ во время отправки картинки с сервера. Никто не знает, в чем может быть дело?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>











Свежие комментарии

  • krasnov8953: к записи Не работает как мне кажется строчка $newTvId = $ »
  • Dimanski: к записи ничего не понимаю. Ставлю ModX на хостинг r01.ru »
  • Дмитрий: к записи Спасибо! Очень выручили. С битриксом беда, а прав »
  • леонид: к записи как сделать что были в ряд? у меня получается по о »
  • Администратор: к записи Статический IP. »
  • Steel: к записи Администратор, вы данную проблему решили подключен »
  • Дмитрий: к записи Хотел узнать как прикрутить данное окно (http://re »

Blogroll:

  • Архитектурный декор. Предлагаем кладочный бутовой камень купить оптом. →

Последние твиты