1. url: https://notice.qb.com/detail?noticeId=256 2. target: 3. 分析: 3.1 打開網址,刷新頁面,看看都發送了哪些請求。 看到了發送了一些Ajax請求,其中第一個就是我們需要的。下麵就對這個請求進行剖析。 3.2 首先,它是一個pos ...
1. url: https://notice.qb.com/detail?noticeId=256
2. target:
3. 分析:
3.1 打開網址,刷新頁面,看看都發送了哪些請求。
看到了發送了一些Ajax請求,其中第一個就是我們需要的。下麵就對這個請求進行剖析。
3.2 首先,它是一個post請求:
多刷新幾次就會發現,有兩個參數是動態的,一個ts,很明顯是十位的時間戳,不用管它。另一個sig,就是我們需要破解的。
3.3 遇到這種加密參數,首先想到的就是進行直接搜索,看看哪些js中涉及到,一般直接return到加密參數相關的,就是我們要找的js代碼。
搜索:
3.4 接著,我們找到了這個:
看起來有點像,那就試試看吧,把幾個相關的變數打上斷點。
執行到這裡,發現m.sig的值已經出來了,記錄一下。調試完畢,最後看看post請求的sig值和記錄的值是否一致,發現是一致的。
省略調試過程。
3.5 接下來就剩下解密這段js了。看過程結合js代碼,是對“_”的值進行了md5加密,再進行md5加密,再來一個sha256加密,而“_”的值就在上面:
"a=at&appId=0&con=1&device=Windows+10&deviceId=Chrome79.0.3945.88&id=256&la=1&p=0&ps=10&reqLang=0&ts=1577196094&ty=0&version=1.6.2370f239020d3a28b8d24ba1706f2dd7c03dcaa2fa5e7a077f1f517e5f2d3a68a1"
多調試幾遍,就會發現這個變數只有一個ts參數是變的,別的都不變。而ts就是一個時間戳而已,用的時候拼接一下。接下來去編寫python程式。
4. 代碼:
import json import time import hashlib import requests import re from afterWork.config import userAgent, proxies def myMd5(value): return hashlib.md5(value.encode('utf-8')).hexdigest() def mySha256(value): return hashlib.sha256(value.encode('utf-8')).hexdigest() def getSig(): # 15771 80402 ts = time.time() # print('1577180402') # print(str(ts)[:10]) sig = 'a=at&appId=0&con=1&device=Windows+10&deviceId=Chrome79.0.3945.88&id=256&la=1&p=0&ps=10&reqLang=0&ts={}&ty=0&version=1.6.2370f239020d3a28b8d24ba1706f2dd7c03dcaa2fa5e7a077f1f517e5f2d3a68a1'.format(ts) return ts, mySha256(myMd5(myMd5(sig))) def getData(): ts, sig = getSig() d1 = {'id': 256, 'ty': 0, 'con': 1, 'p': 0, 'ps': 10, 'la': 1} data = { "a": "at", "d": d1, "ts": ts, "reqLang": 0, "appId": 0, "device": "Windows 10", "deviceId": "Chrome79.0.3945.88", "version": "1.6.23", "sig": sig } # return data return json.dumps(data) def getInfo(url): # print(type(getData())) res = requests.post(url=url, data=getData(), # headers={'User-Agent': userAgent.random()}, proxies=proxies, timeout=10) print(json.loads(res.text)['d']['d'][0]['su']) print(re.sub(r'<.*?>', '', json.loads(res.text)['d']['d'][0]['cnt'])) if __name__ == '__main__': url = 'https://api.qb.com/v1/common/' getInfo(url)
結果:
學習研究,勿作他用。