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

.Net中HttpClient启用Cookie仍遇Cloudflare 403,求解决方案

解决GetSling API的Cloudflare拦截问题

问题分析

你的代码遇到的是Cloudflare的基础Bot检测拦截。curl能正常请求是因为它的默认请求头和Cookie处理逻辑更贴近普通客户端,而你的C# HttpClient配置还有几个细节没对齐,导致被识别为可疑请求。

可行解决方案

1. 模拟curl的请求头

curl默认的User-Agent是类似curl/7.81.0的格式,你之前用的Other/0.0.1过于特殊,容易被标记。同时curl默认的Accept头是*/*,不是application/json,调整这两个头:

client.DefaultRequestHeaders.Add("User-Agent", "curl/7.81.0");
client.DefaultRequestHeaders.Add("Accept", "*/*");

2. 先获取Cloudflare初始Cookie

Cloudflare会在首次请求时返回必要的会话Cookie(如__cf_bm),你需要先发送一个GET请求到API域名,获取这些Cookie后再发送登录请求:

// 先发送GET请求获取Cloudflare Cookie
await client.GetAsync("/");

3. 清理SecurityProtocol配置

Ssl3已经被废弃,保留它会被Cloudflare视为不安全的请求,只启用现代TLS版本:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;

4. 用序列化工具生成JSON(避免格式问题)

手动拼接JSON容易出现转义错误,建议用System.Text.Json或Newtonsoft.Json生成:

var loginData = new { email = Email.Trim(), password = Password.Trim() };
string json = JsonSerializer.Serialize(loginData);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

修改后的完整代码示例

try
{
    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;

    CookieContainer cookies = new CookieContainer();
    HttpClientHandler clientHandler = new HttpClientHandler();
    clientHandler.CookieContainer = cookies;
    clientHandler.UseCookies = true;

    using HttpClient client = new HttpClient(clientHandler);
    client.DefaultRequestHeaders.Add("User-Agent", "curl/7.81.0");
    client.DefaultRequestHeaders.Add("Accept", "*/*");
    client.BaseAddress = new Uri("https://api.getsling.com");

    // 先获取Cloudflare会话Cookie
    await client.GetAsync("/");

    // 准备登录请求体
    var loginData = new { email = Email.Trim(), password = Password.Trim() };
    string json = JsonSerializer.Serialize(loginData);
    StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await client.PostAsync("/v1/account/login", content);
    // 后续处理响应
}
catch (Exception ex)
{
    // 异常处理
}

额外提示

如果以上调整后还是被拦截,可能需要处理Cloudflare的JavaScript验证(比如挑战页面),这时候需要使用类似PuppeteerSharp的无头浏览器工具模拟真实浏览器行为,但这会增加复杂度。优先尝试上面的轻量调整。

内容的提问来源于stack exchange,提问作者Russ Petersen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:31