Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#ASP.Net中的元素ID向网站发送密钥?_C#_Asp.net_Html Agility Pack - Fatal编程技术网

如何使用C#ASP.Net中的元素ID向网站发送密钥?

如何使用C#ASP.Net中的元素ID向网站发送密钥?,c#,asp.net,html-agility-pack,C#,Asp.net,Html Agility Pack,在下面的应用程序中,我使用HTML agility pack从给定url提取HTML文档。现在我需要知道如何使用HTML文档中的元素ID并在字段中输入文本,最后点击SUBMIT按钮提交表单 protected void Button1_Click(object sender, EventArgs e) { string Url = "https://something.com/login.asp"; HtmlWeb web = new HtmlWeb(); HtmlA

在下面的应用程序中,我使用HTML agility pack从给定url提取HTML文档。现在我需要知道如何使用HTML文档中的元素ID并在字段中输入文本,最后点击SUBMIT按钮提交表单

protected void Button1_Click(object sender, EventArgs e)
{
    string Url = "https://something.com/login.asp"; 
    HtmlWeb web = new HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = web.Load(Url);
}

当前应用程序自动执行web数据输入。

HtmlAgilityPack不是这样工作的。您只是持有表示HTML文档中节点的数据结构,而不是承载web浏览器或客户端的实例

解决方案是遍历HtmlDocument实例并找到正确的
元素,然后提取相应的子
元素。您需要创建自己的HttpWebRequest对象,并使用适当编码的键/值对手动填充其
RequestStream
(假设它是POST表单而不是GET表单)


如果您要提交的表单是静态的,并且不会更改,那么您根本不需要使用HTMLAGILITPACK,只需将表单名称和值硬编码到您的HttpWebRequest中即可。

HTMLAGILITPACK不能这样工作。您只是持有表示HTML文档中节点的数据结构,而不是承载web浏览器或客户端的实例

解决方案是遍历HtmlDocument实例并找到正确的
元素,然后提取相应的子
元素。您需要创建自己的HttpWebRequest对象,并使用适当编码的键/值对手动填充其
RequestStream
(假设它是POST表单而不是GET表单)


如果您要提交的表单是静态的并且不会更改,那么您根本不需要使用HtmlAgilityPack,只需将表单名称和值硬编码到您的HttpWebRequest中。

我正在做类似的事情,但我正在手动获取页面html

// do webrequest stuff and return raw html
string html = DemoDoHttpGet(url, cookieContainer);

// I'm hitting an asp.net page so I have to repeat a bunch of values back to the server
// key is the "name" attribute of an element i want to find in the html
// i gathered these manually by watching a normal exchange with fiddler
var fields = new Dictionary<string, string>();
fields.Add(System.Web.HttpUtility.UrlDecode("__LASTFOCUS"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTTARGET"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTARGUMENT"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__VIEWSTATE"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTVALIDATION"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("ctl00%24ContentPlaceHolder1%24Login1%24LoginButton"), string.Empty);

// this method searches the html for elements with the given names and updates
// the value for each item in the field collection with the value sent from the server
Scraper.GetFieldValues(fields, html);

/* looks kind of like this

        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);

        var names = new List<string>();
        foreach (var ditem in fields)
        {
            names.Add(ditem.Key);
        }

        foreach (var nitem in names)
        {
            // find items, read value

            string xpath = string.Format("//*[@name=\"{0}\"]", (nitem));
            var nodes = doc.DocumentNode.SelectNodes(xpath);

            // if node found read whatever attribute is appropriate,
            // write value back to fields collection

*/

// here i'm manually providing values for login username/password
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24UserName"), "my@email.aaa");
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24Password"), "mypassword");

// another webrequest to post back to the server

var request2 = (HttpWebRequest)WebRequest.Create(url);
request2.CookieContainer = cookieContainer;
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";

var args = new StringBuilder();
foreach (var item in fields)
{
    args.Append(System.Web.HttpUtility.UrlEncode(item.Key));
    args.Append("=");
    args.Append(System.Web.HttpUtility.UrlEncode(item.Value));
    args.Append("&");
}

using (System.IO.StreamWriter writer = 
    new System.IO.StreamWriter(request2.GetRequestStream()))
{
    writer.Write(args.ToString().TrimEnd('&'));
}

string html;
using (var response2 = (System.Net.HttpWebResponse)request2.GetResponse())
using (var rdr2 = new System.IO.StreamReader(response2.GetResponseStream()))
{
    html = rdr2.ReadToEnd();
}
//执行webrequest并返回原始html
字符串html=demoHttpGet(url,cookieContainer);
//我正在访问一个asp.net页面,因此我必须向服务器重复一系列值
//键是我想在html中找到的元素的“name”属性
//我通过观看与fiddler的正常交流来手动收集这些数据
var fields=newdictionary();
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu LASTFOCUS”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTTARGET”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTARGUMENT”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uuu VIEWSTATE”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTVALIDATION”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“ctl00%24ContentPlaceHolder1%24Login1%24LoginButton”),string.Empty);
//此方法在html中搜索具有给定名称和更新的元素
//字段集合中每个项的值以及从服务器发送的值
getFieldValue(字段,html);
/*看起来有点像这样
var doc=new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
变量名称=新列表();
foreach(字段中的变量数据项)
{
name.Add(数据项键);
}
foreach(名称中的var nitem)
{
//查找项目,读取值
字符串xpath=string.Format(“//*[@name=\“{0}\”],(nitem));
var nodes=doc.DocumentNode.SelectNodes(xpath);
//如果发现节点,则读取任何适当的属性,
//将值写回字段集合
*/
//这里我手动提供登录用户名/密码的值
fields.Add(System.Web.HttpUtility.UrlDecode(
“ctl00%24ContentPlaceholder 1%24Login1%24UserName”),”my@email.aaa");
fields.Add(System.Web.HttpUtility.UrlDecode(
“ctl00%24ContentPlaceholder 1%24Login1%24Password”),“mypassword”);
//要发回服务器的另一个webrequest
var request2=(HttpWebRequest)WebRequest.Create(url);
request2.CookieContainer=CookieContainer;
request2.Method=“POST”;
request2.ContentType=“application/x-www-form-urlencoded”;
var args=新的StringBuilder();
foreach(字段中的变量项)
{
Append(System.Web.HttpUtility.UrlEncode(item.Key));
参数。追加(=”;
Append(System.Web.HttpUtility.UrlEncode(item.Value));
附加参数(“&”);
}
使用(System.IO.StreamWriter writer=
新System.IO.StreamWriter(request2.GetRequestStream())
{
writer.Write(args.ToString().TrimEnd('&');
}
字符串html;
使用(var response2=(System.Net.HttpWebResponse)request2.GetResponse()
使用(var rdr2=new System.IO.StreamReader(response2.GetResponseStream())
{
html=rdr2.ReadToEnd();
}

我正在做类似的事情,但我正在手动获取页面html

// do webrequest stuff and return raw html
string html = DemoDoHttpGet(url, cookieContainer);

// I'm hitting an asp.net page so I have to repeat a bunch of values back to the server
// key is the "name" attribute of an element i want to find in the html
// i gathered these manually by watching a normal exchange with fiddler
var fields = new Dictionary<string, string>();
fields.Add(System.Web.HttpUtility.UrlDecode("__LASTFOCUS"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTTARGET"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTARGUMENT"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__VIEWSTATE"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("__EVENTVALIDATION"), string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode("ctl00%24ContentPlaceHolder1%24Login1%24LoginButton"), string.Empty);

// this method searches the html for elements with the given names and updates
// the value for each item in the field collection with the value sent from the server
Scraper.GetFieldValues(fields, html);

/* looks kind of like this

        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);

        var names = new List<string>();
        foreach (var ditem in fields)
        {
            names.Add(ditem.Key);
        }

        foreach (var nitem in names)
        {
            // find items, read value

            string xpath = string.Format("//*[@name=\"{0}\"]", (nitem));
            var nodes = doc.DocumentNode.SelectNodes(xpath);

            // if node found read whatever attribute is appropriate,
            // write value back to fields collection

*/

// here i'm manually providing values for login username/password
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24UserName"), "my@email.aaa");
fields.Add(System.Web.HttpUtility.UrlDecode(
    "ctl00%24ContentPlaceHolder1%24Login1%24Password"), "mypassword");

// another webrequest to post back to the server

var request2 = (HttpWebRequest)WebRequest.Create(url);
request2.CookieContainer = cookieContainer;
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";

var args = new StringBuilder();
foreach (var item in fields)
{
    args.Append(System.Web.HttpUtility.UrlEncode(item.Key));
    args.Append("=");
    args.Append(System.Web.HttpUtility.UrlEncode(item.Value));
    args.Append("&");
}

using (System.IO.StreamWriter writer = 
    new System.IO.StreamWriter(request2.GetRequestStream()))
{
    writer.Write(args.ToString().TrimEnd('&'));
}

string html;
using (var response2 = (System.Net.HttpWebResponse)request2.GetResponse())
using (var rdr2 = new System.IO.StreamReader(response2.GetResponseStream()))
{
    html = rdr2.ReadToEnd();
}
//执行webrequest并返回原始html
字符串html=demoHttpGet(url,cookieContainer);
//我正在访问一个asp.net页面,因此我必须向服务器重复一系列值
//键是我想在html中找到的元素的“name”属性
//我通过观看与fiddler的正常交流来手动收集这些数据
var fields=newdictionary();
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu LASTFOCUS”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTTARGET”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTARGUMENT”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uuu VIEWSTATE”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“\uu EVENTVALIDATION”),string.Empty);
fields.Add(System.Web.HttpUtility.UrlDecode(“ctl00%24ContentPlaceHolder1%24Login1%24LoginButton”),string.Empty);
//此方法在html中搜索具有给定名称和更新的元素
//字段集合中每个项的值以及从服务器发送的值
getFieldValue(字段,html);
/*看起来有点像这样
var doc=new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
变量名