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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:17:41