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,HttpWebResponse,CookieContainer,最关键是Cookie处理全程只用CookieContainer的一个实例!
于是,我对HttpHelper做了一些修改,让HttpItem可以直接设置CookieContainer,在Cookie的处理上我按照上面两个例子依葫芦画瓢,于是我也登录成功了!就是这么简单,一个CookieContainer处理全程的Cookie都游刃有余!
C#模拟登录微博请求passport.weibo.com结果