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

       最近在尝试用C#实现模拟登录新浪微博,已实现预登录获取客户端对用户密码进行加密的参数,在C#中调用加密文件ssologin.js对用户密码进行加密,获取最终登录请求的链接,目前卡在了最终登录需要的Cookie中。这里先记录尝试成功的部分,也是一次梳理思路的过程,后续会陆续整理我尝试过的Cookie方案以及在学习过程中发现的一些值得分享的内容。

       我在网上找到的最新的也最详细的关于模拟登录微博的文章是http://blog.csdn.net/u010487568/article/details/46932839,这篇参考链接中用python实现模拟登录,我实现成功的部分其实就是将该文章中用python实现的功能用C#来实现。

       1.模拟登录的必备工具Fiddler

       Fiddler的用处不用多说。遗憾的是貌似从9月12日上午微博从大面积崩溃的状态中恢复后,Fiddler便无法再抓取微博登录的数据,所以本文用来分析的一些登录微博的数据都是9月12日之前保存的存货。目前我遇到的现象是只要开启Fiddler,登录微博时就会显示“当前网络超时,请稍候再试”;关闭Fiddler即可登录成功。亲爱的读者,如果你也遇到了这种现象,请告诉我,让我知道我不是一个人,非常感谢;若能指点一下Fiddler的替代方案,则更是万分感谢。

       2.通过请求http://login.sina.com.cn/sso/prelogin.php来获取客户端对用户密码进行加密的参数

       请求的第一个链接的完整形式为http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=[用户名的base64编码]%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1441199260901,其总[用户名的base64编码]是登录用户名的base64的编码。

       我们先来看看这一次请求的参数及其意义:

prelogin请求参数

       本文的http请求均使用了苏飞论坛的HttpHelper类_V1.4.8版本,prelogin请求时可以不带cookie,也可以带上fiddler请求时的Cookie。在调试过程中,偶尔会遇到”远程服务器返回错误: (417) Expectation failed”的错误,因此根据苏飞论坛的一些说明设置了Expect100Continue的值。

      上述请求会返回json数据,这些数据的格式以及各响应数据的参数如下图所示,这些数据在下一步请求中起到很重要的作用。

       3.请求http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)

       这里需要说明的是原参考文献中先分析了ssologin.js代码的加密方式,然后使用python实现了js文件中所描述的加密算法。我也曾尝试用C#来实现相应的加密算法,但是困难重重,所以我选择了在C#中直接调用文件SSologin来获取加密的密码。

       3.1 在当前工程中引用MSScriptControl

       添加方式如下:解决方案资源管理器窗口 -> 右击引用 -> 选择COM中的Mircosoft Script Control -> 确定,这样会将程序集MSScriptControl添加在引用中

       3.2 封装ScriptEngine类

       ScriptEngine类是参考文献《浅谈以C#模拟登录新浪腾讯微博》中的,该类支持JScript,VBscript,JavaScript,完整的代码如下:

       3.3 对ssologin.js文件进行改造

       将第二步中请求的ssologin.js文件保存到本地,并提取该文件中加密部分的代码,即var sinaSSOEncoder定义部分,并另存为sina_me.js,并在其中新增密码的加密函数:

        除此之外,还需要注释sina.js文件中的如下部分并为变量av赋一个初值,若不注释此部分,会报“navigator未定义“的错误,如下图所示。

       3.4 调用ssologin.js对密码进行加密并组织POST数据

       准确的说,应该是调用改造后的ssologin.js文件对用户密码进行加密,函数如下:

      此次请求需要组织的POST数据如下图所示:

       此次请求的Cookie可以直接使用Fiddler中请求时所用的Cookie。原参考文献中有提到preloginTime参数,我暂时没有发现这个参数。但是在此次提交的POST数据中,需要一个名为prelt的参数,根据原参考文献的分析,该参数计算方式为: prelt = 本次请求的客户端时间 – prelogin请求时的时间 – 上一次请求时返回的exectime的值,此次请求的代码如下所示。

       本次请求成功后,返回的html内容如下,其中location.replace中的链接是最终登录要请求的链接,我目前这一步还未成功,下一篇文章我将分享最终登录失败的经验,敬请期待。

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

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

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub