失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python爬虫之逆向破解_js逆向爬虫实战(2)--新快之加密参数破解

python爬虫之逆向破解_js逆向爬虫实战(2)--新快之加密参数破解

时间:2020-01-26 10:15:35

相关推荐

python爬虫之逆向破解_js逆向爬虫实战(2)--新快之加密参数破解

爬虫js逆向系列

我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现。我觉得做技术分享,不仅仅是要记录问题,解决办法,更重要的是要提供解决问题的思路。怎么突破的,遇到这个问题怎么思考,尝试的方法有哪些。这样就可以有的放矢。希望对大家有用

爬虫认知

在程序猿所有的方向中,爬虫是离money最近的一个方向,你的明白?而且爬虫可发展的方向很多,前可走大数据,人工智能,后可转后端,还有就是安全领域。而且爬虫做得好,要求的技术栈还是比较全面的。如果你对爬虫有兴趣,欢迎加V:13809090874,一起沟通交流

免责申明:

此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除

此专栏系列主要写一些js逆向爬虫的实战:抖音第三方数据分析平台爬虫心路历程(done)

1.1井中蛙:爬虫js逆向之无限debugger--抖音第三方数据分析平台的坑​

1.2井中蛙:爬虫js逆向之加密参数破解--抖音第三方数据分析平台的坑​快手第三数据分析平台爬虫爬虫心路历程(ing)

淘宝

拼多多

知乎

B站

微博

小红书

美团

携程

看完这个系列,js逆向对我们来说,就是信手拈来,所见即所得,哈哈哈。如果你有想抓取的网站,但有瓶颈的,或者需要源码的,欢迎加我微信:13809090874,一起攻克。

js逆向爬虫实战(2)–新快之http2.0

咱们还是老规矩,做爬虫先搞它的接口,再破登录问题。接口的破解的流程是:查看网络请求

分析请求头

找到加密参数

寻找加密参数生成的地方

破解js

带入登录参数测试接口

配套工具:charles+chrome浏览器(过段时间,我会写一篇charles小技巧,chrome调试小技巧的文章,敬请期待)

1. 查看网络请求

请求头内容如下:

url:

/xdnphb/nr/cloud/ks/rank/accountAllRankList?xyz=967e1b623a8f63f569848866a45b9f10&nonce=d17c8b2e9

headers:

:method: POST

:authority:

:scheme: https

:path: /xdnphb/nr/cloud/ks/rank/accountAllRankList?xyz=967e1b623a8f63f569848866a45b9f10&nonce=d17c8b2e9

content-length: 105

accept: application/json, text/plain, */*

user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36

content-type: application/json;charset=UTF-8

origin:

sec-fetch-site: same-origin

sec-fetch-mode: cors

sec-fetch-dest: empty

referer: /data/

accept-encoding: gzip, deflate, br

accept-language: zh-CN,zh;q=0.9

cookie: UM_distinctid=174297e3d3c94d-08a2e378f3e7c7-31647304-fa000-174297e3d3d39

cookie: _uab_collina=159858542194830430867211

cookie: Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed=1602296580

cookie: __root_domain_v=.

cookie: _qddaz=QD.m5e3n6.wvazzv.kg322ho4

cookie: Hm_lvt_ab2358e695ccada3424acb6402afd2cb=1600654506,1601369103,1602224134,1602404683

cookie: Hm_lpvt_ab2358e695ccada3424acb6402afd2cb=1602404683

cookie: token=C50F88092E574BCCA85F41CA00F178EB

从url上看有两个加密参数:xyz和nonce。

从header里我们需要cookies。

这里大家有没有注意到一个问题,header里前面几行有“:method”这些带冒号的字段。这是http2协议,这玩意困扰我有好久,继续往下看,马上告诉你怎么解决

我们先来看一下,一点也不改动,重新发一次请求看一下,看是否能够请求成功。

用charles去模拟请求,是可以获取到数据的。但经过我测试xyz和nonce是有失效期的,cookie的失效期时间还是比较久的,cookies跟登录信息有关。而xyz与nonce是与请求接口有关。

接下来我们就要去模拟接口了:

python代码模拟接口请求(http2.0解决)

刚才用charles请求是没问题的,我们用python的requests库来试试:

def all_rank_list():

header = {'Content-Type': 'application/json;charset=UTF-8', 'pragma': 'no-cache', 'cache-control': 'no-cache', 'accept': 'application/json, text/plain, */*',

'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'origin': '',

'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': '/data/account/rank/overall',

'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'Connection': 'close', 'Content-Length': '101',

'Cookie':'UM_distinctid=174297e3d3c94d-08a2e378f3e7c7-31647304-fa000-174297e3d3d39; _uab_collina=159858542194830430867211;Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed=1602296580;__root_domain_v=.;_qddaz=QD.m5e3n6.wvazzv.kg322ho4;Hm_lvt_ab2358e695ccada3424acb6402afd2cb=1600654506,1601369103,1602224134,1602404683;token=C50F88092E574BCCA85F41CA00F178EB'}

#参数我已经破解了,就直接带着了,将我们抓取到的接口的xyz和nonce复制过来也是可以的

url = '/xdnphb/nr/cloud/ks/rank/accountAllRankList'

nonce_ = nonce()

url_ = url + '?AppKey=joker&nonce={}'.format(nonce_)

xyz_ = xyz(url_)

url_params = {

'xyz':xyz_,

'nonce':nonce_

}

url = '{}?{}={}&{}={}'.format(url,'xyz',url_params['xyz'],'nonce',url_params['nonce'])

post_params ={"type":"搞笑","rankDate":"-10-07","start":1,"size":20,"rankType":"realTime","sort":"newrankIndex"}

r = requests.post(url, data=post_params, headers=header,verify=False)

print(r.text)

这里的返回结果为:

{"msg":"内部错误","data":null,"code":5000}

这里虽然是一个小坑,但让我费了好久的时间,最后解决这个问题,让我吐血三升,直骂自己傻逼。我先卖个关子,继续看,看我怎么解决的。

遇到这个这个返回结果,第一想法就是,我的请求参数不对,哪里出了问题。

第一次尝试: 文本比对–请求头文本对比

我就不贴图了,完全设置是一样的,结果还是不行,还是这个问题。我郁闷了,懵逼一会了。难道是跟http2协议有关,跟请求头的“:method”这样的字段有关?

第二次尝试: http2协议–请求头带冒号解决”:method“。

我的请求是不带“:method”这些字段,因为python的requests包不支持http2协议请求。没辙就百度嘛!!python的确有两个包可以支持http2的请求,hyper包,但这个已经三年不更新了;还有一个包名字我忘了,它不支持代理。做爬虫,不支持代理还怎么玩啊。自闭中。。

第三次尝试: 查看该网站的发送请求的js地方,看它是带了哪些请求参数,是不是也带了“:method”这东西

看上图,没看到“:method”这鬼玩意。好吧,我想复杂了,那就是说不带也是可以的。用curl来模拟一下,看看能不能请求到数据

第四次尝试: curl模拟请求

结果:

真的是不带也是可以的,请求头里没有“:method”。

各位到了这一步基本可以确定,不是别人的问题,而是我自己的问题了。那到底是哪里出了问题了呢。。。。。。。。。抓狂中

第五次尝试: 经过痛苦地一遍遍查看短短24行代码,终于发现问题所在了。

r = requests.post(url, data=post_params, headers=header,verify=False)

就是这行的代码的问题,大家能看出问题点嘛?

它的请求头有个字段:

'Content-Type': 'application/json;charset=UTF-8'

哎,说多了都是累:改一个变量定义就可以了:

r = requests.post(url, json=post_params, headers=header,verify=False)

把data改成json就可以了。。。。。。我TM。。

data在什么使用呢?这哥们写的很好Python requests.post方法中data与json参数区别

不说了,郁闷死了。咱们继续。

下一篇文章给大家说说如何破解请求的加密参数xyz与nonce的。

此生愿为井中一蛙,不问世间繁华变迁,常怀敬畏之心,坚守心中的方寸之地

如果觉得《python爬虫之逆向破解_js逆向爬虫实战(2)--新快之加密参数破解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。