前言
不多說啊,繼續猿人學的
分析
打開網站,然后接口也是很輕易的就拿到了
點開某個接口看請求參數:
這個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