В общем ребят, помогу многим надеюсь, тем кто вообще не понимает что к чему рассказываю:
вам сначала надо добыть авторизационный код.
Идём на id.vk.com/about/business/go, делаем приложение, паспорт даём, ждём пока одобрят. В доступах прям там включаем Стена, Сообщество и тд что вам нужно.
OAUth 2.0 теперь не работает, а только версия 2.1 и
Implicit Flow не прокатит больше.
авторизационный код выполняем в браузере:
https://id.vk.com/authorize?response_type=code&client_id=ВАШ_ID_Приложения&scope=wall,photos,ТУТ_ВАШИ_Разрешения&redirect_uri=https://oauth.vk.com/blank.html&state=12345&code_challenge=ТУТ КОД&code_challenge_method=S256
code_challenge генерим на
https://developer.pingidentity.com/en/tools/pkce-c...
(там же генерим и Code-Verifier, запоминаем его.)
Как выполнили в браузере URL выше вас ВК спросит "Авторизоваться приложению позволишь?", нажимаем Да.
Если успешно в браузере будет написано на странице:
"Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту."
А сама ссылка в адресной строке станет типа такой:
https://oauth.vk.com/blank.html?code=vk2.a.xf_XibO...
device_id.= понадобится вам в получении access token.
"code= "это AUTHORIZATION_CODE с сроком жизни в 10 минут!!! Его получаем непосредственно если всё остальное готово.
Идём получать access token как вам угодно, но я вот делал через питон:
import requests
import os
import json
from dotenv import load_dotenv
load_dotenv()
CLIENT_ID = "535..." # ID твоего Standalone или веб-приложения
REDIRECT_URI = "https://oauth.vk.com/blank.html" # Тот же, что указывал при запросе кода
AUTHORIZATION_CODE = "vk2.a.xf_......." # Твой код из URL, который ты привел
DEVICE_ID = "vwMQxiq7O...." # Твой device_id из того же URL
if not all([CLIENT_ID, REDIRECT_URI, AUTHORIZATION_CODE, DEVICE_ID]):
print("Ошибка: Не все необходимые параметры (CLIENT_ID, REDIRECT_URI, AUTHORIZATION_CODE, DEVICE_ID) заданы.")
exit()
TOKEN_EXCHANGE_URL = 'https://id.vk.com/oauth2/auth'
payload = {
'grant_type': 'authorization_code',
'code': AUTHORIZATION_CODE,
'redirect_uri': REDIRECT_URI,
'client_id': CLIENT_ID,
'device_id': DEVICE_ID,
'code_verifier': 'J4R_gVUGstoAlA8qj7sO-9vZ7oKcVCtFlcC8-yIt5ZFr0N2M2z-VKpvN36rTnQm91vZmOgKv475R9mE6F1TE_7X7CqZRRMt3cJR2WyHlWfkLqMM3Snb0ycY4gNnilZW4',
'state': '12345'
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
print(f"Отправка POST-запроса на: {TOKEN_EXCHANGE_URL}")
print(f"Тело запроса (data): {payload}")
print(f"Заголовки: {headers}")
try:
response = requests.post(TOKEN_EXCHANGE_URL, data=payload, headers=headers, timeout=15)
print(f"\nСтатус ответа: {response.status_code}")
print(f"Заголовки ответа: {response.headers}")
try:
token_data = response.json()
print(f"Тело ответа (JSON): \n{json.dumps(token_data, indent=2, ensure_ascii=False)}")
except json.JSONDecodeError:
print(f"Тело ответа (не JSON): \n{response.text}")
response.raise_for_status()
print("Ошибка: Ответ сервера не в формате JSON, но статус ОК.")
exit()
if 'error' in token_data:
print(f"\n--- Ошибка от VK API ---")
print(f" Error: {token_data.get('error')}")
print(f" Error description: {token_data.get('error_description')}")
exit()
if 'access_token' in token_data:
print(f"\n--- Успешный обмен! ---")
print(f"ACCESS TOKEN: {token_data['access_token']}")
if 'expires_in' in token_data:
print(f"Срок действия (секунд): {token_data['expires_in']} (0 означает долгоживущий)")
if 'refresh_token' in token_data:
print(f"Refresh token: {token_data['refresh_token']}")
else:
print("\nОшибка: access_token не найден в ответе, но и явной ошибки нет. Проверьте ответ сервера.")
except requests.exceptions.HTTPError as e:
print(f"\n--- Ошибка HTTP ---")
print(f"Ошибка: {e}")
if e.response is not None:
print(f"Ответ сервера: {e.response.text}")
except requests.exceptions.RequestException as e:
print(f"\n--- Сетевая ошибка ---")
print(f"Ошибка: {e}")
except Exception as e:
print(f"\n--- Непредвиденная ошибка ---")
print(f"Ошибка: {e}")
import traceback
traceback.print_exc()
Вам выдаст в случае успеха:
--- Успешный обмен! ---
ACCESS TOKEN: vk2.a.WYs8_5B_8AY.....
Срок действия (секунд): 3600 (0 означает долгоживущий)
Refresh token: vk2.a.zYe8tvvSCF.....
Ураааа!!! Получили access_token через который можно взаимодействовать с чем хотите, отправлять посты и тд. Его срок жизни 60 минут.
Как его обновить? теперь не надо авторизационный код, пока что. Нужен только Refresh token, его срок жизни с этого момента 180 дней. Как обновить access token по истечению 60 минут с помощью рефреш токена:
Подготовьте следующие параметры для POST запроса:
grant_type: Установите значение "refresh_token".
refresh_token: Ваш текущий refresh token.
client_id: Идентификатор вашего приложения, полученный в настройках приложения VK.
client_secret: Секретный ключ вашего приложения, также доступный в настройках.
Формирование запроса:
Отправьте POST запрос на эндпоинт https://id.vk.com/oauth2/auth
Убедитесь, что запрос имеет заголовок Content-Type: application/x-www-form-urlencoded, и параметры передаются в теле запроса в формате ключ-значение, например:
grant_type=refresh_token&refresh_token=ваш_refresh_token&client_id=ваш_client_id&client_secret=ваш_client_secret
Обработка ответа:
При успешном запросе VK вернёт JSON-ответ, содержащий новый access token, возможно, новый refresh token и информацию о сроке действия (expires_in). Пример ответа:
{
"access_token": "новый_access_token",
"expires_in": 86400,
"refresh_token": "новый_refresh_token"
}
Если запрос не успешен, VK может вернуть ошибку, например:
invalid_request: Один или несколько параметров отсутствуют или неверны.
invalid_grant: Refresh token недействителен или истёк.
пример с использованием curl:
curl -X POST
https://id.vk.com/oauth2/auth
-d "grant_type=refresh_token"
-d "refresh_token=ваш_refresh_token"
-d "client_id=ваш_client_id"
-d "client_secret=ваш_client_secret"