📌免责声明:本文章涉及到的代码仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和非公开权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关。禁止将本文技术或者本文所关联的Github项目源码用于任何除学习外的目的。如本文有任何侵权,请联系删除。
本文通过分析某科云连的交易列表页面https://www.oklink.com/cn/btc/tx-list,来学习标头参数模拟方法。
页面分析
通过requests测试,发现获取数据需要在标头中提供x-apikey才能访问成功,而这个参数是一段密文,需要模拟生成。
同时,检查请求中的载荷信息,只是常规的时间戳和分页信息,按规则提供即可。
x-apikey模拟
通过搜索,只发现一处有x-apikey参数赋值,但加上断点后并不会触发,说明这个点并不是真正的位置。
到此可以判断页面上通过其它的方式隐藏了x-apiKey参数的赋值操作,这里可以使用Hook的方式给设置headers参数的位置加上断点。Hook脚本如下:
code = function () {
org = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
if (key == 'x-apiKey') {
debugger;
}
return org.apply(this, arguments);
}
}
script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head || document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
在控制台注入脚本后,重新操作页面,就会在设置位置断住。
然后由断点的调用堆栈逐级排查调用链附近位置。最终定位到如下图位置处。这里通过拆散x-apiKey字符为列表,然后进行join拼接出参数名。这里的getApiKey()
方法就是我们需要模拟的函数。这个过程比较繁琐,需要耐心。
分析getApikey()
方法,发现具体生成逻辑在下图位置:
由此可以通过Python直接实现这部分算法,完成x-Apikey模拟:
import base64
import random
import time
# api_key设定的固定初始值
API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
# 用python实现原网站js里的对应apikey生成方法
def gen_api_key():
current_time = int(time.time() * 1000)
encrypt_api_key = API_KEY[8:] + API_KEY[:8]
time_str = str(current_time + 1111111111111)
r = str(random.randint(0, 9))
n = str(random.randint(0, 9))
o = str(random.randint(0, 9))
encrypt_time = time_str + r + n + o
new_key = f'{encrypt_api_key}|{encrypt_time}'
new_key = new_key.encode('utf-8')
return str(base64.b64encode(new_key), encoding='utf-8')
if __name__ == '__main__':
print(gen_api_key())
评论区