Автоматическое оповещение читателей о новостях с помощью ВКонтакте. Часть 2

  • Tutorial
Первая часть

В первой части мы научились автоматически публиковать записи на нашу стенку, сегодня же добавим блекджек и шлюх возможность добавлять к ссылкам картинки автоматически. В этот раз я не буду приводить готовые php функции, так как они описаны в первой части, а сейчас лишь буду описывать нужные нам php-файлы и параметры, которые нужно передавать им.

После первой части я получил большое количество сообщений, большая часть из которых посвящалась тому, что я продемонстрировал в статье возможность публикации на собственной стенке, а автоматическую публикацию на стене Группы или Официальной странице я не показал. Поэтому я начну с того, какие параметры нужно для этого передавать.

Официальная страница


Вы должны входить в состав администраторов страницы для возможности публикации новостей. Рассмотрим нужны нам параметры, которые передаются al_wall.php при публикации простого сообщения:
act => 'post', 'delete'
al => 1
facebook_export => ''
status_export => ''
friends_only => ''
hash => ''
message => ''
note_title => ''
official => ''
to_id   => ''
type => 'all'
media   => ''
media_type => 'photo'

  • В параметре act мы передаем необходимо действие — либо 'post' для публикации сообщения, либо 'delete' для его удаления. Причем, при удалении необходимо так же передать параметр 'post', который содержит id страницы и порядковый номер сообщения на стенке, например, 11111_32;
  • Параметры facebook_export и status_export служат для экспорта в сервисы Facebook и Twitter, если таковые прилинкованы к странице;
  • Параметр hash нам уже знаком, его можно найти при открытии страницы или группы в блоке с параметрами под названием post_hash;
  • Стоит заметить, что параметр note_title опускается, то есть заметки создано не будет, вместо этого вашу запись обрежут, если она превысит допустимый размер;
  • В to_id стоит передавать ваш id Официальной страницы или группы со знаком минус впереди, например, '-11111';
  • Осталось рассмотреть media и media_type, в первом следует передавать внутреннюю ссылку на нужный объект, а во втором его тип. Например, media => '1111_1213232213', media_type => 'photo'. В данном случае к записи будет прикреплена указанная фотография. Тип так же может быть 'audio', 'video'. Если передать тип 'share', а в 'media' указатель на фото, то в сообщении-ссылке данная фотка будет в подсказке. Только нужно не забыть добавить еще три известных нам параметра для ссылки — url, title и description

Увы, но пока я не нашел способа публиковать сообщение-фото совместно с сообщением-ссылкой как это сделано на страничке Хабрахабр ВКонтакте.

Загрузка фотографии


На самом деле при загрузке картинки главное не забывать о прокси, а дальше все достаточно просто. Итак, чтобы загрузить картинку мы воспользуемся файлом share.php, который предназначен для публикации внешних ссылок. Вот пример POST параметров, которые необходимо на него передать:

act => a_photo
url =>
image =>
extra =>

В параметре url передаете вашу ссылку, в параметре image — ссылку на нужную картинку, а парамерт extra можно проигнорировать. Отмечу, что если вы используете CURL, как я в прошлой части, то не забудьте следующее:
curl_setopt($ch, CURLOPT_REFERER, 'http://vkontakte.ru/share.php');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Второй параметр нам нужен, так как после отправки POST запроса, share.php перенаправит запрос (путем возврата 302 ошибки и передачи параметра Location) на upload.php с нужным сервером и необходимыми параметрами, рассматривать которые, я думаю, не имеет смысла. В свою очередь upload.php перенаправит запрос на complete.php, который, в зависимости от успеха, выдаст либо ошибку, либо нужный нам результат.

Вариант с ошибкой:
<script type="text/javascript">
document.domain = location.host.toString().match(/[a-zA-Z]*\.[a-zA-Z]*$/)[0];
parent.onUploadFail(0, 'Неизвестная ошибка');
</script>

Это значит, что скорее всего ваша ссылка на картинку неверна или невалидна. Вариант, который нам нужен выглядит так:
<script type="text/javascript">
document.domain = location.host.toString().match(/[a-zA-Z]*\.[a-zA-Z]*$/)[0];
parent.onUploadDone(0, {"user_id":1234567,"photo_id":235889241});
</script>

Вот он, тот самый photo_id, который нужно передавать при размещении фотографии на стенке, в данном случае полный составной id: 1234567_235889241. Просто, неправда ли?

Чтобы получить прямой путь к загруженной фотке необходимо послать запрос к al_photo.php, с работой которого я пока до конца не разобрался, в частности пока не ясно какой именно hash он требует для проверки запроса. Если кто-то разберется — сообщите:).

Стоит заметить, что можно разместить ссылку с картинкой в подсказке не только через al_wall.php как я описал выше, но и через share.php, для этого нужно снова послать запрос к share.php с большим количеством параметров. Поставлю коментарии, там где могут возникнуть трудности:
act: 'a_submit'     // метод
hash: shareHash     // параметр функции onDomReady, который можно найти на странице share.php при открытии, полное название window.shareHash
title:              // наименование заметки
url:                // ссылка
share_title:        // название статуса
share_text:         // описание статуса
share_comment:      // ваш комментарий
image_url:          // ссылка на картинку, если загрузка картинки вернула onUploadFail
photo_owner_id:     // id загрузившего фото
photo_id:           // id, полученный нами выше
privacy_note: 0     // можно просто поставить 0
privacy_notecomm: 0 // можно просто поставить 0
to_status: 1        // 1, если публикуем статус
status_export:      // экспорт статуса в твиттер
to_note:            // пусто, если публикация в статус и 1, если в заметку

Вообще через share.php можно публиковать видео и аудио, загружать их на сервер через параметры extra и extra_data, однако я не вижу в этом острой необходимости.

Думаю, что пока этого более чем достаточно, когда найду способ совмещения в одном сообщении ссылки и фото, то напишу каким образом это можно сделать. Или буду надеяться, что они откроют такую функциональность для Групп и Официальных страничек. Замечу только, что если загружать фотку через интерфейс ВКонтакте на Официальной странице, то photo_id будет присвоен вида '[-id страницы]_[номер_фото]', а при просмотре фотки Автором будет ваша страница или группа.

Такого эффекта можно добиться и через скрипт, если передавать параметры не на share.php, а напрямую на upload.php, но в этом случае нам нужно знать еще кучу параметров, в том числе два разных hash-параметра, поэтому этот способ я рассматривать не стал.

Отдельная просьба задавать вопросы по теме в комментариях, а не через личную почту, потому что большинство вопросов одинаковы и приходится объяснять одно и то же каждый раз :).


UPD: По просьбам в комментариях набросал простенький класс и пример использования.
Брать тут: github.com/xbreaker/vk.wallpost
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 27
  • +3
    А не могли бы вы выложить готовый пример?
    • 0
      да, конечно, вечером выложу на github
    • 0
      Очень круто, но непонятно как реализовать, потому что знания php очень поверхностные.
      Присоединяюсь к witka, если бы был готовый пример, моих навыков хватило бы, чтобы его подкрутить и сделать экспорт новостей в группу (о чем я давно мечтаю).
      • 0
        Реализовать можно на любом удобном языке, поэтому я и описал необходимые параметры. А пример сделаю, вечером будет
      • 0
        Не отказался бы от 3й части, где бы рассказывалось, как сделать экспорт на стенку пользователя, если он дал на это дабро (API\логин-пароль).
        Что то типа как контакт делает экспорт в твиттер.
        • 0
          Добро пишется через «о» :]

          Айрату спасибо за материал, ценно!
          • 0
            Судя по оценкам материал не очень то понравился, поэтому пока не знаю, стоит ли писать третью часть или нет :)
            • 0
              Может не понравилась по причине ее не раскрытости. Если бы допилили к первому примеру вставку картинок, получение данных не через логин-пароль, а через API то было бы здорово. Если не будите писать 3ю часть, но будет изменение в коже, пришлите пожалуйста в ЛС.
              • 0
                В этой статье есть про вставку картинок, про автоматическую загрузку картинок. В статье нет только про совмещение в сообщении фотки и ссылки, но такой возможности пока нет, она не описана в исходных кодах, поэтому и допиливать в плане этого пока нечего.

                Вы видимо не понимаете суть рассматриваемых вожможностей — работа через API подразумевает работу через приложение и большинство описанных действий там придется реализовывать через функции, которые итак достаточно описаны в документации. Да и API нужен для работой с пользователем, а у моих статей — совсем другая задача и без логина/пароля там не обойтись :)

                Даже рабочий пример есть, совмещающий возможности первой и второй статьи.
          • 0
            В вашем примере есть ошибки.
            1) _curl_init возвращает объект, однако он нигде не присваивается и не используется.
            2) пост фотографии
            не хватает амперсанда в параметрах

            $q = 'act=a_photo&url='.$u.'&image='.$i.'&extra=0&index=1';

            А так спасибо, облегчили работу.
            • 0
              И Вы сделали pull на github и исправлением? :)
            • 0
              в частности пока не ясно какой именно hash он требует для проверки запроса. Если кто-то разберется — сообщите:).

              Для act=save_photos hash альбома к которому привязана фотка.
              Меня больше всего сейчас интересует как проверить существование альбома по имени альбома.
              • 0
                Гы нашёл как. :) Они пытались это убрать везде где возможно но кое где оставили. :))
                • 0
                  Ну так поделитесь :)
                  • 0
                    Нужно открыть на редактирование любое изображение и там в коде для javascript будет список всех всех обоев, только немного порезаны по длине.
                    post_params["act"] = "edit_desc"
                    post_params["al"] = "1"
                    post_params["photo"] = "-%i_%i" % (group_id, photo_id)
                    c.setopt(pycurl.URL, "http://vkontakte.ru/al_photos.php")


                    а там ищем «var albums = „

                    Я свою систему на Python для всего этого дела написал, с набором функций и прочим.
                    Мне новости класть не нужно было у меня основной уклон в публикаций фото в альбомы, создание альбомов и прочее.
                    • 0
                      Всех всех имён альбомов я хотел сказать с указанием их id.
                    • 0
                      Я ещё кое, что выяснил — если нам надо получить список ВСЕХ изображений в альбоме с их подписями (которые к слову можно анализировать) то надо попасть на vkontakte.ru/album-${group_id}_${album_id}?act=edit главное get запрос edit. ^_^ Это даёт по истине безграничные возможности анализу, правкам и выкладыванию контента. Тут главное везде паузы ставить! ;)
                      • 0
                        Спасибо большое, тоже поковыряю) Я всегда делаю паузы по 15 секунд :).
                • 0
                  Скрипт работает отлично, единственный момент — картинки не загружаются.
                  В функции uploadPhoto
                  • 0
                    Скрипт работает отлично, единственный момент — картинки не загружаются.
                    В функции uploadPhoto
                    $r = $this->execCurl($c, 'uploadPhoto');
                    возвращает resource(7) of type (curl)

                    нужно ли создавать на публичной странице какой-то фотоальбом, куда будут закачиваться изображения?
                    • 0
                      вы разобрались с загрузкой картинок?
                      • 0
                        Обращался к разработчику он обещал посмотреть и пропал. А у меня тоже руки не дошли. Да я забыл, черт надо бы покопаться. Если что-то будет — я сообщу. Ну Вы тоже напишите, если проблему решите:)
                        • 0
                          Да, видимо ВКонтакте что-то поменял опять.

                          Я больше JS прогер, чем PHP, так что врядли у меня что-то получится (
                  • 0
                    Еще ошибка: вот тут github.com/xbreaker/vk.wallpost/blob/master/vk.wallpost.php строчка №394, несуществующая функция pr(). Опечатка?
                    • 0
                      У кого-нибудь есть косяки с ссылкой?
                      Простой текст (материал) нормально добавляется в группу, но нету ссылки на оригинал, на сайте он присутствует. Приходиться добавлять прямо в текст, но там уже при клике пишет о безопасности и т.д.
                      • 0
                        А может кто-нить готовый плагин для WP напишет? :)
                        • 0
                          Повозился с закачкой картинок, получилось сделать через мобильную версию VK — Возможно это поможет автору. Мне на php реализовать не удалось. А вот на Perl неплохой модуль получился: habrahabr.ru/post/144702/

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Интересные публикации