Алгоритм обращения программы к API VKontakte

Часто бывает мы хотим автоматизировать то или иное действие. Порой спешка или просто лень не дает нам возможности ознакомиться со всей документацией(по API VK).
Разработать программу для работы с API ВКонтакте проще чем кажется. Подойдет любой язык, умеющий отправлять http get запросы (соответственно получать ответ). Например: Delphi, shell, C, Perl, PHP, Python и т. п.
image

Итак, разберем алгоритм создания программы и интеграции её с ВКонтакте.
Первое что нам нужно сделать, это создать(зарегистрировать) Desktop-приложение.
Нажимаем на кнопку «Подключить сайт» в разделе «Разработчикам»
Вводим название и выбираем тип — Standalone-приложение.
image

После чего, на ваш мобильный телефон (привязанный к аккуанту) придет код, который необходимо ввести в проверочное поле.
Создается приложение, в настройках нам потребуется ID приложения.image

Авторизация приложения с ВКонтакте происходит на базе протокола OAuth 2.0 и состоит из 3х шагов:
  • Открытие окна браузера для аутентификации пользователя на сайте Вконтакте.
  • Пользователь разрешает доступ приложению к запрашиваемым правам.
  • Вконтакте возвращает приложению access_token для доступа к API.


_http://api.vk.com/oauth/authorize?client_id=##ID##&redirect_uri=http://api.vk.com/blank.html&scope=##ПРАВА##&display=##ОТОБРАЖЕНИЕ## &response_type=token
, где:
##ID##- Id вашего приложения, полученного ранее;
##ОТОБРАЖЕНИЕ## — внешний вид окна авторизации(page, popup, touch и wap).
##ПРАВА##- список прав доступа приложения к данным пользователя. Указываются через запятую(notify,friends,photos,audio,video,docs,notes,pages,wall,groups,messages,ads) либо в цифровом виде, суммируя необходимые права (1,2,4,8,16,32,64,...,262144).
Пример: Получить права на Доступ к друзьям и Доступ к фотографиям пользователя:
 2 + 4 = 6; scope=1026 либо scope=friends,photos
Подробнее о правах доступа можно почитать здесь и здесь.
image

В ответ на запрос, сервер вернет:

access_token=93f22a20ddf1174f939108d43e936cd6bb193469344639c2d1c268f3f65fa86 &expires_in=86400&user_id=11347652
, где access_token — необходимый нам параметр, для отправки последующий запросов к API Вконтакте;
expires_in — время жизни token, после истечения необходимо обновить
( UPD: если в правах указать «offline» или 999999, то токен будет бесконечным);
user_id — id пользователя.
Связь программа-приложение-пользователь установлена. Теперь мы можем отправлять любые запросы к Api(в мерах разрешенных пользователем).
Синтаксис запросов:

_https://api.vkontakte.ru/method/##МЕТОД##?##НАЗВАНИЕ_ПЕРЕМЕННОЙ##=##ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ## &access_token=##ТОКЕН,ПОЛУЧЕНЫЙ_РАНЕЕ##
Список методов и их описание можно посмотреть здесь и здесь.

Для примера рассмотрим метод отправления личного сообщения

Название метода: messages.send
Необходимое право: 4096
Параметры: uid — id пользователя, которому отправляется сообщение, является обязательным.
message — текст сообщения, является обязательным, если не указан attachment.
attachment — приложения к сообщению, указанные через запятую в формате
<тип><владалец>_<idмедиа> (Пример:photo100172_166443618).
title — Заголовок.
type — 0 (по умолчанию)- обычное, 1 — из чата.

Пример запроса отправки сообщения пользователю id66392446:
_https://api.vkontakte.ru/method/messages.send?uid=66392446&message=ХабраХабр&title=Заголовок&access_token= 93f22a20ddf1174f939108d43e936cd6bb193469344639c2d1c268f3f65fa86
В ответ получим ID сообщения или код ошибки. 
{"response":10847}

В качестве примера программы привожу свой php-сценарий автоматического обновления статуса Вконтакте

(До нового года осталось… дней + Случайная фраза из файла).
Создаем php файл, который будет отправлять статус:
pub.php
<?php
$token='93f22a20ddf1174f939108d43e936cd6bb193469344639c2d1c268f3f65fa86';
//запишем токен, полученный ранее
$day = '15';
$month = '11';
//Дата, до которой будем отсчитывать время
$year = '2011';
function dateDiff($startDay, $endDay) {
$endDay = strtotime($endDay);
$startDay= strtotime($startDay);

$difference = abs($endDay - $startDay);
$return['days'] = floor($difference / 86400);
$return['hours'] = floor($difference / 3600) % 24;
$return['minutes'] = floor($difference / 60) % 60;

return $return;
}

$date=dateDiff(date("j-n-Y G:i"),'19-11-2011 9:00');

$phrases = "/var/www/public/1.txt";//файл содержащий фразы
$z = file ($phrases);
$cz = count ($z) -1;
$r = rand (0, $cz);
//случайная фраза из файла

$text="Осталось $date[days] дней, $date[hours] часов.$z[$r]";

$sRequest = "https://api.vkontakte.ru/method/status.set?text=$text&access_token=$token";
echo $text;
// ответ от Вконтакте
$oResponce = json_decode(file_get_contents($sRequest));


Теперь добавляем pub.php в cron с обновлением, не чаще чем раз в минуту, и наблюдаем результат.image

image

Таким способом можно автоматически публиковать статьи, фотографии, видео, отправлять сообщения и много других интересных вещей.
Экспериментируйте! Благодарю за внимание.

UPD: перед отправкой текстовую строку необходимо кодировать $text=urlencode($text);
Метки:
Поделиться публикацией
Комментарии 18
  • 0
    expires_in — это через сколько секунд истечет токен.
  • 0
    А токен вручную каждый день редактировать?
    • 0
      Как Вашей душе угодно. Можно в файл(небезопасно), лучше в БД занести. У меня просто нет возможности подключать БД, да и скрипт только на короткое время нужен.
    • +1
      омг, а что с пробелами не получилось?
      php.net/manual/en/function.urlencode.php
    • 0
      А список друзей с фотографиями и именами вытащить на страницу так можно?
      • 0
        Конечно.
        Получаем список id друзей: friends.getAppUsers
        О каждом из них можно получить подробные сведения (Имя, Фамилию, Ник, СП, город и т.п.) getProfiles
        Список альбомов пользователя: photos.getAlbums
        Список фотографий в альбоме: photos.get
        Также можно получить все фотографии пользователя в антихронологическом порядке: photos.getAll
        • 0
          «Антихронологический порядок» — звучит-то как!)) Только редакторы контакта до этого додумались))
        • 0
          Порой спешка или лень не дает возможность почитать документацию. Порой незнание принципов кодирования параметров УРЛ не дает возможность использовать пробелы в тексте. Но стоит ли об этом заявлять на весь Хабр?

          Что-то все топики из песочницы какие-то жуткие.
          • 0
            Окей, это все круто, но вот как, например, отослать запись на страницу публичной страницы?
            • 0
              Если не нужны расширенные методы, то можно подключить как сайт, и передать scope=offline.
              • 0
                Немного оффтопик, но все же.
                либо в цифровом виде, суммируя необходимые права (1,2,4,8,16,32,64,...,262144).

                Как называется свойство функции 2^x, что позволяет делать суммирование и определять вхождение конкретных степеней в итоговое число?
                • –1
                  Если Вы имеете ввиду сделать обратную операцию, т.е. разбить число на сумму степеней двойки, то стандартной такой функции я не нашел. Появился спортивный интерес. Написал.
                  function stepen($zad){
                  $zad2=$zad;
                  $temp=$zad;
                  $j=0;
                  do{
                  $i=0;
                  while($temp%2==0){
                  $temp=$temp/2;
                  $i=$i+1;
                  if($temp==1) break;
                  }
                  if($temp == 1) break;
                  $j=$j+1;
                  $a[$j]=pow(2,$i);
                  $temp=$zad-$a[$j];
                  $zad=$temp;
                  }while($temp);
                  $out = "$zad2 = ";
                  foreach($a as $item){
                  $out .= "$item + ";
                  }
                  $out .= pow(2,$i);
                  return $out;
                  }

                  Знаю что код совсем школьный, зато работает
                  • 0
                    Нет, вопрос вообщем-то про свойство функции, которое позволяет положится на результат работы вашей функции и гарантировать, что он будет однозначный.

                    С вашего позволения на JS:
                    function exponents(base, sum, arr) { 
                      var i = 0, arr = arr || [];
                      
                      if ( sum >= base ) {
                        while (Math.pow(base, i++) <= sum || (arr.push(i-2) && false));
                        return exponents(base, sum - Math.pow(base, i-2), arr);
                      } else {
                        if(sum) { arr.push(0); }
                        return {'exponents' : arr.join(', '), 'modular' : sum};
                      }  
                    }
                    
                • 0
                  А audio.search через API работает?
                  • 0
                    Работает. Битовая маска права — 8.
                    _https://api.vkontakte.ru/method/audio.search?q=Beatles&access_token= 93f22a20ddf1174f939108d43e936cd6bb193469344639c2d1c268f3f65fa86
                    • 0
                      А для audio.search нужна авторизация пользователя?

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.