Социальные сети уже давно стали частью нашей жизни. Практически у каждого пользователя есть персональная страничка в таких сервисах как вконтакте, фейсбук, твиттер и другие. И поскольку такие сервисы очень популярны в наше время, они сделали специальное API. При помощи методов которые предоставляет API конкретной системы, вы можете получить список пользователей, список фотографий, даже найти всех пользователей в определенной области на карте, список действий очень большой.
Однако, не каждый пользователь может получить доступ к этим данным. Большинство сервисов требуют регистрации и создания специального приложение, которое и будет работать с методами определенного сервиса.
Итак, сегодня мы рассмотрим пример работы с VK API, в котором будем получать список пользователей c именем «Маша» в городе «Москва». Будем искать Маш в Москве.:)
Первым делом нам нужно создать приложение. Для создания приложения переходим по ссылке(https://new.vk.com/dev -> Создать приложение).
Вводим название и поскольку мы разбираем пример на PHP используя веб-сервер, выбираем тип приложения — «Веб-сайт«. Указываем адрес вашего сайта и базовый домен(если делаете на локальном веб-сервере, пишем http://localhost). Нажимаем кнопку «Подключить сайт» и ваше приложение создано, часть пути пройдена.
Приступаем к программированию. Существует множество классов для работы с API сайтов, однако мы будем писать все сами, чтобы понять основные принципы работы.
Для получения доступа к методам API, нужно выполнить несколько шагов:
- Авторизировать пользователя;
- Получить ключ доступа;
- Получить access_token;
- Выполнить запрос к методу;
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 для запроса можете посмотреть в документации.
Надеюсь статья была вам полезна и вы узнали что-то новое для себя, если же нет, оставляйте пожалуйста ваши комментарии.
В следующей статье разберем реальный пример в котором будут реализованы некоторые функции управления сообществом, а именно постинг записей по расписанию, удаление и т.д.
С полученным таким образом токеном, пользоваться wall.post не получится?
Можно, однако приложение должно быть типа — Standalone, и в scope нужно добавить wall(Дать доступ приложению к стене).
Да нельзя таким способом
Нужно проверить)
Как сделать, чтобы пользователю не выводилось окно авторизации?
Никак. Для получения ключа доступа пользователя, нужно авторизироваться.
Добрый день!
Сейчас пишу модуль для сайта клиента по взаимодействию с 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 Вконтакте.
Помогите пожалуйста кто знает в чём проблема с редиректом.
Заранее спасибо.
Через Standalone так не получится сделать.
У вас в запросе стоит
redirect_url
, а должно бытьredirect_uri
.Все сделал по примеру, после разрешения доступа выскочила вот такая ошибка:
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
В чем может быть проблема?
Возможно проблема в
redirect_uri
, попробуйте указать адрес без слэша в конце.Возникает вопрос, а если у меня попросту нет своего сайта, как мне быть? И второй вопрос, можно мне, как начинающииу в этом деле человеку, это всё как-то по проще объяснить? На реальных примерах созданных вами приложений, где и что вписывать? Приведите хотябы какой-то отдалённый пример, пошагового создания приложения, желательно со скриншотами. Если поможете мне, а я уже месяц над этим голову ломаю, то буду вам очень благодарен. К слову, я хотел бы сделать автокик при выходе из бесед, с помощью соответствующего метода. Если у вас какие-то советы для меня, как мне реализовать эту, казалось бы, смешную мечту, но очень важную для меня. Может хотябы вы мне поможете мне своими знаниями в этом?
Не совсем понял про автокик из бесед. Какой именно момент вам не понятен при разработке приложения?
НЕ понятно как это дело выводить, Запускаю на denwere выходит в результате просто пустая страница, а куда это все выходит ???
Добрый день.
Данные полученные от API находятся в переменной
$users_list
Добрый день,
у меня возник ряд вопросов, на которые надеюсь найти здесь ответы.
1) Почему на этапе авторизации, в конце auth_uri стоит имено v=5.52, это на что-то влияет?
2) При тестировании ссылки в чистом виде, открывается запрос на подтверждение в вк, а когда такое проделываешь через кнопку и ссылку в ней, он возвращает «{«error»:»invalid_client»,»error_description»:»client_id is incorrect»}» с чем это может быть связано?
3) Правильно ли я понял, что в html должна быть ссылка на авторизацию? Потому что если это не так, то я явно что-то упустил.
Заранее спасибо за ответ и то, что вы делаете.
1. Это влияет на версию используемого апи, оно может отличаться функционалом и форматом ответов.
2. Не совсем понял что значит «через кнопку и ссылку в ней», Скорей всего ссылка сформирована неправильно.
3. Да, всё верно
{«error»:»invalid_request»,»error_description»:»redirect_uri is incorrect, check application redirect uri in the settings page»}
вот такая шняга вылазит