C# WebClient 登录网站

4

我正在尝试通过提供我的(正确的)用户名和密码登录网站。

这是代码:

        string URL = @"https://www.t-mobile.co.uk/service/your-account/login/";

        string username = "a_user";
        string password = "a_password";
        //ServicePointManager.Expect100Continue = false;

        CookieAwareClient client = new CookieAwareClient();


        NameValueCollection postData = new NameValueCollection();
        postData.Add("username", username);
        postData.Add("password", password);

        byte[] response = client.UploadValues(URL,  postData);

        ASCIIEncoding enc = new ASCIIEncoding();
        string Source = enc.GetString(response);

但是,惊喜的是,它没有登录。我只是回到了登录页面。

任何帮助都将不胜感激,这已经让我头痛了!

谢谢, 吉姆

为了完整起见,这是我的WebClient类 -

public class CookieAwareClient : WebClient
{
    private CookieContainer m_container = new CookieContainer();
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = m_container;
        }
        return request;
    }
}

如果你调试这个程序,从服务器端会返回任何异常吗? - Lazarus
你好Lazarus,不是的 - "Source" 的值是相同的登录页面,并且没有异常。 - BIDeveloper
4个回答

2

如果您尝试在浏览器中登录,以下内容将发布在服务器上:

org.apache.struts.taglib.html.TOKEN=81243ce1a02ff285745f7c25b86234a9&showLogin=true&upgrade=&username=username&password=password&submit=Log+in

请尝试添加这些值,并找出TOKEN是如何生成的。

编辑:检查页面提供的cookie是否也被提交。

另一个编辑:要查看在进行请求或发布数据时服务器和浏览器(= Firefox)之间发生了什么,请使用LiveHttpHeaders插件。


Grega,谢谢 - 这个问题已经解决了 - 尽管我还没有机会弄清楚TOKEN是什么 - 我现在会去做的。感谢您的帮助!还有一件事,您是如何找出其他被提交的内容的呢?再次感谢,Jim - BIDeveloper

1

你可以尝试添加一个用户代理,例如:

client.Headers.Add("user-agent", "your user agent here");

有时候网站想要确保使用特定的浏览器和/或假装是人类。

你好,乔纳森,根据你的建议,我添加了以下代码:client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");不幸的是,这并没有起到作用。谢谢,吉姆 - BIDeveloper

0

我还注意到您每次创建CookieAwareClientn类时都会创建一个新的CookieContainer。这意味着您的cookie在请求之间不会被保存。将该成员设置为静态,以便始终使用相同的cookiecontainer。

另外,就像其他人所说,您需要进行实验。我所做的是下载并安装Firebug,查看浏览器发送的请求/响应以及标头等。然后,我使用HttpWebRequest/WebClient复制相同的请求。


0

我看到一个初始问题,你正在将数据提交回页面 URL 而不是提交 URL(该 URL 上有一个会话 ID,在我的代码中,我将检查是否存在有效的会话 ID)。此外,还有一个名为“processSaveUserCh()”的 JavaScript 函数在提交之前被调用,它会为用户名创建一个 cookie。如果省略了其中任何一个步骤,可能会导致登录失败,这是一个试验和发现的过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接