Модуль для работы с API ВКонтакте.ру

22 апреля 2011 г.

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

Ссылки:

Теги:
рубрика PHP
  • Похожие статьи
  • Предыдущие из рубрики