You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google YouTube API访问被阻:OAuth2.0无法获取AccessToken求助

无法获取YouTube API OAuth2.0 AccessToken的解决建议

根据你提供的代码和报错信息,以下是常见的问题排查和修复步骤:

1. 确认客户端凭据类型正确

你使用的InstalledAppFlow仅适配桌面应用类型的OAuth 2.0客户端ID,需按以下步骤修正:

  • 登录Google Cloud Console进入目标项目,导航到「API和服务」→「凭据」
  • 删除现有非桌面类型的凭据,重新创建「桌面应用」类型的客户端ID
  • 下载新生成的client.json替换本地文件,同时检查文件内的redirect_uris字段,确保包含urn:ietf:wg:oauth:2.0:oob或http://localhost(这两个是桌面应用授权流程默认支持的回调地址)

2. 规范授权流程操作

运行代码后控制台会输出授权链接,需严格按以下步骤操作:

  • 复制链接到浏览器,使用目标YouTube账号完成授权验证
  • 复制页面返回的授权码,立即回到控制台粘贴输入(授权码有效期极短,超时会触发invalid_grant错误)

3. 更新依赖库

旧版本的Google授权库可能存在兼容性问题,执行以下命令更新:

pip install --upgrade google-auth-oauthlib google-api-python-client

4. 清除旧令牌缓存

若之前有失败的授权记录,本地缓存的无效令牌会干扰后续流程:

  • 删除自动生成的令牌文件(默认路径:用户目录下的.credentials/youtube-v3-*文件,或当前目录的token.json)
  • 重新运行代码,从头完成授权流程

补充代码优化建议

添加令牌持久化逻辑,避免每次运行都重复授权:

import os
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request

scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]
TOKEN_FILE = "token.json"

def main():
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "client.json"
    credentials = None

    # 加载已保存的令牌
    if os.path.exists(TOKEN_FILE):
        credentials = Credentials.from_authorized_user_file(TOKEN_FILE, scopes)
    
    # 无有效令牌时重新授权
    if not credentials or not credentials.valid:
        if credentials and credentials.expired and credentials.refresh_token:
            credentials.refresh(Request())
        else:
            flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
                client_secrets_file, scopes)
            credentials = flow.run_console()
        # 保存令牌到本地
        with open(TOKEN_FILE, "w") as token:
            token.write(credentials.to_json())

    youtube = googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials)
    # 示例:调用API获取频道信息
    request = youtube.channels().list(
        part="snippet,contentDetails,statistics",
        id="YOUR_CHANNEL_ID"
    )
    response = request.execute()
    print(response)

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Welcome_back

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:20:40