Пользователь
0,0
рейтинг
5 ноября 2011 в 13:18

Алгоритм обращения программы к 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);
Дмитрий @dima_horror
карма
6,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (18)

  • 0
    expires_in — это через сколько секунд истечет токен.
    • 0
      извиняюсь, подправил.
  • 0
    А токен вручную каждый день редактировать?
    • 0
      Как Вашей душе угодно. Можно в файл(небезопасно), лучше в БД занести. У меня просто нет возможности подключать БД, да и скрипт только на короткое время нужен.
  • +1
    омг, а что с пробелами не получилось?
    php.net/manual/en/function.urlencode.php
    • 0
      Спасибо. Подправил.
  • 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 нужна авторизация пользователя?

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