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

в 12:32, , рубрики: Без рубрики

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

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

Автор: Celebro

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js