2013-10-22 71 views
0

你好有一个用MW 1.18.2构建的网站,它要求用户登录 - 没有这个网站,你不能访问它的任何页面。我有手动从浏览器登录的有效凭据,但我需要能够从我的Windows窗体应用程序(C#)执行相同的操作:当用户单击一个按钮时,我必须显示(或导航到)来自网站的某个页面,为此我必须先以编程方式登录。我已经在PHP和JScript中找到了这些示例,但在该Web工作人员中是新手,我不知道如何使用它们,我不确定它们可以在客户端使用。如何以编程方式登录到mediawiki网站

任何帮助将不胜感激。

+0

您使用的网络浏览器控制或纯代码来显示网页? – Ben

+0

这没关系 - 我可以做任何一种方式 – user2907621

回答

1

网站认证往往工作如下:凭据

  1. 用户提交(通过HTTP POST操作)到服务器
  2. 如果凭据正确,服务器与令牌和潜在会话响应其他cookie令牌。浏览器存储这些信息并将它们随每个请求返回给服务器。

也许最简单的选择是以编程方式在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 

我想通了这一点通过网络标签下使用谷歌Chrome浏览器的开发者工具(按F12)。如果您提交表单,通常可以找到包含表单信息的POST请求(而不是大多数HTTP GET请求)。

您在这里遇到的最大问题可能是表单中隐藏的令牌。我会想象它现在停止从登录表单以外的任何地方进行自动登录。如果mediawiki默认使用此功能,则如果您不控制mediawiki安装,则没有简单的方法绕过它。此时,您可能只需使用第一种方法(因为您必须访问DOM才能获得令牌)。

+0

谢谢LeoR,它的工作原理! – user2907621

1

谢谢雷欧,它的工作原理:

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"); 
    }