В недавнем времени появилась задача постить на стены пользователей и групп вконтакте посты с вложением картинок и ссылок.
Были опробованы различные готовые решения, но полноценных рабочих вариантов так и не было найдено.
Среди таких решений стоит выделить разработку пользователя xbreaker — класс vk.wallpost. В этой реализации работал постинг с вложением ссылок, но с картинками были проблемы — они не закачивались. Попытавшись доработать класс vk.wallpost, желаемого результата я так и не получил. Запросы к ВК в этом модуле делаются через небезызвестный PHP модуль CURL. Именно в нём, как мне показалось, и была проблема при закачке картинок, возможно просто не удалось настроить его должным образом. Помимо этого, проблемой было и то что в PHP нет хорошего модуля для программного server-side «браузера», такого например как WWW::Mechanize в Perl. Оценив все «за» и «против» я взялся написать свой модуль для управления аккаунтом в ВКонтакте, но уже на языке Perl.
Итак, перейдём непосредственно к разработке VK.pm.
Для наглядности приведу пример использования. В самом кратком варианте это выглядит так:
use VK;
my $vk = VK->new('vkaccount@email.com', 'mypassword', undef, 1234);
print $vk->wallPost(
message => "Hello World!",
link => "http://code.google.com/p/vkontakte-non-api-manager",
photo => "sample.jpg"
)?':-)':':-(';
Далее более подробный и полный пример с комментариями:
use VK;
# последние 4 цифры вашего телефона привязанного к аккаунту вК
my $security_code = 1234;
# если хотим работать со стеной группы указываем вместо undef адрес стенки (напр. "/mygroupaddress")
my $walluri = undef;
# логинимся (email/телефон, пароль)
my $vk = VK->new('vkaccount@email.com', 'mypassword', $walluri, $security_code);
print $vk->wallPost(
message => "Hello World!", # наш пост собственно
#to_id => 1234456, # id стенки/юзера куда хотим постить, если пусто то себе или в группу
link => "http://code.google.com/p/vkontakte-non-api-manager", # ссылка
link_title => "This is the title of the link popup", # заголовок во всплывающем окне ссылки
link_desc => "This is the content of link popup", # контент для всплывающего окна ссылки
signed => '', # 1/0 - подписывать или нет посты
photo => "sample.jpg", # фотка, имя файла для поста
album => "This is the new album", # название альбома куда качать фоту, создаст альбом если его нет
album_desc => "This is description of a new album", # описание альбома
album_view => 0, # виден альбом: 0-всем, 1-друзьям, 2-друзьям друзей, 3-себе
album_comments => 0, # каменты к альбому: 0-всем, 1-друзьям, 2-друзьям друзей, 3-себе
)?':-)':':-(';
Как видно, код ничего сложного из себя не представляет, можно сразу использовать. Отмечу лишь что $security_code нужен для случаев когда ВК предполагает что мы «робот» и просит ввести последние 4 цифры номера телефона. Возможно иногда ВК требует и капчу, пока не попадалась.
Сам модуль VK.pm реализован через упомянутый выше модуль WWW::Mechanize и его расширение WWW::Mechanize::GZip для обработки «сжатых» страниц. Никакого API вконтакта мы не используем, соответственно никаких ключей нам получать не нужно. Через скриптовый браузер мы эмулируем действия реального пользователя зашедшего в свой аккаунт.
Дополнительно имеется ещё несколько функций которые могут оказаться полезными:
# создание альбома
$vk->createAlbum("Название альбома", "Описание альбома");
# закачиваем фото в альбом
$vk->addPhoto("photo.jpg", "Название альбома куда положить фото", "Описание альбома", 0, 0);
# если вдруг нужно залогиниться в другой акк
$vk->login('vkaccount@email.com', 'mypassword', $walluri, $security_code);
Если не указывать название альбома при закачке картинок, то модуль создаст его сам с названием "#shared".
В будущем предполагается дополнить модуль дополнительными функциями управления аккаунтом.
Пока это всё.
Исходный код с примерами можно найти здесь:
code.google.com/p/vkontakte-non-api-manager
Спасибо за внимание. Буду рад если модуль окажется полезен.
Автор: leonmedia
Не понял а как это использовать?