终于,历经了2-3个星期,破解了所有去哪儿下单所要的数据。从一开始的pre,_m_,不确定的header 和 key ,value。还有个后面因为我用了模拟浏览器过滑动验证码而没用到的faver请求!(这个请求也折腾了我半天,但是只要找到他的JS在哪生成的,就好办了,这个不具体讲解了,是真的又长又臭).滑动验证码我是实在不想解密JS了,还没找到js所在的地方,而且这个用模拟浏览器过的非常简单,所以偷个小懒,问题不大。
用python方法翻译后和JS产生的数据有出入,所以只好调用node执行js了
需要交流的朋友可以加我企鹅号MjgyMjgwMjcy(base64)
回归正题,如何用node产生pre.
第一篇文章,我用了偷懒的办法产生了正确的json返回。但是最后我还是想用node产生正确的json.
我们先用node试下
果然 死循环了,又是内存爆破。既然是死循环,那肯定有for,我们先确定在哪个for里面进入的,然后看他判断条件,按照真实网站修改就可以了对吧。思路是这样的,我们先确定在哪里进的死循环
一共5个for循环,我们在里面分别打印1,2,3,4,5,来区别在哪个for循环里面。
(不要忘了还有while也能死循环)
记上 6、7、8
满屏的7777(暗示我厂长?)
分析下 应该是哪里调用_0xfcaef1 这个function
就是这里,看他应该是if这个条件报错了所以进入了死循环,我们在if前面下个debugger;
原来是判断window.navigator.webdriver这个属性.
我们根本没有赋值window,就进入catch了,我们构造个window对象吧。
var window =global;
window = {navigator:{webdriver:undefined}};
报错没有定义location,根据报错,我们把所有的都定义上吧。
到了这步,我这种JS小白就不知道怎么办了。(应该有大神可以直接写原生js构造这些吧,虚心求教,jsdom比模拟浏览器快多了,但是还是没原生js快)
为了方便,我直接引入了一个依赖 ---jsdom
下载 npm install jsdom
可以在node里面构造浏览器里的window对象等等非常方便。
运行一下
发现还是报错了但是打印了一部分数据,说明还是环境没有对上官网。
经过我的不断调试(走遍了所有IF的条件)发现他还判断了各种标签,就是官网源代码的部分
那么我们给他添加进jsdom就完事了。
其实这里还有个小bug,有些数据还需要添加个环境才能正常返回,这里卖个关子,也是在if条件里可以找到。
成功获取正确的json之后,我在调试的时候发现,这串js不只是航线数据,还有返回pre!怪不得比web端的js多了这么多数据。
这点和网页版是不同的,怪不得我老感觉请求带的pre和页面的pre对不上,原来是这里的pre。
成了!pre的条件和json条件相同。console.log("pre:" +window._pt_);就出来了。
最后我用了最近学的一种新方法来获取js的返回值 ,不需要用execjs也能调用js啦。
前面截图仔细看的话应该有发现。
但是如果打印json的话就会碰到编码问题,这时候我就用了种更高级的方式
使用subprocess 子进程调用命令行执行命令,打印返回的值
成功解决这个问题!