方向性が間違っていて、努力が無駄になってしまいます。爬虫類も同様です。今日共有された事例は非常にわかりやすい例です。
対象:グループ会社の購買情報
aHR0cHM6Ly9lYy5taW5tZXRhbHMuY29tLmNuL29wZW4vaG9tZS9wdXJjaGFzZS1pbmZv
ブラウザはパケットをキャプチャし、リクエスト ペイロードには暗号化されたパラメータ param が 1 つだけあります。
グローバル検索「param:」、多数の結果があります。「JSON.stringify(」を検索してみると、6 件の結果があります。
ブレークポイントを設定してデバッグした後、以下の encryptLong 関数にある暗号化エントリを簡単に見つけることができます。
encryptLong の定義を追跡し、戻り時にブレークポイントを設定し、ページをめくるかページを更新して、段階的に追跡すると、暗号化パラメーター param が encrypt 関数によって処理され、受信パラメーターを処理していることがわかります。 A、そして w 関数によって生成されます。
次の図に示すように、パラメータ A がリクエストの元のペイロードから変換された文字列であることが簡単にわかります。
上記の w 関数を詳しく調べると、次の図に示すように、これは標準関数を呼び出す単純な関数であり、リバース エンジニアリングなしで直接使用できることがわかります。
対処するのは上記の暗号化関数です。追跡したところ、webpackでパッケージ化されたjsファイルを使用した、別のjsファイルの関数であることがわかりました。そして、この関数が内部で 3 つの非標準関数を呼び出していることが簡単にわかりますが、これを解決する必要があります。
このときに、この三つの機能を個別に差し引くと、非常にありがたく、いろいろな機能がどうしても不足してしまう。
最初はここで多くの時間を無駄にし、最終的に暗号化された結果を取得しましたが、暗号文の長さが間違っており、Python リクエストは時々成功しません。
次に、2 番目のアイデアは、Webpack を構築し、対応するモジュールを呼び出すことで暗号化関数を呼び出す目的を達成することです。この考え方に従って、最終的に結果を得ることができますが、Webpack テクノロジーの習熟度に応じて、30 分以上かかる場合があります。
これが最も簡単な共有方法です。上記の encryptLong 関数の定義はプロトタイプの形式であることに注意してください。
同時に、各リクエストには公開パッケージがあり、返される結果は文字列であり、これは明らかに公開鍵であるため、RSA 非対称暗号化が使用されていることが想像できます。
想到这里,也能想到了方案:那就是导入jsencrypt模块,然后通过prototype添加encrytLong函数,即可实现加密。最终加密的JS代码截图如下:
注意:
加密前需要处理原始请求载荷对象(即下图python的字典),
包括添加sign,添加时间戳。要使用下图的b函数,需要抠出来,当然也可以直接手动添加到对象属性。
sign参数就是本文第二张图的第2442行MD5,可以扣代码u函数,或者使用crypto-js库。
以下是python代码:
import requests
import execjs
import time
import json
def get_pubkey():
cookies = {
'SUNWAY-ESCM-COOKIE': '87e7733f-33b7-4477-92b4-daa17e4d74df',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
# 'Content-Length': '0',
# 'Cookie': 'SUNWAY-ESCM-COOKIE=87e7733f-33b7-4477-92b4-daa17e4d74df',
'Origin': 'https://ec.minmetals.com.cn',
'Pragma': 'no-cache',
'Referer': 'https://ec.minmetals.com.cn/open/home/purchase-info',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'sec-ch-ua': '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
response = requests.post('https://ec.minmetals.com.cn/open/homepage/public', cookies=cookies, headers=headers)
return response.text
cookies = {
'SUNWAY-ESCM-COOKIE': '87e7733f-33b7-4477-92b4-daa17e4d74df',}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
# 'Cookie': 'SUNWAY-ESCM-COOKIE=87e7733f-33b7-4477-92b4-daa17e4d74df',
'Origin': 'https://ec.minmetals.com.cn',
'Pragma': 'no-cache',
'Referer': 'https://ec.minmetals.com.cn/open/home/purchase-info/?tablndex=0',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'sec-ch-ua': '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
ctll=execjs.compile(open('./wukang3.js','r',encoding='utf-8').read())
for page in range(1,5):
data = {"inviteMethod":"","businessClassfication":"","mc":"","lx":"ZBGG","dwmc":"","pageIndex":page}
# print(data)
params=ctll.call('get_param',data,get_pubkey())
print(params)
json_data = {
'param': params
}
response = requests.post(
'https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page',
cookies=cookies,
headers=headers,
json=json_data,
)
print(response.status_code)
print(response.text)
爬取的结果如下:
如需js代码,请留言。
欢迎大家批评指正!