惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
J
Java Code Geeks
V
Visual Studio Blog
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
宝玉的分享
宝玉的分享
博客园 - Franky
博客园 - 【当耐特】
Jina AI
Jina AI
月光博客
月光博客
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
SecWiki News
SecWiki News
H
Heimdal Security Blog
Y
Y Combinator Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News - Newest:
Hacker News - Newest: "LLM"
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
Forbes - Security
Forbes - Security
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
L
LINUX DO - 最新话题
M
MIT News - Artificial intelligence
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Troy Hunt's Blog
T
The Blog of Author Tim Ferriss

博客园 - 逸乐太子

豆包无水印图片下载器|新媒体运营、自媒体创作者必备神器 免费无广告!网易UU远程,解锁远程办公、娱乐、运维全能玩法 告别手动复制!公众号文章批量导出工具,极致提升内容运营效率 高效办公神器:可视化Excel文档合并工具,告别手动复制粘贴 全国分省 Excel 爬取后,一键统计全文件数据行数|附即用型统计工具 某速体育网站中canvas数据获取 台风数据采集全攻略:从数据源到实操落地 豆包生成的图片带有AI字样怎么去除? 中国马拉松官方网站赛历信息采集工具 国家标准批量采集工具:全量元数据检索 + 批量导出 知网文献批量采集:BibTeX/EndNote 完整导出(含摘要、关键词、被引、全文链接) 超级课堂题库下载本地工具 洋葱智课在线题库导出工具 【python爬虫定制】PubScholar公益学术平台期刊名称爬取 【python数据采集】阳光高考学校信息采集 python程序的守护工具 【Python数据采集】国家自然科学基金大数据知识管理服务门户数据采集 pyinstaller 打包时第三方模块与图片资源加载 使用python爬取豆瓣电影短评评论内容 使用 js 实现 urljoin 方法 使用 Python 爬取高校教师信息 python从PDF文件中读取国民经济行业分类 python爬虫之JS逆向某易云音乐 国务院办公厅放假通知信息获取 python爬虫之企某科技JS逆向 linux下telnet命令有时无法退出 H5中腾讯地图定位信息在安卓手机中获取不到
python爬虫之JS逆向
逸乐太子 · 2022-06-11 · via 博客园 - 逸乐太子

Python爬虫之JS逆向案例

由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下:

JS逆向有两种思路:

一种是整理出js文件在Python中直接使用execjs调用js文件(可见我的另一篇文章《 python爬虫之企某科技JS逆向》)。

一种是根据JS中的逻辑,使用Python重写相应的方法。


本文介绍的是第二种使用Python重写JS的方法

需求:爬取某区块链网站https://www.oklink.com/zh-cn/btc/tx-list?limit=20&pageNum=1数据

遇到的问题:目标网站的数据是通过ajax请求相应的接口获取数据,在请求头中需要携带x-apiKey(根据时间动态生成的),我们需要解决的就是整理出动态生成x-apiKey的方法。

解决思路:根据关键字"x-apiKey”在网站的JS中找到相应的定义,然后使用python重写方法,在请求接口时实时生成相应的x-apiKey

第一步:在浏览器中使用开发者工具找到相应的接口

请求地址:https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1654916647499&limit=20&offset=0

请求类型:GET

请求头:x-apiKey:
LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3NjYwMjc3NTg2MTAzNjk=

UntitledImage

第二步:找到x-apiKey的定义方法

t.headers.common["x-apiKey"] = n.Z.getApiKey()

UntitledImage

根据上面的代码中看到x-apiKey是由getApiKey这个方法返回的,通过getApiKey搜索找到相应的定义如下:

UntitledImage

1.接下就是解析这个getApiKey方法了。

{
                    key: "getApiKey",
                    value: function() {
                        var t = (new Date).getTime()
                          , e = this.encryptApiKey();
                        return t = this.encryptTime(t),
                        this.comb(e, t)
                    }
                }

1).变量t就是获取当前时间戳

2).变量e是调用encryptApiKey这个方法

3).变量t是encryptTime(t)这个方法处理后的返回

4).最后通过comb(e,t)个方法生成最终的apiKey

2.encryptTime方法

key: "encryptApiKey",
                    value: function() {
                        var t = this.API_KEY
                          , e = t.split("")
                          , r = e.splice(0, 8);
                        return e.concat(r).join("")
                    }

1).变量t是一个常量字符串API_KEY,往上找到初始化值为this.API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"

2).变量e是将上面的t分隔成数组

3).变量r:从变量e中删除前8个字符串,并将e的前8个元素组成的数组赋值给r。同时变量e删除了前8个元素

4).最终将e和r合并在一起并转为字符串

3.encryptTime方法

key: "encryptTime",
                    value: function(t) {
                        var e = (1 * t + 1111111111111).toString().split("")
                          , r = parseInt(10 * Math.random(), 10)
                          , n = parseInt(10 * Math.random(), 10)
                          , o = parseInt(10 * Math.random(), 10);
                        return e.concat([r, n, o]).join("")
                    }

1).变量e为将入参t加上1111111111111然后转为字符串,分隔为数组

2).变量r、n、o三个是生成10以内的随机整数

3).最后返回的是e和[r,n,o]数组合并,转为字符串返回

4.comb方法

key: "comb",
                    value: function(t, e) {
                        var r = "".concat(t, "|").concat(e);
                        return window.btoa(r)
                    }

1).变量r是由入参t和e中间加上|然后拼在一起的

2).window.btoa是返回的base64加密编码

3)comb方法最终返回的就是我们需要的x-apiKey的值了

5.将上面的JS逻辑转为Python代码如下:

def get_api_key():
    cur_time = int(time.time() * 1000)
    api_key = 'a2c903cc-b31e-4547-9299-b6d07b7631ab'
    key_1 = api_key[0:8]
    key_2 = api_key[8:]
    encrypt_api_key = key_2 + key_1
    string = str(cur_time + 1111111111111)
    r = random.randint(0, 9)
    n = random.randint(0, 9)
    o = random.randint(0, 9)
    encrypt_time = '%s%s%s%s' % (string, r, n, o)
    new_key = encrypt_api_key + '|' + encrypt_time
    # 转为bytes-like object
    new_key = new_key.encode('utf-8')

    # 将bytes-like object转成字符串类型
    return str(base64.b64encode(new_key), encoding='utf-8')

至此,我们就得到了动态生成的x-apiKey,接下来继续操作吧。