Python开发Reddit r/place机器人登录授权失败问题求助
r/place Python机器人登录失败问题排查与修复建议
我和GitHub上的几位合作者重启了一个旧项目,开发适配r/place的Python机器人,但一直遇到登录失败的问题。我们尝试过多次重试(有说法称这个问题是随机出现的),但始终无法解决,以下是我们的登录代码:
while True: try: client = requests.Session() client.proxies = proxy.get_random_proxy(self, name) client.headers.update( { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36" } ) client.get("https://www.reddit.com") r = client.get( "https://www.reddit.com/login", proxies=proxy.get_random_proxy(self, name), ) login_get_soup = BeautifulSoup(r.content, "html.parser") csrf_token = login_get_soup.find( "input", {"name": "csrf_token"} )["value"] data = { "username": username, "password": password, "dest": "https://new.reddit.com/", "csrf_token": csrf_token, "otp": "", } r = client.post( "https://www.reddit.com/login", data=data, proxies=proxy.get_random_proxy(self, name), ) if r.text.find("INCORRECT_USERNAME_PASSWORD") != -1: logger.warning("{} - Authorization failed! trying again in 10 seconds...", username) time.sleep(10) continue break except Exception: logger.error( "Failed to connect to websocket, trying again in 30 seconds..." ) time.sleep(30)
问题排查与修复方案
1. 代理会话一致性问题
代码中每次请求都调用proxy.get_random_proxy更换代理,但Reddit登录需要**同一个会话(Cookie+代理)**完成整个流程,换代理会导致之前获取的Cookie失效,直接触发登录失败。
修复:整个登录流程只设置一次代理,复用同一个Session:
# 只在Session初始化时设置一次代理 proxy = proxy.get_random_proxy(self, name) client.proxies = proxy # 后续get/post请求不再单独设置proxies参数
2. 两步验证(OTP)未处理
如果账号开启了两步验证,空的otp字段会直接导致登录失败,代码里完全没处理这种情况。
修复:
- 要么在登录前让用户输入OTP代码,传入
data["otp"] - 要么集成
pyotp库自动生成OTP(需要账号的密钥) - 新增登录失败判断,识别是否需要OTP:
if "REQUIRED_OTP" in r.text: logger.warning("{} - 账号需要两步验证,请提供OTP代码", username) # 这里添加OTP获取逻辑,比如输入或调用生成库 break
3. 异常捕获太宽泛
直接捕获Exception会掩盖具体错误(比如代理失效、CSRF Token找不到、HTTP 403封禁等),无法定位问题根源。
修复:捕获具体异常类型,针对性处理:
except requests.exceptions.RequestException as e: logger.error("{} - 网络请求失败: {},30秒后重试...", username, str(e)) time.sleep(30) except AttributeError as e: logger.error("{} - 解析CSRF Token失败: {},10秒后重试...", username, str(e)) time.sleep(10)
4. 登录状态判断不准确
仅靠INCORRECT_USERNAME_PASSWORD判断失败不够全面,比如登录成功但跳转异常、账号被临时封禁等情况无法识别。
修复:新增登录成功验证步骤:
# 登录后访问用户主页验证状态 test_r = client.get(f"https://www.reddit.com/user/{username}/") if test_r.status_code == 200 and username.lower() in test_r.text.lower(): logger.info("{} - 登录成功", username) break else: logger.warning("{} - 登录状态异常,重试中...", username) time.sleep(10) continue
5. 其他优化建议
- 更新
User-Agent:Chrome 99版本过旧,换成最新版本的浏览器UA,降低被识别为爬虫的概率 - 检查代理质量:确保代理能稳定访问Reddit,避免使用被封禁的代理
- 控制重试频率:Reddit有严格的速率限制,频繁重试可能导致账号被临时封禁
内容的提问来源于stack exchange,提问作者ahmad
相关产品推荐
相关产品推荐

