Pull to refresh

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

Reading time4 min
Views24K
При создании информационных ресурсов часто приходится задумываться об автоматизации рутиной работы. В данной статье рассмотрим простой способ, при помощи нескольких строк 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/env 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://example.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);
    $res_url =~ s/([\\'])?//g;  # Убираем экранирующие слэши.
    $res_url = $1 if ($res_url =~ m/.*?upload_url\"\:\"(.*?)\".*?/);  # Достаём URL.
    my ($url , $param) = split(/\?/, $res_url); 

    # Парсим url и достаём из него все параметры 
     my %url_param =  map {split("=")} split("&", $param);
 


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' => $url_param{'act'},
        'mid' => $url_param{'mid'},
        'aid' => $url_param{'aid'},
        'gid' => $url_param{'gid'},
        'hash' => $url_param{'hash'},
        'rhash' => $url_param{'rhash'},
        'swfupload' => $url_param{'swfupload'},
        'api' => $url_param{'api'},
        'wallphoto' => $url_param{'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 — от группы (если вы администратор)).

Вот и всё. Конечно, нужно ещё вставить код проверок и выхода по ошибкам и т.п. Но это уже на ваше усмотрение.
Tags:
Hubs:
Total votes 19: ↑12 and ↓7+5
Comments10

Articles