OAuth2.0授权流程必须手动完成首次登录,因依赖用户交互(如点击“同意授权”、输入账号密码),Python爬虫无法自动模拟完整登录+授权弹窗,需先在浏览器中走完authorization_code流程获取code,再换取access_token。

OAuth2.0 授权流程必须手动完成首次登录,不能全自动绕过
绝大多数 OAuth2.0 流程依赖用户交互(比如点击“同意授权”、输入账号密码),Python 爬虫无法自动模拟完整登录+授权弹窗。这意味着你得先在浏览器里走完 authorization_code 流程,拿到 code,再用它换 access_token —— 这一步没法跳过。
常见错误是直接拿 Postman 里复制的 token 就去发请求,结果返回 401 Unauthorized 或 invalid_token:要么 token 已过期,要么 scope 不匹配,要么没带 Bearer 前缀。
- 务必确认 API 要求的
scope(比如https://www.googleapis.com/auth/drive.readonly),申请时就得勾选对应权限 - 拿到
access_token后,有效期通常为 1 小时;如果支持refresh_token,保存它并在过期后用refresh_token换新access_token - 请求头必须写成:
Authorization: Bearer <your_access_token></your_access_token>,少一个空格或大小写错误都会失败
requests 调用带 token 的 API 时,别漏掉 headers 和 error 处理
很多人用 requests.get(url) 直接发请求,却忘了传 headers,或者没检查响应状态码,导致程序静默失败。
示例中容易忽略的是:token 过期后接口可能返回 401,但程序继续往下跑,后续解析 JSON 时才报 json.decoder.JSONDecodeError,根本不知道是认证问题。
立即学习“Python免费学习笔记(深入)”;
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 始终显式构造
headers:{"Authorization": f"Bearer {access_token}", "Accept": "application/json"} - 每次请求后检查
response.status_code,对401做单独处理(比如触发 refresh 流程) - 不要直接
response.json(),先用response.raise_for_status()捕获 HTTP 错误 - 某些 API(如 GitHub)还要求加
Accept或User-Agent,缺一不可
refresh_token 自动续期要小心 rate limit 和 token 失效场景
refresh_token 并非永久有效——很多平台(如 Google、Microsoft)会在用户修改密码、长时间未使用或主动撤回授权后使其失效。盲目重试刷新会导致 invalid_grant 错误,且部分平台对刷新请求有频率限制。
实操建议是:只在收到 401 且确认是 token 过期(而非 scope 不足)时才调用刷新;刷新失败就停机告警,而不是无限重试。
- 刷新请求必须用
POST,参数包括:grant_type=refresh_token、refresh_token=xxx、client_id、client_secret - Google 的 OAuth2 刷新接口是
https://oauth2.googleapis.com/token,微软的是https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token - 刷新成功后,务必更新本地存储的
access_token和expires_in时间戳,避免多线程下读到旧值
敏感凭据(client_secret、refresh_token)绝不能硬编码在脚本里
把 client_secret 或 refresh_token 写死在 Python 文件里,等于把钥匙贴在门上。一旦代码上传 GitHub,凭据立刻泄露,轻则 API 配额被刷爆,重则账户被接管。
最简可行方案是用环境变量 + .env 文件(配合 python-dotenv),生产环境应改用密钥管理服务(如 AWS Secrets Manager、Azure Key Vault)。
- 用
os.getenv("CLIENT_SECRET")替代明文字符串 -
.env文件需加入.gitignore,且禁止提交到任何远程仓库 - 本地测试时可设默认值(仅限开发):
os.getenv("REFRESH_TOKEN", "dev_token_here"),但上线前必须移除
OAuth2.0 的核心难点不在代码实现,而在授权生命周期管理:token 何时过期、refresh 是否可用、用户是否撤回权限——这些状态变化不会主动通知你的爬虫,得靠严谨的错误反馈和日志追踪来兜底。

















