gpt4 book ai didi

c# - 如何在我的客户端应用程序中处理第三方站点上的 recaptcha

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:57 25 4
gpt4 key购买 nike

我很好奇人们如何为没有公共(public) API 的网站构建第三方应用程序,但我真的找不到关于这个主题的任何教程。所以我决定试一试。我创建了一个简单的桌面应用程序,它使用 HttpClient 向我经常使用的站点发送 GET 请求,然后解析响应并在我的 WPF 窗口中显示数据。这种方法效果很好(可能是因为网站相当简单)。

但是,今天我尝试从不同的地方运行我的应用程序,并且在响应我的应用程序请求时,我不断收到 403 错误。事实证明,我使用的网络通过 VPN 服务器,而我尝试访问的站点使用 CloudFlare 作为保护层,这显然迫使 VPN 用户输入 reCaptcha 才能访问目标站点。

var baseAddress = new Uri("http://www.cloudflare.com");
using (var client = new HttpClient() { BaseAddress = baseAddress })
{
var message = new HttpRequestMessage(HttpMethod.Get, "/");
//this line returns CloudFlare home page if I use regualr network and reCaptcha page, when I use VPN
var result = await client.SendAsync(message);
//this line throws if I use VPN (403 Forbidden)
result.EnsureSuccessStatusCode();
}

现在的问题是:在客户端应用程序中处理 CloudFlare 保护的正确方法是什么?我是否必须像网络浏览器一样在我的应用程序中显示 reCaptcha?我是否必须设置任何特定的 header 才能获得正确的响应而不是 403?欢迎任何提示,因为这对我来说是一个全新的领域。

附言我用 C# 编写,因为这是我最熟悉的语言,但我不介意回答者使用任何其他语言,只要他们能回答问题即可。

最佳答案

我想,一种解决方法是在客户端应用程序之外的网络浏览器中处理验证码。

  1. 解析响应以查看它是否是验证码页面。
  2. 如果是 - 在浏览器中打开此页面。
  3. 让用户在那里解决验证码。
  4. 从浏览器的 cookie 存储中获取 CloudFlare cookie。您将需要 __cfduid(用户 ID)和 cf_clearance(解决验证码的证明)。
  5. 将这些 cookie 附加到客户端应用程序发送的请求。
  6. 在接下来的 24 小时内正常使用应用程序(直到 CloudFlare cookie 过期)。

现在这里最难的部分是 (4)。手动复制粘贴 cookie 很容易使我问题中的代码片段适用于 VPN:

var baseAddress = new Uri("http://www.cloudflare.com");
var cookieContainer = new CookieContainer();
using (var client = new HttpClient(new HttpClientHandler() { CookieContainer = cookieContainer } , true) { BaseAddress = baseAddress })
{
var message = new HttpRequestMessage(HttpMethod.Get, "/");
//I've also copy-pasted all the headers from browser
//some of those might be optional
message.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0");
message.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
message.Headers.Add("Accept-Encoding", "gzip, deflate" });
message.Headers.Add("Accept-Language", "en-US;q=0.5,en;q=0.3");
//adding CloudFlare cookies
cookieContainer.Add(new Cookie("__cfduid", "copy-pasted-cookie-value", "/", "cloudflare.com"));
cookieContainer.Add(new Cookie("cf_clearance", "copy-pasted-cookie-value", "/", "cloudflare.com"));
var result = await client.SendAsync(message);
result.EnsureSuccessStatusCode();
}

但我认为自动化获取 cookie 的过程将是一项棘手的任务,因为不同的浏览器将 cookie 存储在不同的位置和/或格式。更不用说您需要使用外部浏览器才能使这种方法起作用,这真的很烦人。尽管如此,还是需要考虑一下。

关于c# - 如何在我的客户端应用程序中处理第三方站点上的 recaptcha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35767845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com