如何使用windows应用程序在第三方网站上填写和提交网络表单

本文关键字:提交 表单 网络 网站 windows 何使用 应用程序 第三方 | 更新日期: 2023-09-27 18:21:25

我正在做一个项目,在这个项目中,我必须制作一个windows应用程序,它可以从用户那里获取文本框中的URL。现在,当用户按下"继续"按钮时,应用程序应该在Web浏览器控件中打开该URl,并在该页面上填写包含userID&密码文本框,并通过该网页上的登录按钮提交。现在,我的应用程序应该向用户显示该Web浏览器控件中的下一页。

我可以通过C#代码打开应用程序Web浏览器控件中的url,但我不知道如何找到userID&当前在我的应用程序的网络浏览器控件中打开的网页上的pasword文本框,如何填充它们,如何找到登录按钮&如何通过我的C#代码点击它。

如何使用windows应用程序在第三方网站上填写和提交网络表单

为此,您必须查看第三方网站的页面来源,并找到用户名、密码文本框和提交按钮的id。(如果你提供链接,我会帮你查一下)。然后使用此代码:

//add a reference to Microsoft.mshtml in solution explorer
using mshtml;
private SHDocVw.WebBrowser_V1 Web_V1;
Form1_Load()
{
    Web_V1 = (SHDocVw.WebBrowser_V1)webBrowser1.ActiveXInstance;
}
webBrowser1_Document_Complete()
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        if (webBrowser1.Url.ToString() == "YourLoginSite.Com")
        {
            try
            {
                HTMLDocument pass = new HTMLDocument();
                pass = (HTMLDocument)Web_V1.Document;
                HTMLInputElement passBox = (HTMLInputElement)pass.all.item("PassIDThatyoufoundinsource", 0);
                passBox.value = "YourPassword";
                HTMLDocument log = new HTMLDocument();
                log = (HTMLDocument)Web_V1.Document;
                HTMLInputElement logBox = (HTMLInputElement)log.all.item("loginidfrompagesource", 0);
                logBox.value = "yourlogin";
                HTMLInputElement submit = (HTMLInputElement)pass.all.item("SubmitButtonIDFromPageSource", 0);
                submit.click();
            }
            catch { }
        }
    }
}

我会使用Selenium,而不是WebBrowser控件。

它有一个优秀的C#库,这种东西是它被开发的主要原因。

您不必模拟填写用户名/密码字段,也不必单击登录按钮。您需要模拟浏览器而不是用户。

阅读登录页面html并对其进行解析,以查找用户名和密码字段的id。用户名可以通过查找名称设置为"username"、"user"、"login"等的标签来获得。密码通常是type="password"的标签。用于登录的基于Javascript的弹出面板将涉及解析js。

然后按照这里显示的示例代码,How do you programmable fill in a form and';帖子';网页?

这里重要的是模拟浏览器POST事件。不要担心文本框和其他可视化表单元素,您的目标是生成具有适当键值对的HTTPPOST请求。

您的第一步是浏览您假装的页面的HTML,并找出用户id和密码表单元素的名称。例如,假设它们分别被称为"txtUsername"answers"txtPassword",那么浏览器(或用户代理)将在post请求中发送的post参数将显示为:

txtUsername=fflintstone&txtPassword=ilikerocks

作为背景,您可能想对HTTP的工作原理进行一些研究。但我将把这件事留给你。

另一件重要的事情是弄清楚它将登录请求发布到哪个URL。通常,这是你登录时浏览器地址栏中出现的内容,但可能是其他内容。您需要检查form元素的action属性,以便查看它的位置。

下载Fiddler2的副本可能很有用。是的,这个名字很奇怪,但它是一个很棒的网络调试工具,基本上可以充当代理,捕获浏览器和远程主机之间的一切。一旦你弄清楚如何使用它,你就可以把每个请求-响应拆开,看看发生了什么。它将为您提供被调用的URL、请求的类型(通常是GET或POST)、请求参数和响应的全文。

现在,你想构建你的应用程序。您需要构建生成正确HTTP请求的逻辑,传入表单参数并返回结果。幸运的是,System.Net.HttpWebRequest类将帮助您做到这一点。

假设登录页面位于www.hello.org/login.aspx,它希望您POST登录参数。因此,您的代码可能看起来像这样(显然,这是非常简化的):

Imports System.IO
Imports System.Net
Imports System.Web
Dim uri As String = "http://www.hello.org/login.aspx"
Dim request As HttpWebRequest = DirectCast(WebRequest.Create(uri), HttpWebRequest)
request.Timeout = 10000 ' 10 seconds
request.UserAgent = "FlintstoneFetcher/1.0" ' or whatever
request.Accept = "text/*"
request.Headers.Add("Accept-Language", "en")
request.Method = "POST"
Dim data As Byte() = New ASCIIEncoding().GetBytes("txtUsername=fflintstone&txtPassword=ilikerocks")
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = data.Length
Dim postStream As Stream = request.GetRequestStream()
postStream.Write(data, 0, data.Length)
postStream.Close()
Dim webResponse As HttpWebResponse
webResponse = DirectCast(request.GetResponse(), HttpWebResponse)
Dim streamReader As StreamReader = New StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(1252))
Dim response As String = streamReader.ReadToEnd()
streamReader.Close()
webResponse.Close()

响应字符串现在包含来自远程主机的完整响应文本,该主机应该考虑您已登录。如果远程主机试图设置cookie,您可能需要做一些额外的工作(您需要返回这些cookie)。或者,如果它希望你在连续的页面上通过集成身份验证,你需要在连续的请求中添加凭据,比如:

request.Credentials = New NetworkCredential(theUsername, thePassword)

这应该是足够的信息来破解。我建议您将使用HTTP的逻辑模块化为自己的类。我已经实现了一个复杂的解决方案,它可以登录到某个网站,导航到一个预先确定的页面,解析html,并在"invox"中查找要下载的每日文件,如果存在,则下载它。希望我的经验能让你受益!