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

    @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"
    Ответ написан
    Комментировать