C# 有没有办法找出HttpClient POST在一个简单的表单站点上失败的原因,否则该站点在webBrowser控件中工作?

C# 有没有办法找出HttpClient POST在一个简单的表单站点上失败的原因,否则该站点在webBrowser控件中工作?,c#,post,httpclient,C#,Post,Httpclient,我正在编写一些C#代码来自动提交网页表单,该表单在WebBrowser控件中起作用,但在其他方法(如HttpClient或WebRequest)中失败。我试图找出POST请求的错误,因为这就是我遇到问题的地方 简言之: 1.)我接收页面的HTML,读取base64字符串编码的验证码图像和隐藏密钥 2.)将base64字符串传递给我编写的python脚本,该脚本使用OpenCV从字符串重建图像,OCR数字,解决数学问题并返回其“猜测”(~90%准确度) 3.)发布验证码猜测和隐藏键(+2个其他简单

我正在编写一些C#代码来自动提交网页表单,该表单在WebBrowser控件中起作用,但在其他方法(如HttpClient或WebRequest)中失败。我试图找出POST请求的错误,因为这就是我遇到问题的地方

简言之:

1.)我接收页面的HTML,读取base64字符串编码的验证码图像和隐藏密钥

2.)将base64字符串传递给我编写的python脚本,该脚本使用OpenCV从字符串重建图像,OCR数字,解决数学问题并返回其“猜测”(~90%准确度)

3.)发布验证码猜测和隐藏键(+2个其他简单字段),并阅读响应以验证提交

我在VS2019工作,通过使用提取的数据通过文档类自动化基于表单的WebBrowser控件,我已经能够创建我目标的“黑客”版本,并且它可以工作,但是这非常低效,需要使用表单/控件,使得它“庞大”,难以集成到更大的程序中

我已经检查了通过FireFox在正常网站操作期间发送的帖子数据和标题,并在我的HttpClient代码中复制了它们,但尽管我可以收到响应,但这是唯一一个告诉我出了什么问题的回复。我没有收到包含预期服务器应用程序在发布故意错误数据时生成的错误的响应,例如缺少字段或存在特定错误的错误验证码答案

我的直觉告诉我,在解析我提交的数据之前,服务器已经被我的“tauth”字段或请求中的某个内容阻塞了,这就是我被困了好几天的原因,我一直在尝试我能想到的一切,但这变得比它要解决的问题更痛苦。作为记录,我不做很多网络工作

第一次尝试:

当使用正确的数据成功提交表单时,页面返回文本,指示tBtc的发送已与发送ID一起发送。如果未成功,页面将报告与原因相关的各种错误,如“无效垃圾邮件过滤器”、“无效testnet地址”、“无效金额”和“超出限制”。“重试”错误用于一般错误,包括10分钟后提交的提交,但没有页面刷新或隐藏的键字段错误,并且是我在POST请求后的响应中收到的错误。假设我的POST数据正确,我应该会收到Tx ID响应


Html数据提取代码与工作WebBrowser控件版本中使用的代码相同,因此我知道我拥有正确的数据,只是不确定我是否发布了正确的数据?非常感谢所有帮助。

使用Fiddler捕获(a)从浏览器发送的请求和(b)从程序发送的请求。仔细检查是否存在任何差异,无论差异有多小,并解释所有差异。@JohnWu感谢您的建议,这对POST请求没有帮助(它们是相同的a&b),但有助于发现需要在原始GET之后检索PNG,该GET用作后续POST请求成功的时间验证标志。即使在浏览器中,如果提交时空闲时间过长,页面也会抛出错误。我从来没有想到一个img可能不仅仅是一个img(除了隐写术)。代码现在工作得很好。
private static async Task DoPOSThttpAsync(string c, string a, string t)
    {
        var values = new Dictionary<string, string>
        {
            { "captcha", c }, //ex. c == "17"
            { "taddress", a },//a == "moz6XAHSMTNo7PjAa1czVaPhspJszfpTDZ" - testnet wallet address
            { "amount", "0.01" },
            { "tauth", @t } //hidden key
        };

        var content = new FormUrlEncodedContent(values); //tauth gets mangled here?
        HttpClient hclient = new HttpClient();
        hclient.Timeout = TimeSpan.FromSeconds(5);

        var response = await hclient.PostAsync("https://testnet-faucet.mempool.co/", content);
        var responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
    }