我们首先观察 Query String Parameters,发现 timestamp 、 word 和 signature 三个参数发生变化,前两个参数好办,分别是时间戳和要查询的单词,第三个参数推测可能是经md5加密的字符串

经过调试断点,可以看到 g 函数是我们需要关注的函数

找到 g 函数,参数 signature 在第1053行生成,变量 r 很关键

继续调试,找到 m 函数,e.params 结构为
{
client: 6,
key: 1000006,
timestamp: 时间戳,
word: 单词
}

继续调试,来到904行,方框中的函数返回一个与实参一样的对象,貌似没什么用

1071行执行完毕,可以看到 t 的值即为 e.params 的各个 key 对应的 value 相拼接。1018行的参数为一个字符串,url + t + 常量字符串,即
'/dictionary/word/query/web' + t + '7ece94d9f9c202b0d2ec557dg4r9bc'

形参 t 的值上文已经生成,我们继续再跳进函数

继续跳进函数,发现是MD5加密

我们再回到1058行,参数 signature 的值已经生成,经检验,加密方式为md5加密。至此,我们得到了 signature 的生成方法。见上文形参 t 的生成

python 代码如下
import requests
from hashlib import md5
import urllib.parse as parse
import time
class CiBa:
def generate_signature(self, params: dict) -> str:
'''
生成signature
'''
value_array = []
keys = sorted(list(params.keys()))
for value in keys:
value_array.append(str(params[value]))
return md5(('/dictionary/word/query/web' + ''.join(value_array) + '7ece94d9f9c202b0d2ec557dg4r9bc').encode('utf-8')).hexdigest()
def get_meaning(self, word: str) -> str:
headers = {
'Origin': 'https://www.iciba.com',
'Referer': 'https://www.iciba.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57'
}
params = {
'client': 6,
'key': 1000006,
'timestamp': int(time.time() * 1000),
'word': parse.quote(word)
}
params['signature'] = self.generate_signature(params)
url = 'https://dict.iciba.com/dictionary/word/query/web'
resp = requests.get(url, params=params, headers=headers)
return resp.text
if __name__ == "__main__":
print(CiBa().get_meaning('hello'))