新浪财经股票返回数据的解密-JS逆向(新浪财经)新浪财经怎么看行业均值,
新浪博客死掉了, 只能来这里发了
网上大多数教JavaScript(js)逆向的,都是post方法,也即把当地数据加密发去服务器端,好比当地的账号密码,要翻译的文字(好比网易有道翻译)。get方法的比力少,因为大多数网站返回的都是明文。少数的,好比新浪财经返回的股票历史数据,压缩(应该没有再加密)的,返回到当地后,当地解析,再画图。
这对搞股票量化的散户朋友来说很不友好,以前获取股票价格都是从财经网站的网络流(API)获取的。 新浪自从把股票页面更新成可交互的fusion chart后, 就把部门返回的股票数据压缩(应该没有再加密)。 这对我们通过python等工具获取网络流股票数据很不方便(现在github上那些量化项目中,基本不太可能看到重新浪获取历史日线数据的了)。 之前我也写过相关的解密文章, 不外那时候对新浪加密的方式理解不是很深入, 这里做一下更新。(新浪财经的金融数据库还是很庞大的,从股票、期货到外盘,都有,而且历史悠久,所以相应的处置惩罚这些数据的js代码量也很庞大。)
好比: 新浪股票页面返回的数据中(F12调试模式检察网络流), 5天分时图和日线图(周线,月线)是编码, 压缩加密的,一是为了方便网络传输, 5天分时压缩下来只有5KB, 日线数据从1996年开始返回的,数据量在50KB左右, 压缩效率还是很高的) , 周线,月线是根据日线合并生成的。二是为了防止散户轻易下载获得股票历史数据。好比5天分时的地址是:finance.sina.com.cn/realstock/company/sz000725/hisdata/klc_cm.js?day=2021-8-8,历史日线:finance.sina.com.cn/realstock/company/sz000725/hisdata_klc2/klc_kl.js?d=2021_8_8
返回的文本数据大概这样“var KLC_ML_sz000725="IC/wuCKnE+IAAAO6LhCKMTgJ0AmjDJ。。。”看起来是base64编码的,再加一些其他压缩算法。
不外15-60分钟的分钟数据是从网络地址API明文返回的,没有压缩或者加密。(可以用F12检察网络流)。
最近我正巧看到网上教javascript逆向方法获取网易有道翻译,发现新浪的数据也可以用同样的方法来获取。基本原理大概是:新浪返回的数据都是在从几个先加载的javascript脚本里面发出请求,被获取,再解码,然后赋值给变量,然后画图的。
我们按F12进入开发者模式,search:window["KLC_xxx"] , 上面地址返回的数据是返回在window窗口,再被赋予变量的。所以查找window[ 这样的字符串, 就能在本网页的网络流h5t.js的1618行左右找到(日线的处置惩罚是在h5k.js那个脚本里)。我们在这里打断点(断点也不是随便哪里打了,步伐就能停下来的,需要对js 的熟悉。不外在这里,我发现变量c已经解析了今日的分时数据,不知道是在前面哪个地方解析的。),发现是调用sf_sdk.js里面ctdf()这个函数是用来解码的。这个函数还调用了其他几个复杂的函数。总体来说还是比力冗长的,不太容易解码逻辑挖出来。
散户朋友可以试试在它的js代码里面注入把数据生存到当地的js代码片段,试着把解码的明文数据生存下来,或者在console里面用copy(xxx)把数据生存到剪贴板。或者,python也有pyjs模块可以运行js代码。
2022-6-17 更新:最终在淘宝上找js逆向的服务,把解密函数抠出来了。用python可调用解密。
又发现这篇文章zhuanlan.zhihu.com/p/448789349中引用了牛人开发的包github.com/akfamily/akshare/blob/master/里面包罗了js解密的代码, 其他网站都是返回明文, 所以无需解密。
根据akshare在知乎上的发文记录(zhihu.com/column/akshare), 其最早发文是2019-12月末关于股票质押的, 之后2020-4-24发布了(解密了)新浪A股日线历史数据接口zhuanlan.zhihu.com/p/135970894, 2020-7-24发布了新浪港股, 美股的日线历史数据zhihu.com/p/136682436, 2020-7-24 解析了新浪的A股交易日历zhihu.com/p/163338808。 不外之后好像顾虑新浪对爬虫的限制, 有增加了东方财产网的接口。