• 手把手操作JS逆向爬虫入门(三)---Headers请求头参数加密


    知识点:
    1、请求头加密参数分析
    2、JS base64加密的多个实现方法

    目标网站:aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1jbi9idGMvdHgtbGlzdD9saW1pdD0yMCZwYWdlTnVtPTE=
     

    通过抓包分析请求,不难发现,该网站的请求头headers里有一个参数x-apiKey。

    搜索x-apiKey,再index.js文件找到如下结果:

    index.js文件里搜索 getApiKey,不难发现,getApiKey由comb函数处理e,t两个 参数,而comb函数 就是对参数拼接后进行base64编码(如图方框处btoa)。

    这样只要找到两个参数的来源,就解决问题了。
    从上图不难发现, 两个参数的生成位置:

     通过搜索encryptApiKey和encryptTime两个函数名,不难找出其生成原理。

     抠出上述js代码,新建js文件okyunlian.js,并写一个生成x-apiKey参数的函数入口
    get_x_apiKey()。js文件如下:

    1. // const CryptoJS =require('crypto-js')
    2. const CryptoJS=require('D:\\nodejs\\node_modules\\crypto-js\\crypto-js')
    3. function encryptApiKey() {
    4. API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
    5. var t = API_KEY
    6. , e = t.split("")
    7. , r = e.splice(0, 8);
    8. return e.concat(r).join("")
    9. }
    10. function encryptTime(t) {
    11. o = 1111111111111
    12. var e = (1 * t + o).toString().split("")
    13. , r = parseInt(10 * Math.random(), 10)
    14. , n = parseInt(10 * Math.random(), 10)
    15. , i = parseInt(10 * Math.random(), 10);
    16. return e.concat([r, n, i]).join("")
    17. }
    18. function comb(t, e) {
    19. var r = "".concat(t, "|").concat(e);
    20. base64 = Buffer.from(r, 'utf-8').toString('base64') //base64 加密
    21. // console.log(base64)
    22. // 另一种方法加密
    23. var str=CryptoJS.enc.Utf8.parse(r);
    24. var base64=CryptoJS.enc.Base64.stringify(str)
    25. // console.log(base64)
    26. return base64
    27. }
    28. function get_x_apiKey(){
    29. t=(new Date).getTime()
    30. t=encryptTime(t)
    31. // console.log(t)
    32. e = encryptApiKey()
    33. x_apiKey=comb(e,t)
    34. console.log(x_apiKey)
    35. return x_apiKey
    36. }
    37. // console.log(get_x_apiKey())
    38. // console.log(module.paths)

    对应的python代码如下:

    1. import requests,json,csv,time,execjs
    2. x_apiKey=execjs.compile(open('./okyunlian.js','r',encoding='utf-8').read()).call('get_x_apiKey')
    3. # print(x_apiKey)
    4. headers = {
    5. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    6. 'x-apiKey': x_apiKey
    7. }
    8. url='https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict'
    9. def main():
    10. for page in range(1,4):
    11. # print(page)
    12. params = {
    13. 't': str(int(time.time()*1000)),
    14. 'limit': '20',
    15. 'offset': (page-1)*20,
    16. }
    17. res=requests.get(url=url,params=params,headers=headers,timeout=2)
    18. print(res.status_code)
    19. json_data=res.json()['data']['hits']
    20. print(json_data)
    21. # json_data=json.loads(res.text)
    22. # print(json_data)
    23. if __name__=='__main__':
    24. main()

    爬取结果如下:

  • 相关阅读:
    [附源码]计算机毕业设计springboot学生宿舍维修管理系统
    基于stm32微控制器的绘图机器人设计
    Unity添加自定义菜单按钮
    Redis:单线程为何还能这么快?
    回溯算法01-组合(Java)
    【沐风老师】3DMAX一款神级一键四边面重拓扑插件Quad Remesher使用教程
    在排序数组中查找元素的第一个和最后一个位置
    【670. 最大交换】
    Spring Security实现基于RBAC的权限表达式动态访问控制
    升级光伏供应链体系,供应商系统规范供应商管理,促进企业与供应商高效协同
  • 原文地址:https://blog.csdn.net/weixin_45387160/article/details/127715840