Задать вопрос
@general2

Работа с VK API и как нормально получить токен?

Делаю мультимодульный парсер-постинг проект с ИИ и начал заниматься ВК.
Суть: нужно из приложения на Flask отправлять в ВК посты на стену группы с медиа. Первое что я понял мне нужен какой то токен, иду брать его по первому пути через Implicit Flow:
oauth.vk.com/authorize?client_id=айди_приложения&d...
Оффлайн параметр на конце обязателен так как не нужно привязываться к IP. Ничего не вышло ни с обычными приложухами из dev.vk.com/ru/admin ни из id.vk.com/about/business/go. Один раз вышло без оффлайн.
Потом пошёл в группу Дополнительно-Работа с АПИ-Создать ключ. Выдал все права, работает, но без медиа. Делаю вызовы как в документации photos.saveWallPhoto, photos.getWallUploadServer, group_id и т.д.
Я начал докучать поддержку ВК, говорят нужен пользовательский токен (или "защищенный") именно с приложухи id.vk.com/about/business/go. Не работает конечно же (User authorization failed: invalid access_token (4)), думаю из за не пройдённой расширенной проверки, весь день жду её.
Но я прямо чувствую что это какая то ерунда, везде разная инфа и все по разному делают.

Если сходить в https://dev.vk.com/ru/method/wall.post говорят надо взять токен по Implicit Flow, мой вариант без SDK и проваливаемся на страницу с уже не понятной мне верификацией и никаких приложений вообще не требуется.
  • Вопрос задан
  • 953 просмотра
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@general2 Автор вопроса
В общем ребят, помогу многим надеюсь, тем кто вообще не понимает что к чему рассказываю:
вам сначала надо добыть авторизационный код.
Идём на 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"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest
Работаю с Python/Django
Я в свое время пользовался вот одним проектом с github для получения токена. Правда для отправки обычных сообщений в лс.

Ссылка тут (Под спойлером, потому-что это пусть и довольно старый проект с открытым исходным кодом, но все-таки сторонний).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
OSZAR »