千呼万唤屎出来呀,百度模拟登陆终于要呈如今你们眼前了,最近比较忙,晚上又得早点休息,这篇文章写了好几天才完成。这个成功之后,我打算试试百度网盘的其余接口实现。看看能不能把服务器文件上传到网盘,好歹也有几T的空间。javascript
先清理浏览器缓存,打开Charles,登陆一次百度主页,抓取到登陆过程。
原本是想改一下写做的格式,美观一些,可是想了想,仍是按照分析的顺序来写,这样有利于你们了解一种分析的思路。看过上一篇新浪微博PC端模拟登录的应该知道,首先要找到登陆的请求,通常为post,地址中有login
java
请求找到了,参数......,太TM多了。先观察一下参数,通常无序、随机、没有什么规则的参数有多是变化参数,其余的通常都是固定参数。固然,也能够屡次登陆抓包,对比一下大概也能肯定。那么咱们肯定一下变化的参数:token、tt(时间戳)、codestring、gid、password、verifycode(验证码)、rsakey、ppui_logintime、fp_uid、fp_info、dv、traceidpython
肯定了须要分析的参数,从哪一个开始分析呢?随意吧
通常有些参数之间是有关系的,好比token的请求参数里须要gid参数
这里我就不一一去分析参数间的关系了,直接来了啊
api
一方面其余参数须要它,另外就是这个参数是彻底由本地js生成的。先看一下这个参数
搜索一下这个值,没有。那么咱们再来搜一下这个name,就是gid,以前说过咱们通常是找xxx=这种,先来搜一下gid=
点击loginv4_9f3632a.js,而后在JavaScript页签搜索gid=
有好几个,我圈出了这个getqrcode?请求,为啥捏?看图,咱们找到这个请求
看到请求里的gid值了吗?跟咱们登陆的gid是同样的,那就肯定是这个地方了,gid=e.guideRandom,而后在这个脚本里搜一下guideRandom
而后翻译一下这个js,这......就本身去琢磨吧
浏览器
先搜索token的值
获得请求地址:https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1520951400830&class=login&gid=E8ED064-D480-4F3E-A5CE-BCF25F8DD1E2&loginversion=v4&logintype=dialogLogin&traceid=&callback=bd__cbs__6l1agx缓存
就剩下callback,其余的请求里也须要callback这个
搜一下bd__cbs__,为啥要搜这个?这个真的很痛苦,callback搜出来一大片,并且没看出来什么有效数据,值又搜不到,那就搜一半吧,你问我为啥?第六感,无论你信不信,反正我是信了
服务器
其实呢,有好几个请求都有这个参数callback,而后咱们观察这些callback的规律,基本就是这个bd__cbs__没变,因此能够搜一下它试试,搜到两个
分析一下这段代码,基本就是c.getUniqueId这个函数了,搜一下这个函数
oj8k,找到了,代码贴下面,为何这么写?本身查js去,固然有更简单了pyv8或者psexecjs微信
Token这里我要再说一下,参数咱们分析完了,你觉得请求就成功了吗?
Oh!yeah,以前咱们都是获得全部请求参数就访问成功了
就这里卡了我好长时间。那么碰到这种状况要从那几个点着手呢,首先我想到的是cookies
而后向上去找Set Cookie的地方
cookie
访问首页获得四个cookie值,H_PS_PSSID、BIDUPSID、PSTM、BAIDUIDsession
这里又找到一个BDORZ,首页很简单,没有什么参数,
注意看这几个参数,就在上面四个cookies中,t是时间戳,参数都搞定了,那么Token的cookies也都搞定了,终于能够成功了,图样图森破,仍是不行。MMP,cookies搞定都不行,我还有招,请求头!!!浏览器里直接拷过去,看你还想咋的
然鹅....,算你狠,不过我不会轻易认输的
调试他娘的,一遍一遍又一遍,两遍三遍四五遍,各类姿式都试了,终于高潮要来了,特么的请求不同
先上图
看到不同了吧,为何呢?咱们在用requests库的时候,get请求我比较习惯用.get(url, params=data),参数用params的方式传入,再来看一下Token请求的参数
getapi是空,那很明显
data = { "getapi":"", "tpl":"mn", .... } session.get(url, params=data)
而后发送的请求就是/v2/api/?getapi=&tpl=mn&....,实际上正常的请求是/v2/api/?getapi&tpl=mn&...,居然还有这种操做,我真的是第一次碰到,改一下
data = { "tpl":"mn", ... } url = ".../v2/api/?getapi&{}".format(urlencode(data)) session.get(url)
到这里才算OK了,最后总结了一下,请求的那个坑、请求头中的Referer、cookies,终于能够说一句OJ8K
为何要先说这个dv,首先这个我没彻底破解,另外就算你用固定值,也不影响结果,这个不能详细说,不然得好几帖子,咱们先搜dv=
切换到javascript页签
咱们能够搜一下dv_Input这个控件,它是没有的,我就不展现了,而后应该就是window.LG_DV_ARG了
这里有dvjsinput,上图咱们也看到了这个,切换到javascript页签看一下
而后打开浏览器,清空缓存,打开隐身窗口,打开开发者工具,访问百度首页
观察一下dv值的特色,能够找一些比较有特点的部分搜一下,好比tk、@,这样尽可能减小咱们调试js的过程,由于真的很痛苦
在console里面执行一下这个计算,跟咱们dv前面的值是否是相似,那就是它了,无论你是否是我都认为是。而后再搜一下@
刚才计算的Token+@+Ue(xx),这个确定就是dv了,至于Ue嘛,我没搞定,不过发现没啥意义,写固定值也能够,也就不用费心去找这个了。
---
---
太多了,因此这里就分割一下,剩下的下一篇再继续
若是你以为个人文章还能够,能够关注个人微信公众号:Python爬虫实战之路
也能够扫描下面二维码,添加个人微信号