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

Reddit登录请求无响应致程序崩溃,求技术排查建议

问题:Reddit自动登录程序发起POST请求后崩溃无响应

我正在开发一个自动登录Reddit并执行操作的程序,已知发送POST登录请求需携带CSRF、OTP、PASS、DEST、USER参数,且已确保所有参数填充正确,但程序发起请求后始终无法收到Reddit的响应,直接崩溃。已尝试调整请求头但无效果,相关C#代码如下:

using System;
using System.Net.Http;
using System.Collections.Generic;
// Set up the HTTP client
static string getBetween(string strSource, string strStart, string strEnd)
{
    if (strSource.Contains(strStart) && strSource.Contains(strEnd))
    {
        int Start, End;
        Start = strSource.IndexOf(strStart, 0) + strStart.Length;
        End = strSource.IndexOf(strEnd, Start);
        return strSource.Substring(Start, End - Start);
    }

    return "";
}

var client = new HttpClient();
client.DefaultRequestHeaders.Add("UserAgent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0");
client.DefaultRequestHeaders.Add("Pragma", "no-cache");
client.DefaultRequestHeaders.Add("Accept", "*/*");
client.DefaultRequestHeaders.Add("Referer", "https://www.google.com");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
//client.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
client.BaseAddress = new Uri("https://www.reddit.com/");
string csrf = "FAIL";
using (var response = client.GetAsync("https://www.reddit.com/login").Result)
{
    if (response.IsSuccessStatusCode)
    {
        csrf = getBetween(response.Content.ReadAsStringAsync().Result, "csrf_token\" value=\"", "\"");
    }
}
Console.WriteLine(csrf);
// Set up the login form data
var formData = new Dictionary<string, string>
            {
                { "csrf_token", csrf},
                { "otp", "" },
                { "password", "XXXX" },
                { "dest", "https://reddit.com/" },
                { "username", "XXXX" }
            };



// Post the login form
var response4 = await client.PostAsync("https://www.reddit.com/login/", new FormUrlEncodedContent(formData));

// Check the response status code
//if (response.IsSuccessStatusCode)
//{
//    Console.WriteLine("Login successful!");
//}
//else
//{
//    Console.WriteLine("Login failed!");
//}
排查思路
  • 同步异步混用导致死锁:代码同时使用.Result(同步阻塞)和await(异步),这是死锁的常见诱因,会直接导致程序崩溃。建议统一使用异步模式,将所有.Result替换为await,并确保包含这些代码的方法标记为async。
  • User-Agent格式不完整:当前设置的User-Agent字符串缺少闭合的),Reddit可能因请求头不规范拒绝服务,引发程序处理失败崩溃。修正为完整格式:"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0) like Gecko"。
  • 未捕获异常:代码中没有任何异常捕获逻辑,网络错误、超时、服务端错误等情况都会抛出未处理异常导致崩溃。在请求代码外包裹try-catch块,捕获HttpRequestException、TaskCanceledException等异常并输出详细错误信息。
  • Cookie会话未维护:Reddit登录依赖Cookie维持会话,当前HttpClient未配置Cookie容器,GET请求获取的CSRF对应的Cookie无法在POST请求中携带。需配置HttpClientHandler启用Cookie容器:
    var handler = new HttpClientHandler { UseCookies = true, CookieContainer = new CookieContainer() };
    var client = new HttpClient(handler);
    
  • Referer设置错误:登录请求的Referer应设为Reddit登录页面(https://www.reddit.com/login),而非Google,错误的Referer可能触发反爬机制,导致请求被拦截。
  • CSRF提取不可靠:字符串截取方式提取CSRF token,一旦页面结构变化就会提取失败(返回空值),后续POST请求携带无效CSRF会被拒绝,引发异常。改用HTML解析库(如HtmlAgilityPack)定位CSRF元素,提高提取稳定性。
  • 未设置请求超时:默认超时设置可能不合理,请求长时间无响应会导致程序崩溃。手动设置超时时间:client.Timeout = TimeSpan.FromSeconds(30);,并捕获超时异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:01:19