Это копия моей оригинальной статьи, опубликованной на Хабре в 2011 году. Опубликована как есть, без изменений текста, поправлены только ссылки.

В первой части мы научились автоматически публиковать записи на нашу стенку, сегодня же добавим блекджек и шлюх возможность добавлять к ссылкам картинки автоматически. В этот раз я не буду приводить готовые 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

Первая часть