Модуль для работы с API ВКонтакте.ру
С ростом популярности социальной сети «ВКонтакте.ру» рано или поздно возникает потребность в автоматизации действий. Это может быть сбор информации, автоответчик на личные сообщения или бот — неважно, OpenAPI, которым обладает «ВКонтакте», предоставляет широкие возможности по взаимодействию с программистом.
Я написал модуль для работы с 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.
Ссылки: