如何在第三人上程序化提交特定ID的表格';的网站
本文关键字:表格 ID 网站 第三人 提交 程序化 | 更新日期: 2023-09-27 18:27:06
在网站上:http://www.e-korepetycje.net/有一种用于登录的表单:
<form method="post" action="http://www.e-korepetycje.net/zaloguj" id="login-box">
<fieldset>
<ul>
<li><input type="text" name="login" placeholder="Login or email"></li>
<li><input type="password" name="passwd" placeholder="Password"></li>
<li><input type="submit" value="Log in"></li>
</ul>
</fieldset>
</form>
我想填写输入字段login
和passwd
,然后用C#程序提交这份表格。
我看过这个主题,但投票最多的答案只是一些人的代码,它没有引用有问题的HTML,也没有响应引用的HTML,所以很难理解
更新
我用了雷佩蒂的答案。我在这里得到了异常var inputField = Descendants(form).First(x => x.GetAttribute("name") == "login");
序列不包含指定的元素(InvalidOperationException
)。
使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用System.Data;使用System.Drawing;使用System.Linq;使用System.Text;使用System.Threading.Tasks;使用System.Windows.Forms;
命名空间WindowsFormsApplication1{公共分部类Form1:Form{公共窗体1(){InitializeComponent();WebBrowser wb=新建System.Windows.Forms.WebBrowser();wb。DocumentCompleted+=wb_DocumentCompleted;wb。导航("http://www.e-korepetycje.net/");Console.WriteLine("导航后");}public static IEnumerable Descendants(HtmlElement根){foreach(root.Children中的HtmlElement子级){收益回报子;
if (!child.CanHaveChildren)
continue;
foreach (var subChild in Descendants(child))
yield return child;
}
}
static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
WebBrowser wb = ((WebBrowser)sender);
if (e.Url.AbsolutePath == (sender as WebBrowser).Url.AbsolutePath) {
Console.WriteLine("COMPLETED");
//HtmlElementCollection elems = wb.Document.GetElementsByTagName("HTML");
//Console.WriteLine(elems[0].OuterHtml);
var form = wb.Document.GetElementById("login-box");
Console.WriteLine(Descendants(form).Count());
var inputField = Descendants(form).First(x => x.GetAttribute("name") == "login");
inputField.SetAttribute("value", "login");
inputField = Descendants(form).First(x => x.GetAttribute("name") == "passwd");
inputField.SetAttribute("value", "passwd");
var submitButton = Descendants(form).First(x => x.TagName == "input" && x.GetAttribute("type") == "submit");
submitButton.RaiseEvent("click");
}
}
}
}
输出
After navigate
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:'Windows'assembly'GAC'Microsoft.mshtml'7.0.3300.0__b03f5f7f11d50a3a'Microsoft.mshtml.dll'. Module was built without symbols.
COMPLETED
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Core.resources'v4.0_4.0.0.0_pl_b77a5c561934e089'System.Core.resources.dll'. Module was built without symbols.
A first chance exception of type 'System.InvalidOperationException' occurred in System.Core.dll
12
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:'Windows'Microsoft.Net'assembly'GAC_MSIL'System.Configuration'v4.0_4.0.0.0__b03f5f7f11d50a3a'System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
更新2
我也试过:
var inputField = wb.Document.GetElementsByTagName("text")["login"];
但它返回CCD_ 5。
通过编程与网站交互(从C#应用程序)IMO最简单的方法是使用WebBrowser
控件:
WebBrowser wb = new System.Windows.Forms.WebBrowser();
wb.Navigate(" http://www.e-korepetycje.net/");
现在,该网站已加载到嵌入式web浏览器(基于IE)中。您可以注入一些JavaScript代码来执行此任务,但从C#也很容易。文档下载和DOM解析完成后,您可以找到表单(使用其ID)。将所有后续代码放入wb.Document.DocumentCompleted
事件处理程序中(如果您愿意,也可以等待wb.Document.DocumentStatus
属性)。
var form = wb.Document.GetElementById("login-box");
然后在里面找到提交按钮:
var submitButton = form
.Descendants()
.First(x => x.TagName == "input" && x.GetAttribute("type") == "submit");
然后模拟点击:
submitButton.RaiseEvent("click");
我使用了一个小助手函数来迭代HtmlElement
:的所有子级
public static IEnumerable<HtmlElement> Descendants(this HtmlElement root)
{
foreach (HtmlElement child in root.Children)
{
yield return child;
if (!child.CanHaveChildren)
continue;
foreach (var subChild in Descendants(child))
yield return child;
}
}
顺便说一句,如果你想注入JavaScript代码,它必须简单如下(当然,你需要更多的代码来用Document.CreateElement()
创建脚本函数,并用Document.InvokeScript()
调用它):
document.forms["login-box"].submit();
请注意,同样的技术也可以用于填写表格:
var inputField = form
.Descendants()
.First(x => x.GetAttribute("name") == "login");
inputField.SetAttribute("value", "login name to post");
当然,所有这些代码都可以被推广到可以重用的程度。。。
您可以创建一个windows窗体,向其中添加WebBrowser控件,然后将url设置为网站。在url加载到浏览器控件后,您可以访问Document属性以使用InvokeScript(script)方法调用脚本(填充用户ID和密码并提交表单)。