Как стать автором
Обновить

Модуль для работы с 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.

Ссылки:
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.