分析的是一个航空网站,其实是我再找python执行js代码的资料的时候,发现了一个博主分析了这个网站的加密过程,然后我去跟着操作的时候,发现网站的加密部分代码发生了变化,不过在我不小心把网页关了之后,我实在找不到那篇文章了。。。。。所以我再说一下整个的分析过程,不然我就可以只说一下后面不同的部分了
需要安装pyppeteer、asyncio
pyppeteer中文教程:https://zhaoqize.github.io/puppeteer-api-zh_CN/#/class-Browser
第一次运行pyppeteer的时候会下载一些东西,很慢慢慢慢…,耐心等待!!!
今年新发布的requests-html这个很强的爬虫库,大家可以去看看,它里面执行js代码的方法,就是利用的pyppeteer,我在用requests-html去执行的时候,总是报错。。。。。。。。。
网站主页:https://www.jcairlines.com/
最终需要Post的链接: https://www.jcairlines.com/TicketSale/FlightQuery/QuerySeat
首先,分析需要post的data,很明显的,也就HashCode参数是经过加密的,接下来就去它的加密js代码吧
用关键词HashCode搜索,设置断点,一步一步分析
这个encode加密函数的参数中,usercode暂时不清楚是不是固定的,其它参数都在下图中进行了标注,其实在经过多次搜索尝试之后,得知usercode就是一个固定的参数,然后,再以encode为关键词搜索,去寻找这个加密函数
同样的,设置断点
点击搜索航班,然后一步一步运行,允许encode函数这里时,可以看到其中的参数e就是之前所提到的那些参数的和,证明这个encode确实是该加密函数
上图中加密后返回的值与在第一张图所显示的HashCode值相同,整个加密过程结束,它的这个核心加密函数也就40行左右,至于其它的OO00、OOO0这些函数,我实在是没找到,之前那个博主在分析这个网站的时候,还能找到,现在改变了,我找了它所有的js文件,都没找到那几个函数,不过不重要,有这段核心加密代码就够了,把这段代码复制到console中试试
下面是整个加密代码,可以看到,这段代码确实能够让我们得到正确的密文,那么现在就是要怎么用python去实现,这里就要需要用到pyppeteer这个库了,因为这段加密代码不是完整的,所以需要把这段代码嵌入浏览器中执行才能得到结果,而像js2y、pyv8、execjs这类库,只能在本地执行js代码,没有浏览器环境,所以用它们不能实现上述加密代码,下面给出其实现过程,很简单,就几行代码
把加密的js代码单独保存为一个py文件
HashCode = '''
function encode(e) {
return window.OO00 = {
encode: function(e) {
var t, l, r, n, i, o;
for (e = utf16to8(e),
r = e.length,
l = 0,
t = ""; l < r; ) {
if (n = 255 & e.charCodeAt(l++),
l == r) {
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4),
t += "==";
break
}
if (i = e.charCodeAt(l++),
l == r) {
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4 | (240 & i) >> 4),
t += a.charAt((15 & i) << 2),
t += "=";
break
}
o = e.charCodeAt(l++),
t += a.charAt(n >> 2),
t += a.charAt((3 & n) << 4 | (240 & i) >> 4),
t += a.charAt((15 & i) << 2 | (192 & o) >> 6),
t += a.charAt(63 & o)
}
},
encodeHash: function() {
var e;
return e = OOO0.excess.indexOf("Chrome") >= 0 ? "cv3sdf@#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "df23Sc@sS" : "vdf@s4df9sd@s2"
},
setCode: function() {
return "vxcasd#$asDG#$dwe"
}
},
OOOO.encode(e)
}
'''
下面是在python中实现的代码
from pyppeteer import launch
import asyncio
from jc_js import HashCode
async def get_hashcode(data):
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.jcairlines.com/')
hashcode = await page.evaluate(HashCode,data)
await page.waitFor(10)
print('HashCode:',hashcode)
return hashcode
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(get_hashcode("CKGPNH2018-11-23sfeif#@%%"))
结果