1. 程式人生 > >記一次Python3爬蟲利用pyppeteer得到網站js加密後的密文

記一次Python3爬蟲利用pyppeteer得到網站js加密後的密文

分析的是一個航空網站,其實是我再找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 ? "[email protected]#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "[email protected]" : "[email protected]@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#@%%"))

結果 在這裡插入圖片描述