Постим новости с картинкой в группы Вконтакта (Perl)

от автора

При создании информационных ресурсов часто приходится задумываться об автоматизации рутиной работы. В данной статье рассмотрим простой способ, при помощи нескольких строк 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 — от группы (если вы администратор)).

Вот и всё. Конечно, нужно ещё вставить код проверок и выхода по ошибкам и т.п. Но это уже на ваше усмотрение.

ссылка на оригинал статьи http://habrahabr.ru/post/211198/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *