C#实现模拟登录新浪微博(201509)

      经过坚持不懈的探索和尝试,我用C#成功实现了模拟登录新浪微博。在在C#中调用微博密码加密文件ssologin.js C#模拟登录微博请求passport.weibo.com结果文章中讲述了请求prelogin,ssologin以及获取passport链接的详细过程,这里我会分享最终成功登录Cookie的处理方式。

      若模拟登录成功,那么请求passport.weibo.com时会重定向至ajaxlogin.php,请求ajaxlogin.php,从服务器应返回”result”:true与”http:\/\/d.weibo.com\/?from=signin”,此时请求http://d.weibo.com/?from=signin即可访问到当前登录帐号首页,登录成功时返回的html内容如下:

模拟登录成功后从服务器返回的数据

     现在先来分析 C#模拟登录微博请求passport.weibo.com结果提及的我分析登录失败的原因。

     1. 开启Fiddler对模拟登录的结果是否有影响?

     目前我用的是WIN10+VS2012+Fiddler4.6.0。在这种配置下,开启Fiddler,浏览器无法正常登录微博,关闭Fiddler即可正常登录。.NET应用程序经过正确的处理后,在关闭Fiddler的前提下可以正常登录微博;相关的应用程序若开启Fiddler即无法正常登录。

      因此在上述配置下,开启Fiddler模拟登录无法成功。

      2.关闭Fiddler后出现的“基础连接已关闭,接收时出现错误”等错误该如何处理?

      这些错误可能不一定每个人都会遇到,但是这里总结一下我遇到的错误以及解决方案,供大家参考。

      在学习C#模拟登录时,我使用了苏飞论坛中提供的HttpHelper_V1.4.8,在关闭Fiddler的前提下,我遇到过错误主要为:基础连接已关闭,接收时出现错误。

      据说这种错误的主要原因是GetResponse超时引起的,原帖中分析这种问题有三个可能的解决方案:

      a. DefaultConnectionLimit设置大一些,苏飞的HtttpHelper中已经设置为1024了,应该已经够大了。

      b. keepalive的连接过多,再加上不断的调试,那么DefaultConnectionLimit总有不够的时候。HttpHelper中keepalive默认为true,因此对于我所写的代码中,如果不是必须要KeepAlive的,我都将其值改为false。

      c. 在请求新的连接之前添加垃圾回收System.GC.Collect()。我将这一项也添加在HttpHelper中。

      经过上述处理后,在不开启Fiddler调试,目前还暂未遇到类似的错误。

      3.Cookie要如何处理才可以模拟登录成功?

      在尝试实现C#模拟登录微博被卡在最后一步之后,我尝试从各方面找过资料与信息。首先,我在苏飞论坛上看到一篇名为C#模拟登陆新浪微博,登陆成功了,但是出现加载问题帖子,原帖上有部分源代码。我注意到他用的是原生态的HttpWebRequest和HttpWebResponse,Cookie处理用的是CookieContainer ,并未使用HttpHelper_V1.4.8。CookieContainer处理全程就一个变量cc,没有像我各种折腾,各种字符串处理,各种Cookie拼凑。

      后来我在Github上找到了一个模拟登录新浪微博的C#源代码,下载后填写正确的用户名与密码即可轻松实现登录!经查阅源代码,发现该代码使用的也是HttpWebRequest,HttpWebResponseCookieContainer,最关键是Cookie处理全程只用CookieContainer的一个实例!

      于是,我对HttpHelper做了一些修改,让HttpItem可以直接设置CookieContainer,在Cookie的处理上我按照上面两个例子依葫芦画瓢,于是我也登录成功了!就是这么简单,一个CookieContainer处理全程的Cookie都游刃有余!

在C#中调用微博密码加密文件ssologin.js

C#模拟登录微博请求passport.weibo.com结果

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub