填写表单c# &文章的错误

本文关键字:文章 错误 表单 | 更新日期: 2023-09-27 18:14:58

我从另一个问题中以c#填写表单为例,但是当我运行代码时,我只是再次获得页面(好像我没有提交任何内容)。我尝试手动转到URL并添加?variable=value&variable2=value2,但似乎没有预填充表单,不确定这是否是为什么不工作。

private void button2_Click(object sender, EventArgs e)
{
    var encoding = new ASCIIEncoding();
    var postData = "appid=001";
    postData += ("&email=chris@test.com");
    postData += ("&receipt=testing");
    postData += ("&machineid=219481142226.1");
    byte[] data = encoding.GetBytes(postData);
    var myRequest =
       (HttpWebRequest)WebRequest.Create("http://www.example.com/licensing/check.php");
    myRequest.Method = "POST";
    myRequest.ContentType = "application/x-www-form-urlencoded";
    myRequest.ContentLength = data.Length;
    var newStream = myRequest.GetRequestStream();
    newStream.Write(data, 0, data.Length);
    newStream.Close();
    var response = myRequest.GetResponse();
    var responseStream = response.GetResponseStream();
    var responseReader = new StreamReader(responseStream);
    label2.Text = responseReader.ReadToEnd();
}

填写表单c# &文章的错误

要以编程方式提交表单,一般的想法是要模拟浏览器。为此,您需要找到URL、HTTP头和POST数据的正确组合,以满足服务器的要求。

要弄清楚服务器需要什么,最简单的方法是使用Fiddler、FireBug或其他工具,这些工具可以让您准确地检查浏览器通过网络发送的内容。然后,您可以在代码中进行试验,添加或删除标头,更改POST数据等,直到服务器接受请求。

这里有一些你可能会遇到的陷阱:

  • 首先,确保将表单提交到正确的目标URL。许多表单不会向自己发送,而是会发送到其他URL
  • 接下来,表单可能会检查会话cookie或身份验证cookie,这意味着您需要发出一个请求(获取cookie),然后发出后续的cookie请求以提交表单。
  • 表单可能有您忘记填写的隐藏字段。使用Fiddler或Firebug查看在浏览器中手动填写表单时提交的表单字段,并确保在代码
  • 中包含相同的字段
  • 根据服务器实现,您可能需要将@字符编码为%40

可能还有其他的挑战,但上面这些是最有可能的。要查看完整的列表,请查看我对另一个屏幕抓取问题的回答。

顺便说一句,你用来提交表单的代码比需要的要复杂和冗长得多。相反,您可以使用WebClient.UploadValues(),用更少的代码和自动完成的编码来完成相同的事情。这样的:

NameValueCollection postData = new NameValueCollection();
postData.Add ("appid","001");
postData.Add ("email","chris@test.com");
postData.Add ("receipt","testing");
postData.Add ("machineid","219481142226.1");
postData.Add ("checkit","checkit");
WebClient wc = new WebClient();
byte[] results = wc.UploadValues (
                       "http://www.example.com/licensing/check.php", 
                       postData);
label2.Text = Encoding.ASCII.GetString(results); 

更新:

根据我们在评论中的讨论,你遇到的问题是我最初在上面提到的原因之一:

表单可能正在检查会话cookie或身份验证Cookie,这意味着您需要发出一个请求(以获取)Cookie),然后发出一个后续的Cookie请求来提交表单。

在使用cookie进行会话跟踪或身份验证的服务器上,如果请求没有附加cookie,服务器通常会重定向到相同的URL。重定向将包含一个Set-Cookie头,这意味着当重定向的URL被重新请求时,它将由客户端附加一个cookie。如果第一个请求是表单POST,这种方法就失效了,因为服务器和/或客户端没有处理POST的重定向。

修复方法是,正如我最初描述的那样,发出一个初始GET请求来获取cookie,然后作为第二个请求发出POST,传递回cookie。

:

using System;
public class CookieAwareWebClient : System.Net.WebClient
{
    private System.Net.CookieContainer Cookies = new System.Net.CookieContainer();
    protected override System.Net.WebRequest GetWebRequest(Uri address)
    {
        System.Net.WebRequest request = base.GetWebRequest(address);
        if (request is System.Net.HttpWebRequest)
        {
            var hwr = request as System.Net.HttpWebRequest;
            hwr.CookieContainer = Cookies;
        }
        return request;
    }
} 
class Program
{
    static void Main(string[] args)
    {
        var postData = new System.Collections.Specialized.NameValueCollection();
        postData.Add("appid", "001");
        postData.Add("email", "chris@test.com");
        postData.Add("receipt", "testing");
        postData.Add("machineid", "219481142226.1");
        postData.Add("checkit","checkit");
        var wc = new CookieAwareWebClient();
        string url = "http://www.example.com/licensing/check.php";
        // visit the page once to get the cookie attached to this session. 
        // PHP will redirect the request to ensure that the cookie is attached
        wc.DownloadString(url);
        // now that we have a valid session cookie, upload the form data
        byte[] results = wc.UploadValues(url, postData);
        string text = System.Text.Encoding.ASCII.GetString(results);
        Console.WriteLine(text);
    }
}