Hello有一个使用MW 1.18.2构建的网站,要求用户登录 - 如果没有这个,您将无法访问其中的任何页面。我有有效的凭据从浏览器手动登录,但我需要能够从我的Windows窗体应用程序(C#)执行相同操作:当用户单击按钮时,我必须从网站显示(或导航到)某个页面,为此我必须先以编程方式登录。我在PHP和JScript中找到了一些例子,但是在网络工作人员中我是新手,我不知道如何使用它们,我不确定它们是否可以在客户端使用。
非常感谢任何帮助。
答案 0 :(得分:1)
网站身份验证的工作方式如下:
也许最简单的选择是以编程方式在WebBrowser控件中填写表单并提交。执行此操作所需的步骤是discussed here。主要步骤是识别您想要操作的表单元素(用户名和密码字段),所有这些都可以使用大多数Web浏览器中提供的各种开发人员工具来完成。
另一种选择是使用HttpClient提交登录详细信息,然后将收到的会话和cookie数据传递给WebBrowser控件。查看维基百科,登录字段似乎通过POST提交:
URL: https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login&returnto=Main+Page
wpName: <username>
wpPassword: <password>
wpRemember: 1|0
wpLoginAttempt: Log in
wpLoginToken: <a token from a hidden form input>
wpForceHttps: 0
我通过网络标记下的Google Chrome开发人员工具(按F12)来解决这个问题。如果您提交表单,通常可以找到包含表单信息的POST请求(与大多数HTTP GET请求相对)。
你在这里遇到的最大问题可能是表格中隐藏的标记。我想它可以阻止登录表单以外的任何地方的自动登录。如果mediawiki默认使用此功能,则如果您不控制mediawiki安装,则没有简单的方法可以绕过它。此时,您可能只使用第一种方法(因为您必须访问DOM才能获取令牌)。
答案 1 :(得分:1)
谢谢LeoR,它有效:
private void buttonLoginAndShowMainPage_Click(object sender, EventArgs e)
{
this.webBrowser1.Navigate(mediawikisite);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlDocument doc = this.webBrowser1.Document;
HtmlElement LoginForm = doc.Forms[0];
HtmlElement UserName = doc.GetElementById("wpName1");
HtmlElement Password = doc.GetElementById("wpPassword1");
UserName.SetAttribute("value", "myuserid");
Password.SetAttribute("value", "mypassword");
LoginForm.InvokeMember("submit");
}