![](http://habr.habrastorage.org/post_images/dce/f77/094/dcef77094f84ad36551982eef0bb3f24.png)
Краткий план:
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/
Добавить комментарий