Пользователь
0,0
рейтинг
17 марта 2011 в 11:16

Автоматическое оповещение читателей о новостях с помощью ВКонтакте. Часть 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
Икс @xbreaker
карма
46,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (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/

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