有没有大佬看一下这个oauth拿access token的脚本为啥报错

脚本如下

我是py
import requests
from urllib.parse import urlparse, parse_qs
import json
import sys


CHATGPT_API_PREFIX = "/chatgpt"
IMITATE_API_PREFIX = "/imitate/v1"
CHATGPT_API_URL_PREFIX = "https://chatgpt.com"

PLATFORM_API_PREFIX = "/platform"
PLATFORM_API_URL_PREFIX = "https://api.openai.com"

DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " \
                     "AppleWebKit/537.36 (KHTML, like Gecko) " \
                     "Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"

AUTH0_URL = "https://auth0.openai.com"
LOGIN_USERNAME_URL = AUTH0_URL + "/u/login/identifier?state="
LOGIN_PASSWORD_URL = AUTH0_URL + "/u/login/password?state="
GET_TOKEN_URL = AUTH0_URL + "/oauth/token"
DASHBOARD_LOGIN_URL = "https://api.openai.com/dashboard/onboarding/login"

# OAuth2 Parameters
CLIENT_ID = "DRivsnm2Mu42T3KOpqdtwB3NYviHYzwD"  
AUDIENCE = "https://api.openai.com/v1"
REDIRECT_URI = "https://platform.openai.com/auth/callback"
SCOPE = "openid profile email offline_access"
RESPONSE_TYPE = "code"

# Error Messages
PARSE_USER_INFO_ERROR_MESSAGE = "Failed to parse user login info"
GET_AUTHORIZED_URL_ERROR_MESSAGE = "Failed to get authorized URL"
EMAIL_INVALID_ERROR_MESSAGE = "Email is not valid"
EMAIL_OR_PASSWORD_INVALID_ERROR_MESSAGE = "Email or password is not correct"
GET_ACCESS_TOKEN_ERROR_MESSAGE = "Failed to get access token"
GET_SESSION_KEY_ERROR_MESSAGE = "Failed to get session key"

def get_authorized_url(session):
    url_params = {
        "client_id": CLIENT_ID,
        "audience": AUDIENCE,
        "redirect_uri": REDIRECT_URI,
        "scope": SCOPE,
        "response_type": RESPONSE_TYPE
    }
    response = session.get(AUTH0_URL + "/authorize", params=url_params, headers={
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": DEFAULT_USER_AGENT
    })

    if response.status_code != 200:
        print(GET_AUTHORIZED_URL_ERROR_MESSAGE)
        sys.exit(1)

    return response.url

def extract_state(authorized_url):
    parsed_url = urlparse(authorized_url)
    query_params = parse_qs(parsed_url.query)
    state = query_params.get('state', [None])[0]
    if not state:
        print("State parameter not found in authorized URL.")
        sys.exit(1)
    return state

def check_username(session, state, username):
    payload = {
        "state": state,
        "username": username,
        "js-available": "true",
        "webauthn-available": "true",
        "is-brave": "false",
        "webauthn-platform-available": "false",
        "action": "default"
    }
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": DEFAULT_USER_AGENT
    }
    response = session.post(LOGIN_USERNAME_URL + state, data=payload, headers=headers)

    if response.status_code != 200:
        print(EMAIL_INVALID_ERROR_MESSAGE)
        sys.exit(1)

def check_password(session, state, username, password):
    payload = {
        "state": state,
        "username": username,
        "password": password,
        "action": "default"
    }
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": DEFAULT_USER_AGENT
    }
    response = session.post(LOGIN_PASSWORD_URL + state, data=payload, headers=headers)

    if response.status_code != 200:
        print(EMAIL_OR_PASSWORD_INVALID_ERROR_MESSAGE)
        sys.exit(1)

    redirect_url = response.url
    parsed_url = urlparse(redirect_url)
    query_params = parse_qs(parsed_url.query)
    code = query_params.get('code', [None])[0]
    if not code:
        print("Authorization code not found.")
        sys.exit(1)
    return code

def get_access_token(session, code):
    payload = {
        "client_id": CLIENT_ID,
        "code": code,
        "grant_type": "authorization_code",
        "redirect_uri": REDIRECT_URI
    }
    headers = {
        "Content-Type": "application/json",
        "User-Agent": DEFAULT_USER_AGENT
    }
    response = session.post(GET_TOKEN_URL, data=json.dumps(payload), headers=headers)

    if response.status_code != 200:
        print(GET_ACCESS_TOKEN_ERROR_MESSAGE)
        sys.exit(1)

    try:
        token_response = response.json()
        access_token = token_response.get("access_token", None)
        if not access_token:
            print("Access token not found in the response.")
            sys.exit(1)
        return access_token
    except json.JSONDecodeError:
        print("Failed to decode access token response.")
        sys.exit(1)

def main():
    import getpass

    # Prompt user for credentials
    username = input("Enter your username (email): ").strip()
    password = getpass.getpass("Enter your password: ").strip()

    # Initialize session
    session = requests.Session()

    # Refresh cookies by accessing the logout URL
    try:
        logout_response = session.get(AUTH0_URL + "/v2/logout", headers={
            "User-Agent": DEFAULT_USER_AGENT
        })
        logout_response.raise_for_status()
    except requests.RequestException as e:
        print(f"Failed to refresh cookies: {e}")
        sys.exit(1)

    # Get authorized URL
    authorized_url = get_authorized_url(session)
    state = extract_state(authorized_url)

    # Check username
    check_username(session, state, username)

    # Check password and get authorization code
    code = check_password(session, state, username, password)

    # Exchange code for access token
    access_token = get_access_token(session, code)

    
    payload = {}
    headers = {
        "Content-Type": "application/json",
        "User-Agent": DEFAULT_USER_AGENT,
        "Authorization": f"Bearer {access_token}"
    }
    try:
        dashboard_response = session.post(DASHBOARD_LOGIN_URL, data=json.dumps(payload), headers=headers)
        if dashboard_response.status_code != 200:
            print(GET_SESSION_KEY_ERROR_MESSAGE)
            sys.exit(1)
        print("Access Token:", access_token)
    except requests.RequestException as e:
        print(f"Failed to perform dashboard login: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()

一直报错
Failed to refresh cookies: 403 Client Error: Forbidden for url: https://auth0.openai.com/v2/logout

5 Likes

取消refreshcookie,获取授权url又报错了
现在是不是已经不能用oauth拿token了

可以通过官网登陆拿。要自备魔法哦!
官网登录后,访问这个链接获取at: https://chat.openai.com/api/auth/session

1 Like

啊啊啊,有没有大佬看一下啊

1 Like

官网自己拿就行