声明:本文仅作技术交流,严禁用于任何非法用途(如有冒犯,请联系我删除此文)
1.模块作用
本demo目的是获取http://www.shenzhenair.com所展示出的机票信息,主要解决CoreSessionId这个cookie
2.思路解析
–本次解决提供不同于使用execjs但思路类似的另一种方法,如果熟悉可以对高度封装的静态Js达到秒破程序
1)打开url,验证必要cookie
我当时在验证需要哪些cookie时,发现必须要这个5个cookie(其实_g_sign没验证是否需要,因为它和CoreSessionId一起生成的,默认了)。
以上几个cookie除了CoreSessionId和_g_sign都是请求可以得到的
2)寻找JS加密文件
这个比较简单,一搜再打几个断点就知道在utils.js里了(一看这代码样子也能感觉到里面有东西)
3)生成CoreSessionId和_g_sign
看了一下,它基本上就是一个大匿名函数自执行设置cookie,然后把代码全部贴到本地,借助浏览器一运行,cookie就出现了:
但是如果想在nodejs环境里跑的话,会发现有很多window,navigator,atob,document,虽然可以改,但是改起来很慢。
所以,为了方便我就借助浏览器环境跑了。
但是,我还是需要先看看他都干了些什么,了解一下这2个cookie是干啥的,不能弄出来就弄出来了:
很明显,_g_sign生成函数的参数就是coreSessionId,而这个生成函数也不难,所以主要就是coreSessionId的生成方式,然后点进去:
对我们最主要的一步就是this[‘getpackstr’]();
因为这一步他在收集浏览器特征信息,然后给后面加密作参数。并且在这一步里面就已经用SHA256把浏览器信息加密过了,后面又拼接了几个字符串,再把整体加密一下。
看懂这些那就容易了,原来这个coreSessionId就是fingerprint。所以我跟着他的思路用fake_useragent请求了50个浏览器作备用,每次要生成coreSessionId和_g_sign就传一个进去(其实里面那些加密参数都可以随便改)
最后借助selenium运行浏览器,将这段JS注入到浏览器里执行,返回需要的coreSessionId, _g_sign就可以破了,从分析网页到生成这2个cookie,用不了20分钟就搞定了。
具体逻辑代码参照:coreSession_gSign.py + create_driver.py (如果是接口形式,webdriver可以一直不关,如果想获取很多路线数据,可以在请求完后才关,具体需要自行调整)
然后我自己运行一下主程序:
那个json就返回回来了。
4)encode_version = ‘sojson.v4’
网站难度不大,但让我感兴趣的是这个东西,然后度了一下:
进入之后有v5版本的了,然后把所有的都勾上加密一句console.log(“a”),结果出来接近900行的混淆代码(一口老血),然后我再试着调了一下,发现居然就是去哪儿的pre加密方式,因为代码很像,而且连那几个内存**点都一样,牛逼牛逼。
3.总结
1.最近被几段让人爆炸的JS搞疯了,偶然发现sojson的通用加密,想记录一下;
2.此网站对加密结果检查并不严谨,比如getAppVersion和getUserAgent不是一个浏览器也能通过,但是想一下也应该是这样,面对散列加密大家一般都是验证加密结果是否相同的,所以貌似可以随便改那些参数。如果想试试类似的高度封装的JS可以去看看美团的rohrToken加密;
3.网站ip封锁严重,没有代理什么的,容易再见。
附上github传送门:https://github.com/634739726/shenzhenair_spider