python爬蟲 - js逆向之猿人學第十五題wasm

前言

不多說啊,繼續猿人學的

分析

打開網站,然後接口也是很輕易的就拿到了

 

 

 

點開某個接口看請求參數:

 

 

 

這個m這次有點不一樣啊,怎麼找生成邏輯?還是搜豎線,那估計又會卡住,還是看調用棧吧,穩當一點:

 

 

 

關鍵點

 

唉,不點不知道,一點就知道邏輯了:

 

 

 

相信都搞到這個地步的老哥們,除了wasm可能看起來有點懵,後面的js代碼基本門兒清對吧,那這個wasm又是個啥東西,查下資料

https://www.zhihu.com/question/304577684/answer/544879503

 

WebAssembly 就是運行在 Web 平臺上的 Assembly。

Assembly 是指彙編代碼,是直接操作 CPU 的指令代碼,比如 x86 指令集上的彙編代碼有指令集、寄存器、棧等等設計,CPU 根據彙編代碼的指導進行運算。彙編代碼相當於 CPU 執行的機器碼能夠轉換成的人類適合讀的一種語言。

一個典型的編譯執行鏈路是 Cpp、Rust 等編譯型語言編譯成彙編指令,再轉換成二進制機器碼由 CPU 讀取。

其他例如 Java、Python 等語言是使用運行在 x86 一類的通用硬件指令集的虛擬機,再執行自己的“彙編語言”(例如 Java Bytecode)。

Web 平臺在瀏覽器上是類似於 Java、Python 的虛擬機環境,瀏覽器提供虛擬機環境執行一些 JavaScript 或者其他腳本語言。

WebAssembly 可以看做是 Web 平臺的 x86 硬件通用指令集,作爲一層中間語言,上層對接 Java、Python、Rust、Cpp,讓這些語言都能編譯成統一的格式,用於 Web 平臺運行。

在目前情況下,WebAssembly 在使用中可以取代部分 JavaScript 代碼執行更高效的 CPU 計算程序。

 

 

反正你就理解成,另一個種語言就完了,然後可以替代js做點事,回到代碼這裏,看這段:

 

 

 

這種寫法,確實看着有點像ajax的寫法,大概的意思就是需要一個wasm的二進制文件,然後就可以調用wasm的一些方法,最後輸出我們想輸出的字段

 

那行,這個不用多研究,那我們python裏怎麼實現這種寫法呢?

然後剛纔篩選接口的時候確實有個wasm的請求:

 

 

 

 

 

找了一圈啊,找到個第三方庫,pywasm

 

官方介紹:https://pypi.org/project/pywasm/

 

那怎麼用呢?反正就是需要一個wasm的二進制文件,然後就可以調用wasm的一些方法,最後輸出我們想輸出的字段,剛好對應上上面那段邏輯,OK,直接來吧,不墨跡了

 

先把接口的那個wasm的文件下載下來,然後調用下那段js看能用不

 

import math
import random
import time
import pywasm

def main():
    t = int(time.time())
    t1 = int(t / 2)
    t2 = int(t / 2 - math.floor(random.random() * 50 + 1))
    vm = pywasm.load("./main.wasm")
    result = vm.exec("encode", [t1, t2])
    print(result)
    print(str(result) + '|' + str(t1) + '|' + str(t2))
    return result

main()

 

 

執行:

 

 

 

至少看着像那麼回事,也不知道具體怎麼樣,看後面的代碼實現吧

 

 

python代碼實現

import math
import random
import time
import pywasm
import requests

headers = {
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'no-cache',
    'pragma': 'no-cache',
    'user-agent': 'yuanrenxue.project',
    'x-requested-with': 'XMLHttpRequest',
    'cookie': 'sessionid=換成你的'
}

def get_m():
    t = int(time.time())
    t1 = int(t / 2)
    t2 = int(t / 2 - math.floor(random.random() * 50 + 1))
    vm = pywasm.load("./main.wasm")
    result = vm.exec("encode", [t1, t2])
    print(str(result) + '|' + str(t1) + '|' + str(t2))
    return str(result) + '|' + str(t1) + '|' + str(t2)

def fetch(page):
    m = get_m()
    m = m.replace('|','%7C')
    url = f'https://match.yuanrenxue.com/api/match/15?m={m}&page={page}'
    req = requests.get(url,headers=headers)
    res = req.json()
    data = res.get('data')
    data = [temp.get('value') for temp in data]
    print('temp', data)
    return data

def get_answer():
    sum_number = 0
    for i in range(1,6):
        cont = fetch(i)
        sum_number += sum(cont)
    print('答案:', sum_number)

get_answer()

 

 

執行:

 

 

 

 

提交答案:

 

 

 

完美

 

結語

這個主要就是看你搞沒搞過wasm了,don't say so much

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章