Это копия моей оригинальной статьи, опубликованной на Хабре в 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