如何使用python requests正确登录reddit账号?
Reddit 非Praw原生Python登录实现方案
核心注意事项
- 必须使用同一个
requests.Session实例处理CSRF获取和登录请求,Reddit会将CSRF token与会话Cookie绑定,跨会话的token会直接校验失败 - 请求头必须配置自定义User-Agent,Reddit会拦截默认的
python-requests/xxx标识的请求 - 登录POST参数必须包含
csrf_token、username、password三个必填项,开启两步验证的账号需要额外传入otp字段填6位验证码
完整可运行代码
import requests # 初始化会话,全程使用同一个实例维持状态 session = requests.Session() # 替换为自定义User-Agent,推荐格式:<平台>:<应用名>:<版本号> (by /u/你的Reddit用户名) session.headers.update({ "User-Agent": "windows:my_reddit_tool:v1.0 (by /u/test_user)" }) # 第一步:获取CSRF Token csrf_response = session.get("https://www.reddit.com/login") # 从HTML中提取csrf_token,你也可以用BeautifulSoup等解析库实现 csrf_token = csrf_response.text.split('name="csrf_token" value="')[1].split('"')[0] # 第二步:提交登录请求 login_params = { "csrf_token": csrf_token, "username": "你的Reddit用户名", "password": "你的Reddit密码" # 开启两步验证的账号取消注释下行,填入动态验证码 # "otp": "123456" } login_response = session.post( "https://www.reddit.com/login", data=login_params, allow_redirects=True ) # 第三步:校验登录是否成功 # 直接请求用户信息接口,是最可靠的校验方式 profile_resp = session.get("https://www.reddit.com/api/v1/me") if profile_resp.status_code == 200: user_info = profile_resp.json() print(f"登录成功,当前用户:{user_info['name']},账号注册时间:{user_info['created_utc']}") else: print(f"登录失败,返回状态码:{profile_resp.status_code},错误信息前200字符:{profile_resp.text[:200]}")
校验逻辑说明
不要通过登录请求的状态码判断结果,Reddit登录失败时也会返回200跳转页,调用
/api/v1/me接口是官方认可的校验方式:返回200且能解析到用户字段即为登录有效,返回403说明登录状态未生效。
常见问题排查
- 提交登录后返回403:优先检查CSRF Token是否和当前会话匹配,User-Agent是否为自定义格式
- 提示凭证无效:确认账号密码正确,开启两步验证的账号是否传入了正确的otp验证码
- 多次请求后登录失败:触发Reddit频率限制,等待10-15分钟后再测试即可
内容的提问来源于stack exchange,提问作者wait3
相关产品推荐
相关产品推荐

