При создании информационных ресурсов часто приходится задумываться об автоматизации рутиной работы. В данной статье рассмотрим простой способ, при помощи нескольких строк Perl, как новости, спецпредложения, или другую полезную информацию, выложить на свою страничку или группу в соцсетях (Вконтакте). При этом с картинкой, текстом и ссылкой.
Краткий план:
1. Создаём приложение вконтакте.
2. Генерим Токен к приложению
3. Получаем URL сервера для закачивания картинок.
4. Закачиваем картинку на полученный ранее сервер.
5. Сохраняем картинку на сервере.
6. Вывешиваем новость с картинкой на страничку.
1. создаём приложение на сайте вконтакта.
Внизу сайта ссылка Разработчикам, и кнопка Создать Приложение.
Выбираем название и Standalone-приложение.
После создания на вкладке Настройки редактирования Приложения вы увидите ID вашего приложения.(запомнить).
2. Получаем Токен (ключь с помощью которого созданный скрипт будет авторизовываться на сайте). Для этого в браузере открываем страничку:
https://oauth.vk.com/authorize?client_id={ID}&scope=wall,photos,audio,video,docs,notes,groups,messages,notifications,stats,ads,notify,friends,offline&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token
, где
{ID} — id созданного приложения, например 1234563,
scope — это права для вашего приложения, что ему будет разрешено.
(wall -постить на стену, photos — закачивать фото, groups — доступ к группам, messages — отправлять сообщения, friends — доступ к друзьям и offline — для того чтобы ключь Токен никогда не заканчивался и скрипт всегда мог обратиться к сайту).
response_type= token — получить Токен.
Далее переходим к скрипту:
Входные параметры:
#!/usr/bin/perl
use strict;
use LWP;
use HTTP::Request::Common;
my $token = '55e43443343435355a3e70e805722345552227'; # так выглядит Токен полученый ранее
my $gid = '65596688'; # Это ID нашей группы в которую собираемся постить.
my $file = '/home/ds/test/2.jpg'; # Путь и файл картинки
my $site_url = 'http://leto-travel.com'; # Ссылка на сайт , которая будет видна в сообщении под картинкой
my $message = 'Спецпредложение по отдыху'; # Текст в сообщении над картинкой.
3. Теперь нам надо получить сервер вконтакте, куда будем заливать картинку:
# Узнаём сервер для выкладывания картинки getWallUploadServer
my $url1 = "https://api.vkontakte.ru/method/photos.getWallUploadServer?gid=$gid&access_token=$token";
my $res_url = &get_data($url1);
print "$res_url";
$res_url =~ s/([\'])?//g; # Убираем экранирующие слэши.
$res_url = $1 if ($res_url =~ m/.*?upload_url":"(.*?)".*?/); # Достаём URL.
# Парсим url и достаём из него все параметры
my $url = $1 if ( $res_url =~ m/^(.*?)?.*/);
my $act = $1 if ( $res_url =~ m/act=(.*?)(&|$).*/);
my $mid = $1 if ( $res_url =~ m/mid=(.*?)(&|$).*/);
my $aid = $1 if ( $res_url =~ m/aid=(.*?)(&|$).*/);
my $gid = $1 if ( $res_url =~ m/gid=(.*?)(&|$).*/);
my $hash = $1 if ( $res_url =~ m/&hash=(.*?)(&|$).*/);
my $rhash = $1 if ( $res_url =~ m/&rhash=(.*?)(&|$).*/);
my $swfupload = $1 if ( $res_url =~ m/&swfupload=(.*?)(&|$).*/);
my $api = $1 if ( $res_url =~ m/&api=(.*?)(&|$).*/);
my $wallphoto = $1 if ( $res_url =~ m/&wallphoto=(.*?)(&|$).*/);
4. Закачиваем картинку на указанный url:
my $ua = LWP::UserAgent->new (agent=>'Mozilla/5.0', requests_redirectable=>0);
my $res = $ua->request (
POST "$url",
Content_Type => 'multipart/form-data',
Content => [
'act' => $act,
'mid' => $mid,
'aid' => $aid,
'gid' => $gid,
'hash' => $hash,
'rhash' => $rhash,
'swfupload' => $swfupload,
'api' => $api,
'wallphoto' => $wallphoto,
'photo' => [$file],
],
) die("$!");
my $res_upload = $res->as_string();
$res_upload =~ s/([\'])?//g; # Убираем экранирование.
# Вытаскиваем переменные из ответа сервера
my $server_upload = $1 if ( $res_upload =~ m/server":(.*?),".*/);
my $photo_upload = $1 if ( $res_upload =~ m/"photo":"(.*?)","hash.*/);
my $hash_upload = $1 if ( $res_upload =~ m/"hash":"(.*?)"}$/);
5. После чего нам нужно записать на сервере загруженную картинку:
my $url2 = "https://api.vkontakte.ru/method/photos.saveWallPhoto?gid=$gid&access_token=$token&server=$server_upload&photo=$photo_upload&hash=$hash_upload";
my $res_save = get_data($url2);
my $ph_id = $1 if ( $res_save =~ m/"id":"(.*?)",".*/); # Вытаскиваем из ответа данные картинки
6. И последнее запостить её на стену:
my $url3 = "https://api.vkontakte.ru/method/"."wall.post?owner_id=-$gid&attachments=$ph_id,$site_url&from_group=1&access_token=$token"; # Готовим url для поста.
$url3 .="&message=$message" if ($message); # Если есть сообщение, то добавляем его.
my $res_post = get_data($url3);
, где owner_id должен быть со знаком "-" (минус), т.к. это группа.
from_group=1 — постить новость от имени группы.
В заключении небольшая процедура get_data(), к которой обращались для передачи данных http.
my $url = shift;
my $ua = LWP::UserAgent->new (agent=>'Mozilla/5.0', requests_redirectable=>0);
my $get_url = $ua->request (GET "$url") die("$!");
my $res_url = $get_url->as_string();
return ($res_url);
Несколько ссылок вконтакта для автоматизации:
Отправка сообщения:
https://api.vkontakte.ru/method/messages.send?uid={UID}&message={MSG}&title={TITLE}&access_token={TOKEN}
, где UID — ID пользователя, которому отправляется сообщение (это цифровое значение, если в url браузера у друга видно буквенный id, то можно зайти в его альбом и там в url будут и цифры), {MSG} — само сообщение, {TITLE} — заголовок сообщения, и ваш Token.
Смена своего статуса. Здесь id не нужно, т.к. приложение привязано к вашему аккаунту.
https://api.vkontakte.ru/method/status.set?text={TEXT}&access_token={TOKEN}
Постинг простого сообщения на стену в группу.
https://api.vkontakte.ru/method/wall.post?owner_id=-{GID}&message={MSG}&from_group=1&access_token={TOKEN}
, где {GID} — цифровой ID группы с знаком минус, {MSG} — сообщение, from_group — от кого будет сообщение (1 — от группы (если вы администратор)).
Вот и всё. Конечно, нужно ещё вставить код проверок и выхода по ошибкам и т.п. Но это уже на ваше усмотрение.
Автор: Celebro