C#模拟登录微博请求passport.weibo.com结果
在《在C#中调用微博密码加密文件ssologin.js》一文中,我们讲到在请求ssologin.js之后,成功返回了passport.weibo.com的链接,传说中的最终登录的链接。参考《全程模拟新浪微博登录(2015)》中提到的成功登录的方法,我却没有成功,这里先总结我尝试过的方式,然后再谈谈我请求失败可能的原因。
1.从Fiddler抓包数据分析微博登录
在正式开始总结之前,我们先来看一下Fiddler抓取的数据中从请求passport.weibo.com到最终得到用户登录首页的过程,如下图所示。
2.尝试不同的Cookie组合
按照原参考文献的描述,在正式请求passport.weibo.com之前,需要准备login_sid_t,myuid,un这三个参数,其他的参数均使用前面请求的值即可。其中login_sid_t来源于请求weibo.com时回复的cookie,而myuid与un则隐藏在ssologin返回的cookie中。我们先来看看fiddler抓取的passport.weibo.com请求时的Headers。
请求weibo.com时,务必带Fiddler请求地址http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)时所带的Cookie,否则得不到想要的结果。
接下来提取myuid与un。myuid是微博用户的id,对于同一个帐号而言,myuid是固定值,un是当前用户名,这些信息保存在请求http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)回复的Cookie中的SUP中,SUP以urlencode的形式存在,需要进行解密。
说到解密,必须要提到fiddler的TextWizard功能,请允许我跑题介绍一下TextWizard功能。网页中的内容总会被编码成一种或多种格式,而TextWiard可以帮助我们快速的将文本在各种常用的编码之间进行转换,如下图所示。
好了,我们言归正传。我反复推敲揣摩原参考文献的意思,尝试过如下Cookie的组合,我们假定fiddler中抓取的请求prelogin的Cookie称为cookie1,ssologin回复的cookie称为cookie2:
1. login_sid_t + myuid + un + cookie1 + cookie2;
2. login_sid_t + myuid + un + cookie1
3. login_sid_t + myuid + un + cookie2
4. cookie1
5. cookie2
6. cookie1 + cookie2
7. login_sid_t + cookie1
8. login_sid_t + cookie2
上述cookie组合均已失败告终,失败的现象是我请求passport.weibo.com之后得到的重定向链接为:“http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com&reason=&retcode=”,比正常的重定向链接多出了”&reason=&retcode=“这一部分。
如果用此重定向链接继续请求,我会得到如下结果:
如果换成正常的重定向链接请求,会得到如下结果,不停的重定向,然后失败:
我也针对此问题及现象咨询原参考文献的博主,他说“可能是你发送的login_sid_t这个参数不是最新获取的,另外Host、Referer等请求头也需要细心设置好。另外,也有可能是新浪做了新的防止模拟登录的手段,重定向就是为了增加模拟登录的步骤和难度,你可以继续探索,我也是慢慢探索得到的。”我也有再进一步追问其他的问题,但再无回复。
3.失败原因分析
前一篇文章中我提到过fiddler近期无法抓取完整的weibo的登录数据,失败的步骤与我失败的步骤一致,理由也一致。所以我猜测失败可能是因为我使用了Fiddler作为代理,但是如果我取消代理的话,又会有各种“基础连接已关闭,接收时出现错误”等等异常,这种状况让我有一种“成也Fiddler,败也Fiddler”的感觉。万分不解,继续探索中,若有高手愿意指点一二,不胜感激。