手把手操作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文件如下:

// const CryptoJS =require('crypto-js')
const CryptoJS=require('D:\\nodejs\\node_modules\\crypto-js\\crypto-js')
function encryptApiKey() {
        API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
        var t = API_KEY
          , e = t.split("")
          , r = e.splice(0, 8);
        return e.concat(r).join("")
    }
function encryptTime(t) {
                        o = 1111111111111
                        var e = (1 * t + o).toString().split("")
                          , r = parseInt(10 * Math.random(), 10)
                          , n = parseInt(10 * Math.random(), 10)
                          , i = parseInt(10 * Math.random(), 10);
                        return e.concat([r, n, i]).join("")
                    }

function comb(t, e) {
                        var r = "".concat(t, "|").concat(e);
                        base64 = Buffer.from(r, 'utf-8').toString('base64') //base64 加密
                        // console.log(base64)
                        // 另一种方法加密
                        var str=CryptoJS.enc.Utf8.parse(r);
                        var base64=CryptoJS.enc.Base64.stringify(str)
                        // console.log(base64)
                        return base64

                    }

function get_x_apiKey(){
    t=(new Date).getTime()
    t=encryptTime(t)
    // console.log(t)
    e = encryptApiKey()
    x_apiKey=comb(e,t)
    console.log(x_apiKey)
    return x_apiKey
}

// console.log(get_x_apiKey())
// console.log(module.paths)




对应的python代码如下:

import requests,json,csv,time,execjs
x_apiKey=execjs.compile(open('./okyunlian.js','r',encoding='utf-8').read()).call('get_x_apiKey')
# print(x_apiKey)
headers = {
    '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',
    'x-apiKey': x_apiKey
}
url='https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict'
def main():
    for page in range(1,4):
        # print(page)
        params = {
            't': str(int(time.time()*1000)),
            'limit': '20',
            'offset': (page-1)*20,
        }
        res=requests.get(url=url,params=params,headers=headers,timeout=2)
        print(res.status_code)
        json_data=res.json()['data']['hits']
        print(json_data)
        # json_data=json.loads(res.text)
        # print(json_data)

if __name__=='__main__':
    main()

爬取结果如下:

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值