[Примеры] Авторизация (получение access token) с помощью OAuth 2.0 Вконтакте (VK) и работа с API Вконтакте на PHP и JS
Содержание:
- Создание нового приложения
- Формирование ссылки для авторизации пользователя и получение токена (access
token) - Примеры работы с API VK (Вконтакте) на PHP
- Примеры работы с API VK.com на JavaScript (openapi.js)
- Реализация автопостинга записей на стену (Wall.post)
Создание нового приложения
Открываем панель управления приложениями Вконтакте, расположенную по адресу https://vk.com/apps?act=manage. В панели управления нажимаем на «Создать приложение».
В открывшейся форме вводим название приложения, выбираем платформу «Веб-сайт», указываем адрес сайта (ссылка должна быть со слешем в конце) и базовый домен.
После нажатия на «Подключить сайт» вам на телефон придёт СМС с кодом подтверждения, который необходимо будет ввести в появившемся окне.
После ввода кода из СМС будет создано новое приложение и откроется страница этого приложения. На странице приложения откройте вкладку «Настройки», там вы увидите данные для доступа к приложению: ID приложения и Защищённый ключ.
Формирование ссылки для авторизации пользователя и получение токена (access token)
Формируем ссылку и выводим её на экран:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
session_start(); // Токен будем хранить в сессии // Параметры приложения $clientId = '6483919'; // ID приложения $clientSecret = 'yeHH2R4AnqVgrHwo3r893'; // Защищённый ключ $redirectUri = 'http://localhost/_blog/tests/vk-api/oauth.php'; // Адрес, на который будет переадресован пользователь после прохождения авторизации // Формируем ссылку для авторизации $params = array( 'client_id' => $clientId, 'redirect_uri' => $redirectUri, 'response_type' => 'code', 'v' => '5.74', // (обязательный параметр) версия API, которую Вы используете https://vk.com/dev/versions // Права доступа приложения https://vk.com/dev/permissions // Если указать "offline", полученный access_token будет "вечным" (токен умрёт, если пользователь сменит свой пароль или удалит приложение). // Если не указать "offline", то полученный токен будет жить 12 часов. 'scope' => 'photos,offline', ); // Выводим на экран ссылку для открытия окна диалога авторизации echo '<a href="http://oauth.vk.com/authorize?' . http_build_query( $params ) . '">Авторизация через ВКонтакте</a>'; |
После нажатия на «Авторизация через Вконтакте» будет открыто окно диалога авторизации и пользователю будет предложено авторизовать приложение, разрешив доступ к необходимым настройкам, запрошенным при помощи параметра scope.
После успешной авторизации приложения браузер пользователя будет перенаправлен по адресу redirect_uri, указанному при открытии диалога авторизации. При этом код для получения ключа доступа code будет передан как GET-параметр.
Получаем access_token, с помощью параметра code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
if ( isset( $_GET['code'] ) ) { $params = array( 'client_id' => $clientId, 'client_secret' => $clientSecret, 'code' => $_GET['code'], 'redirect_uri' => $redirectUri ); if (!$content = @file_get_contents('https://oauth.vk.com/access_token?' . http_build_query($params))) { $error = error_get_last(); throw new Exception('HTTP request failed. Error: ' . $error['message']); } $response = json_decode($content); // Если при получении токена произошла ошибка if (isset($response->error)) { throw new Exception('При получении токена произошла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description); } $token = $response->access_token; // Токен $expiresIn = $response->expires_in; // Время жизни токена $userId = $response->user_id; // ID авторизовавшегося пользователя // Сохраняем токен в сессии $_SESSION['token'] = $token; } elseif ( isset( $_GET['error'] ) ) { // Если при авторизации произошла ошибка throw new Exception( 'При авторизации произошла ошибка. Error: ' . $_GET['error'] . '. Error reason: ' . $_GET['error_reason'] . '. Error description: ' . $_GET['error_description'] ); } |
Примеры работы с API VK (Вконтакте) на PHP
Список методов API Вконтакте | Ограничения
и рекомендации
Получение информации о пользователях (метод users.get):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$token = $_SESSION['token']; // Извлекаем токен из сессии // Формируем запрос $params = array( 'v' => '5.74', // Версия API 'access_token' => $token, // Токен 'user_ids' => '1,201275649,155797683', // ID пользователей 'fields' => 'photo_100,about' // Список опциональных полей https://vk.com/dev/objects/user ); if (!$content = @file_get_contents('https://api.vk.com/method/users.get?' . http_build_query($params))) { $error = error_get_last(); throw new Exception('HTTP request failed. Error: ' . $error['message']); } $response = json_decode($content); // Если возникла ошибка if (isset($response->error)) { throw new Exception('При отправке запроса к API VK возникла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description); } $response = $response->response; foreach ($response as $userItem) { $userItem->id; // ID пользователя $userItem->first_name; // Имя $userItem->last_name; // Фамилия $userItem->photo_100; // Фотография } |
Получение всех фотографий пользователя (метод photos.getAll):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Извлекаем информацию о токене из сессии $token = $_SESSION['token']; // Формируем и выполняем запрос на получение фотографий пользователя $params = array( 'v' => '5.74', // Версия API 'access_token' => $token, // Токен 'owner_id' => 1, // ID пользователя ); if (!$content = @file_get_contents('https://api.vk.com/method/photos.getAll?' . http_build_query($params))) { $error = error_get_last(); throw new Exception('HTTP request failed. Error: ' . $error['message']); } $response = json_decode($content); // Если возникла ошибка if (isset($response->error)) { throw new Exception('При отправке запроса к API VK возникла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description); } $response = $response->response; $countPhotos = $response->count; // Количество фотографий в альбомах пользователя $photos = $response->items; // Фотографии |
Примеры работы с API VK.com на JavaScript (openapi.js)
1 2 3 |
<!-- Подключаем jQuery и openapi.js --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://vk.com/js/api/openapi.js?154" type="text/javascript"></script> |
1 2 3 4 |
<!-- Добавляем кнопки на страницу --> <button type="button" id="vkLogin">Войти</button> <button type="button" id="vkUnLogin">Выйти</button> <button type="button" id="vkGetPhotos">Получить фотографии</button> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
$(document).ready(function () { // Инициализация VK.init({ apiId: 6474919 }); $('#vkLogin').on('click', function () { // Авторизация VK.Auth.login( // callback-функция, которая будет вызвана после авторизации function (response) { console.log(response) if (response.status === 'connected') { // авторизация прошла успешно var user = response.session.user; // информация о пользователе /* user.first_name - имя; user.last_name - фамилия; user.href - ссылка на страницу в формате https://vk.com/domain; user.id - идентификатор пользователя; user.nickname - отчество или никнейм (если указано); */ } else if (response.status === 'not_authorized') { // пользователь авторизован в ВКонтакте, но не разрешил доступ приложению; } else if (response.status === 'unknown') { // пользователь не авторизован ВКонтакте. } }, // права доступа (integer) // допустимые значения: // AUDIO:8 // FRIENDS:2 // MATCHES:32 // PHOTOS:4 // QUESTIONS:64 // VIDEO:16 // WIKI:128 VK.access.PHOTOS ); }); $('#vkUnLogin').on('click', function () { // Выход VK.Auth.logout(function (response) { console.log(response); // {session: null, status: "unknown", settings: undefined} }); }); $('#vkGetPhotos').on('click', function () { VK.Api.call( 'photos.getAll', // название метода API https://vk.com/dev/methods // параметры: { v: '5.73', // версия API (обязательный параметр) count: 10 // количество фотографий }, function (r) { var count = r.response.count; // кол-во полученных фотографий var items = r.response.items; // массив с фотографиями }); }); }); |
Реализация автопостинга записей на стену (Wall.post)
1. При регистрации приложения указываем тип платформы «Standalone-приложение»
2. Формируем ссылку и переходим по ней в браузере
1 |
https://oauth.vk.com/authorize?client_id=6901454358&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=stats,wall,groups,photos,offline&response_type=token&v=5.92&state=123456 |
client_id — ID вашего приложения, остальные параметры без изменений.
3. После перехода по ссылке и авторизации произойдёт редирект на url, который содержит токен. Этот токен сохраняем.
1 |
https://oauth.vk.com/blank.html#access_token=d5f00aca2251588a1e6e401d1e8f7e0c5fc340a084b3663bf709b4ce901a8414d7ae23b3&expires_in=0&user_id=1713385&state=123456 |
d5f00aca2251588a1e6d67e401d1e…. — токен
4. Устанавливаем библиотеку vk-php-sdk
composer require vkcom/vk-php-sdk
5. Применяем метод wall.post для публикации сообщений в группу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
require_once __DIR__ . '/vendor/autoload.php'; // Implicit Flow для получения ключа доступа пользователя // https://vk.com/dev/implicit_flow_user $token = '65468552e15cc0c7f26aa4109fa5110532f71963cc78a68119b3ec9950d14f17b7a35ba120e64c'; // https://github.com/VKCOM/vk-php-sdk $vk = new VK\Client\VKApiClient('5.92'); // https://vk.com/dev/wall.post $response = $vk->wall()->post($token, [ 'owner_id' => -179780, // ID группы 'from_group' => 1, // Публикуем сообщение от имени группы 'message' => 'Сообщение', ]); |