С ростом популярности социальной сети «ВКонтакте.ру» рано или поздно возникает потребность в автоматизации действий. Это может быть сбор информации, автоответчик на личные сообщения или бот — неважно, OpenAPI, которым обладает «ВКонтакте», предоставляет широкие возможности по взаимодействию с программистом.
Я написал модуль для работы с API vkontakte.ru, делающий возможным создание десктоп-приложений на языках Perl и PHP (без использования визуальных компонентов). Даже если большая часть комментов будет состоять из ругани в адрес ВКонтакте, я буду рад, если кому-то этот модуль окажется полезен. Исходный код подробно прокомментирован, так что понять логику работы не составит труда.
PHP:
Perl:
Конструктор класса. В качестве параметров принимает [b]appid[/b] — ид десктопного приложения, через которое будут идти запросы (см. ниже) и поле UserAgent, в комментариях не нуждающееся. Параметры необязательны, в случае отсутствия appid будет использоваться дефолтное.
Логин в контакте. Обязательные параметры — email, pass. captchaCallback — callback-функция для обработки капчи. Возвращаемый результат — хеш (в Perl) или ассоциативный массив (в PHP) с ключами:
В случае успешного логина errcode = 0.
Запрос к API вконтакта. method — название метода, строка. params — хеш (в Perl) или ассоциативный массив (в PHP) с полями запроса. Возвращает также хеш либо ассоциативный массив. Подробнее о входных параметрах и кодах ошибок см. документацию на userapi.com. Вывод идёт полностью в UTF-8.
Расположены в начале модуля с классом и прокомментированы. Можно изменить ид дефолтного приложения, юзерагент, адрес для API-запросов и вообще поломать модуль и пожаловаться на это в комментах.
Все API-методы контакта возвращают особый результат, если требуется ввод капчи (см. документацию). Единственное исключение — процедура логина, потому что сделана она через хак и, соответственно, обработку капчи приходится брать на себя. В моём модуле это реализовано через callback'и. Пример использования:
PHP:
Perl:
В PHP на вход функции подаётся ассоциативный массив из следующих полей:
В Perl — ссылка на хеш. Поля те же.
По поводу функции логина. В официальной документации по API сказано, что для авторизации необходим компонент-браузер. В случае же с консольными приложениями приходится этот браузер имитировать и, разумеется, в случае каких-либо изменений со стороны контакта изменений может потребовать и эта функция. Имейте в виду.
По поводу приложений. API вконтакта устроено так, что все запросы к нему работают через приложения, в нашем случае — десктопные. Перед использованием модуля нужно создать приложение, для этого идём сюда: vkontakte.ru/apps.php?act=add, вводим рандомное название и выбираем тип «Desktop-приложение». Готово! В настройках приложения можно увидеть его id.
Ссылки:
Я написал модуль для работы с API vkontakte.ru, делающий возможным создание десктоп-приложений на языках Perl и PHP (без использования визуальных компонентов). Даже если большая часть комментов будет состоять из ругани в адрес ВКонтакте, я буду рад, если кому-то этот модуль окажется полезен. Исходный код подробно прокомментирован, так что понять логику работы не составит труда.
Краткий синопсис
PHP:
<?php
require 'HVKAPI.php';
$VK = new hvkapi();
$res = $VK->login('email', 'pass');
if ($res['errcode']) die("Error code: {$res['errcode']}. {$res['errdesc']}");
$resp = $VK->request('getProfiles', array('uids'=>'1,23363'));
print_r($resp);
?>
Perl:
use HVKAPI;
use Data::Dumper;
my $vk = new HVKAPI;
my %res = $vk->login('email', 'pass');
die("Error #$res{errcode}: $res{errdesc}") if ($res{errcode});
my $resp = $vk->request('getProfiles', {'uids'=>'1,23363'});
print Dumper($resp); # Выведет структуру ответа
print $resp->{response}->[0]->{first_name}; # Выведет "Павел"
Описание методов
new (appid, useragent)
Конструктор класса. В качестве параметров принимает [b]appid[/b] — ид десктопного приложения, через которое будут идти запросы (см. ниже) и поле UserAgent, в комментариях не нуждающееся. Параметры необязательны, в случае отсутствия appid будет использоваться дефолтное.
login (email, pass, captchaCallback)
Логин в контакте. Обязательные параметры — email, pass. captchaCallback — callback-функция для обработки капчи. Возвращаемый результат — хеш (в Perl) или ассоциативный массив (в PHP) с ключами:
- errcode — код ошибки.
- errdesc — описание ошибки.
В случае успешного логина errcode = 0.
request (method, params)
Запрос к API вконтакта. method — название метода, строка. params — хеш (в Perl) или ассоциативный массив (в PHP) с полями запроса. Возвращает также хеш либо ассоциативный массив. Подробнее о входных параметрах и кодах ошибок см. документацию на userapi.com. Вывод идёт полностью в UTF-8.
Константы и значения по умолчанию
Расположены в начале модуля с классом и прокомментированы. Можно изменить ид дефолтного приложения, юзерагент, адрес для API-запросов и вообще поломать модуль и пожаловаться на это в комментах.
Обработка капчи
Все API-методы контакта возвращают особый результат, если требуется ввод капчи (см. документацию). Единственное исключение — процедура логина, потому что сделана она через хак и, соответственно, обработку капчи приходится брать на себя. В моём модуле это реализовано через callback'и. Пример использования:
PHP:
<?php
require 'modules/VKAPI.php';
$VK = new vkapi();
$res = $VK->login('email', 'pass', 'myCallback');
if ($res['errcode']) die("Error code: {$res['errcode']}. {$res['errdesc']}");
$resp = $VK->request('getProfiles', array('uids'=>'1,23363'));
print_r($resp);
function myCallback($params)
{
print_r($params);
$difficulty = $params['difficult'];
$sid = $params['captcha_sid'];
$difficulty = !$difficulty;
print "http://vkontakte.ru/captcha.php?sid=$sid&s=$difficulty\n";
return trim(fgets(STDIN));
}
?>
Perl:
use VKAPI;
use Data::Dumper;
my $vk = new HVKAPI;
my %res = $vk->login('email', 'pass', \&myCallback);
die("Error #$res{errcode}: $res{errdesc}") if ($res{errcode});
my $resp = $vk->request('getProfiles', {'uids'=>'1,23363'});
print Dumper($resp); # Выведет структуру ответа
print $resp->{response}->[0]->{first_name}; # Выведет "Павел"
sub myCallback
{
my $params = shift;
print $params->{'captcha_url'}."\n";
$answer = <>;
chomp $answer;
return $answer;
}
В PHP на вход функции подаётся ассоциативный массив из следующих полей:
- difficult — поле «s» в адресе
- captcha_sid — sid капчи.
- captcha_url — полный линк на картинку с капчей, например, vkontakte.ru/captcha.php?sid=1234567890&s=0
В Perl — ссылка на хеш. Поля те же.
Немного замечаний
По поводу функции логина. В официальной документации по API сказано, что для авторизации необходим компонент-браузер. В случае же с консольными приложениями приходится этот браузер имитировать и, разумеется, в случае каких-либо изменений со стороны контакта изменений может потребовать и эта функция. Имейте в виду.
По поводу приложений. API вконтакта устроено так, что все запросы к нему работают через приложения, в нашем случае — десктопные. Перед использованием модуля нужно создать приложение, для этого идём сюда: vkontakte.ru/apps.php?act=add, вводим рандомное название и выбираем тип «Desktop-приложение». Готово! В настройках приложения можно увидеть его id.
Ссылки: