之前聽朋友說攜程的加密有點變態,就去研究了一下,果然變態,廢話不多說,進入正題,
以爬取攜程酒店詳情頁為例,進入詳情頁,打開除錯模式,首先看看Xhr (XMLHttpRequest)請求,尋找請求資料介面;攜程的碼農夫很雞賊,它將資料放在html里面的兩個屬性里面,不注意就會忽略;
分析引數可以看到,每次請求變化的是key這個引數,全域搜素key,很遺憾,攜程混淆比較厲害,key有很多個;根據URL通過hoteldetail/rooms全域找,很好只找到了數個,全部打上斷點,一步步走下去,適當地跳過中間函式,可以看到這個,很明顯執行了一個js,找到請求這個js的介面,列印window[e]即window.___casf3,找到了酷似key值的值,隨后驗證,的確是它,接下來只需要破解這段js,



第一次除錯報錯了,回憶了一下,運行這個之前還定義了一個函式,加上,接著除錯,就正常了,但是接著就吐了,這回圈一個接著一個,幾萬個回圈,太變態了,不過,也搞懂了每次回圈的流程以及關鍵的幾個地方,

終于出結果了,但是比對了一下,第二位以及劃線后面不一樣,然后拿這js到攜程的官網執行,答案正確了,


然后跳到執行的最后找到存盤結果的一個object,發現有幾個地方不一樣,比如m.ctrip.com 和localhost:63342,但是關鍵點并不能通過手動拿到,想了想就先用console.log,看輸出的差異,在根據輸出找到關鍵點,終于發現這個差異是取了window.location.host值,在取值的地方替換了一下,就拿到了正確的結果,
但是在用python去執行時發生了尷尬的一幕:函式的輸入需要window物件,簡單設定window執行js并不行,因為代碼里會去驗證window物件的真偽;然后根據NodeJs以及jsdom包去模擬window物件,很遺憾也不行,看了一下,原因應該在于require函式,遺憾的是,混淆這個函式的嘗試失敗了,可能關鍵點不在這個地方,或者require函式無法重寫,然后就換了一個方向,既然假的不行,就搞個真的去執行它,使用selenium是一個不錯的思路,它也對selenium做了檢測,不過這個再走一次上面的流程就好了,劃線后面的字串是根據前面的字串以及瀏覽器資訊生成的,只要搞定前面的再有點耐心就能搞定,
這里面有幾個關鍵的地方(其他的地方也重要):




轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139940.html
標籤:Python
上一篇:SyntaxError: Missing parentheses in call to 'print'. Did you mean print
