Skip to main content

Пример работы с VK API в PHP

Социальные сети уже давно стали частью нашей жизни. Практически у каждого пользователя есть персональная страничка в таких сервисах как вконтакте, фейсбук, твиттер и другие. И поскольку такие сервисы очень популярны в наше время, они сделали специальное API. При помощи методов которые предоставляет API конкретной системы, вы можете получить список пользователей, список фотографий, даже найти всех пользователей в определенной области на карте, список действий очень большой.

Однако, не каждый пользователь может получить доступ к этим данным. Большинство сервисов требуют регистрации и создания специального приложение, которое и будет работать с методами определенного сервиса.

Итак, сегодня мы рассмотрим пример работы с VK API, в котором будем получать список пользователей c именем «Маша» в городе «Москва». Будем искать Маш в Москве.:)

Первым делом нам нужно создать приложение. Для создания приложения переходим по ссылке(https://new.vk.com/dev -> Создать приложение).

Вводим название и поскольку мы разбираем пример на PHP используя веб-сервер, выбираем тип приложения — «Веб-сайт«. Указываем адрес вашего сайта и базовый домен(если делаете на локальном веб-сервере, пишем http://localhost). Нажимаем кнопку «Подключить сайт» и ваше приложение создано, часть пути пройдена.

Приступаем к программированию. Существует множество классов для работы с API сайтов, однако мы будем писать все сами, чтобы понять основные принципы работы.

Для получения доступа к методам API, нужно выполнить несколько шагов:

  1. Авторизировать пользователя;
  2. Получить ключ доступа;
  3. Получить access_token;
  4. Выполнить запрос к методу;

4 простых шага, но на деле немного сложнее.

Авторизируем пользователя:

session_start();
$client_id = '1234567';
$redirect_uri = 'http://localhost';
$display = 'page';
$scope = 'friends,groups';
$response_type = 'code';
$auth_uri = "https://oauth.vk.com/authorize?client_id={$client_id}&display={$display}&
redirect_uri={$redirect_uri}&scope={$scope}&response_type={$response_type}&v=5.52";

Разбираем по пунктам, что же тут написано:

  • $client_id — идентификатор вашего приложения, присвоенный системой;
  • $redirect_uri — страница на которую будет перенаправлен пользователь после успешной авторизации;
  • $display — как отображается страница входа, в данном случае это будет отдельная страница;
  • $scope — разрешения для приложения, указывать через запятую. Полный список тут;
  • $response_type — тип ответа, в данном случае будет предоставлен JSON;
  • $auth_uri — формируем строку для авторизации пользователя, передвая нужные параметры;

С авторизацией пользователя разобрались, теперь нужно получить acces_token. После успешной авторизации нам в get запросе передают специальный код, с помощью которого мы сможем получить токен.

Получаем access_token:

if(isset($_GET['code'])){
$code = $_GET['code'];
$client_secret = 'you_application_password';
$acces_uri = "https://oauth.vk.com/access_token";
$fields = array(
	'client_id' => $client_id,
	'client_secret' => $client_secret,
	'redirect_uri' => $redirect_uri,
	'code' => $code
);
$acces_uri .= "?client_id={$fields['client_id']}&";
$acces_uri .= "client_secret={$fields['client_secret']}&";
$acces_uri .= "redirect_uri={$fields['redirect_uri']}&";
$acces_uri .= "code={$fields['code']}";
$res = file_get_contents($acces_uri);
$response_string = json_decode($res,true);
$_SESSION['token'] = $response_string['access_token'];

Тут все довольно просто, записываем полученный код в переменную $code, формируем ссылку с нужными нам данными — $access_uri. Далее при помощи функции file_get_contents выполняем запрос и в ответ получаем JSON объект который сразу же декодируем в массив. В конце просто полученный токен записываем в переменную сессии. Не очень хороший подход, лучше сразу писать в базу данных, однако цель этого руководства не в этом.

$client_secret — «Защищенный ключ» вашего приложения, без него работать не будет 🙂

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

Формируем:

if (isset($_SESSION['token'])) {
	$name = 'Маша';
	$url = $url = "https://api.vk.com/method/users.search?city_id=1&q={$name}&count=1000&access_token={$_SESSION['token']}";
	$res = file_get_contents($url);
	$users_data = json_decode($res,true);
	$users_count = array_shift($users_data['response']);
	$users_list = $users_data['response'];
}

И не забываем отобразить ссылку для авторизации которая у нас сформирована и записана в переменную $auth_uri.

Данный запрос вернет нам 1000 пользователей с Москвы. На выходе мы получим количество затронутых записей и ассоциативный массив с пользователями записанный в переменную $users_list, который уже можем использовать на свое усмотрение.

Единственный нюанс в том, что API не позволяет выбрать большее количество пользователей, даже если использовать параметр offset в строке запроса. К сожалению такое ограничение в VK API.

Полный список параметров VK API для запроса можете посмотреть в документации.

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

В следующей статье разберем реальный пример в котором будут реализованы некоторые функции управления сообществом, а именно постинг записей по расписанию, удаление и т.д.

17 thoughts to “Пример работы с VK API в PHP”

  1. Добрый день!
    Сейчас пишу модуль для сайта клиента по взаимодействию с API «ВКонтакте» и встретился со следующими проблемами:
    1) При взаимодействие через приложение для веб-сайта.
    — создал приложение
    — настроил все параметры: адрес сайта, базовый домен, доверенный redirect uri и так далее.
    — запрашиваю авторизацию через запрос
    https://oauth.vk.com/authorize?client_id=******&display=page&redirect_url=http://mysite.ru/tools/vk_export.php&scope=groups,friends,offline&response_type=code&v=5.52
    но почему то система даёт ответ «redirect_uri is incorrect, check application redirect uri in the settings page»
    2) Пробую через Standalone-приложение:
    — настраиваю параметры
    — запрашиваю авторизацию, но система меня отправляет по адресу https://oauth.vk.com/blank.html и в get-строке передаёт либо code, либо access_token в зависимости от запроса.
    А мне нужно, чтобы данные передались на redirect_uri чтобы система сайта могла сразу же подцепить полученные данные для работы с API Вконтакте.
    Помогите пожалуйста кто знает в чём проблема с редиректом.
    Заранее спасибо.

  2. Все сделал по примеру, после разрешения доступа выскочила вот такая ошибка:

    Warning: file_get_contents(https://oauth.vk.com/access_token?client_id=6102000&client_secret=GaFAYccKngRRq49GUAgL&redirect_uri=http://vkplir/&code=af7869ab34fd8d6310) [function.file-get-contents]: failed to open stream: No error in S:\home\vkplir\www\index.php on line 23

    В чем может быть проблема?

  3. Возникает вопрос, а если у меня попросту нет своего сайта, как мне быть? И второй вопрос, можно мне, как начинающииу в этом деле человеку, это всё как-то по проще объяснить? На реальных примерах созданных вами приложений, где и что вписывать? Приведите хотябы какой-то отдалённый пример, пошагового создания приложения, желательно со скриншотами. Если поможете мне, а я уже месяц над этим голову ломаю, то буду вам очень благодарен. К слову, я хотел бы сделать автокик при выходе из бесед, с помощью соответствующего метода. Если у вас какие-то советы для меня, как мне реализовать эту, казалось бы, смешную мечту, но очень важную для меня. Может хотябы вы мне поможете мне своими знаниями в этом?

      1. НЕ понятно как это дело выводить, Запускаю на denwere выходит в результате просто пустая страница, а куда это все выходит ???

  4. Добрый день,
    у меня возник ряд вопросов, на которые надеюсь найти здесь ответы.
    1) Почему на этапе авторизации, в конце auth_uri стоит имено v=5.52, это на что-то влияет?
    2) При тестировании ссылки в чистом виде, открывается запрос на подтверждение в вк, а когда такое проделываешь через кнопку и ссылку в ней, он возвращает «{«error»:»invalid_client»,»error_description»:»client_id is incorrect»}» с чем это может быть связано?
    3) Правильно ли я понял, что в html должна быть ссылка на авторизацию? Потому что если это не так, то я явно что-то упустил.
    Заранее спасибо за ответ и то, что вы делаете.

    1. 1. Это влияет на версию используемого апи, оно может отличаться функционалом и форматом ответов.
      2. Не совсем понял что значит «через кнопку и ссылку в ней», Скорей всего ссылка сформирована неправильно.
      3. Да, всё верно

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *