前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python爬虫-百度模拟登录(二)

Python爬虫-百度模拟登录(二)

作者头像
星星在线
发布2018-08-21 10:33:15
1.1K0
发布2018-08-21 10:33:15
举报

接上一篇的继续

参数 codestring

codestring

jxG9506c1811b44e2fd0220153643013f7e6b1898075a047bbd

套路我相信很多人已经掌握了,先在Charles中搜索值

参数值都看到了,token、tt、dv、callback这些变化的参数我们都知道了吧,其他的参数固定,别问我为什么。这个logincheck注意到了吗?是不是有人能想起前面的?不能放在字典里赋空值,要直接写在url后面,好了轻松搞定codestring。

参数 verifycode

verifycode

又把

验证码就不用全量搜索了,图片嘛,浏览一下图片请求就知道了

参数是codestring不用我提醒了吧,请求一下手动输入哦,有的人问为什么不搞自动识别的,其实没有必要,现在打码平台很便宜,而且大部分验证码都可以搞定,如果自己去搞得话,太费时间识别率还低,所以我这里就不说验证码这个了,如果有时间以后单独写一篇吧。

参数 traceid

traceid

EA43E001

老套路先搜索值,没搜到!!!,换name试试

搜了很多发现都是这个createTraceID函数创建的

都找到了,自己翻译一下吧

参数 ppui_logintime

ppui_logintime

19863

又是个时间,直接搜name吧

只搜到这一个,然后搜一下timespan

当前时间减去一个初始时间,这是一个时间段,应该是从某次请求开始到某次请求结束,对于这种我们捏造一个吧,没必要那么精确,看一下大概的时间,取15000~30000吧

参数 rsakey

rsakey

3kUWNJ6tggVCigi7EoQZcsuKpBcDKPKj

搜一下值

需要的参数不说了哦,这回看看返回值,pubkey、key,这个key的值就是我们的rsakey,pubkey我们后面会用到,先记下

fp_info&fp_uid

fp_uid

19ec2fa82bec175d9628b81d9683e9d2

fp_info

0245fc9782abae99a665854526e19a19002~~nIpK32ZQH2fI2i_lnn9ypKA34B...

这两个参数放在一起说,注意fp_uid和fp_info前面的是一样的,从002~~开始不一样了

先搜了fp_uid,发现是获取cookie的,又没有搜到set cookie的地方,那么有可能是通过本地生成的,对于本地生成的,其实最简单就是固定值,我也是使用固定值试了试,没有问题,当然是调试了一番以后才这么做的,因为调试太麻烦了。再搜一下fp_info看看吧

这个就可能性比较大了,开始调试了,打开chrome->隐身模式->清理缓存->打开百度首页->点击一下登录按钮,找到刚才的js文件,搜~~~

然后再清理缓存,重新刷新百度首页,点击登录按钮

打印一下n和t的值

开始调试,进入到这个函数以后,我们看到这里有几个函数d.genGUID,打印一下看看

是不是有点fp_uid的样子了,那就它了,这是哪个函数呢,很简单,打印一下

翻译成python或者用python执行js脚本的方式都行,fp_uid干掉了吧,fp_info后半部分太麻烦了,有谁搞定了麻烦告诉我一声。我这里就用固定值了。

参数password

password

ai2s9z7UUf9XFguwg6EUslu607/CNrit0B3c4mGF/VzEIjc+SkFM7kuSRx2LWkTAk0lecetCIQcpZ9xKtXdKy3NG7aJfkFbWxMFqCNtM3birZbkgQw6l7UKGYpeuIDAn0ae/52nU4HkcSmPAL8iGV7hQP9CxoWYpL59r8Vq8dug=

搜一下password=

断点打好了就开始调试吧,完犊子了今天死活调试不到断点处了,其实这个比较明显的,当然如果你对rsa加密不了解或者了解的不多那就不容易了,首先想想我们前面获取的pubkey的值,-----BEGIN PUBLIC KEY-----......-----END PUBLIC KEY-----\n,我先贴一下代码吧

代码语言:javascript
复制
    def encript_password(self, password, pubkey):
        pub = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode('utf-8'))
        encript_passwd = rsa.encrypt(password.encode('utf-8'), pub)        return base64.b64encode(encript_passwd).decode('utf-8')

看一下这个load_pkcs1_openssl_pem函数

代码语言:javascript
复制
    def load_pkcs1_openssl_pem(cls, keyfile):
        """Loads a PKCS#1.5 PEM-encoded public key file from OpenSSL.

        These files can be recognised in that they start with BEGIN PUBLIC KEY
        rather than BEGIN RSA PUBLIC KEY.

        The contents of the file before the "-----BEGIN PUBLIC KEY-----" and
        after the "-----END PUBLIC KEY-----" lines is ignored.

        :param keyfile: contents of a PEM-encoded file that contains the public
            key, from OpenSSL.
        :return: a PublicKey object
        """

        der = rsa.pem.load_pem(keyfile, 'PUBLIC KEY')        return cls.load_pkcs1_openssl_der(der)

如果js可以调试进去_SBCtoDBC,你就会发现它对BEGIN和END的处理,那实际上它就是在做rsa加密,所以说如果你了解rsa的这种加密方式,看到BEGIN PUBLIC KEY和END PUBLIC KEY的时候就马上能猜出来了,所以加密函数已经给你了,pubkey获取了,password你自己知道,那这个也搞定了。

至此,登录参数都搞定了,我们可以向下进行了

请求的url和参数都在登录的返回值里,解析一下https://www.baidu.com/cache/user/html/v3Jump.html?err_no=0&callback=parent.bd__pcbs__psvho&codeString=&userName=wuqing198985&phoneNumber=&mail=&hao123Param=RmxaRU5VTVcxTVNWcDFiMDlEU3psMWFVeGtaa2c0TldOSk0yVk1WVFV0WWxCcmVuUmxWSEl0VWpsaVl6bGhRVUZCUVVGQkpDUUFBQUFBQUFBQUFBRUFBQUNzdWQwS2QzVnhhVzVuTVRrNE9UZzFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIM2dwMXA5NEtkYVJG&u=https://www.baidu.com/&tpl=mn&secstate=&gotourl=&authtoken=&loginproxy=&resetpwd=&vcodetype=&lstr=&ltoken=&bckv=1&bcsync=KnqkeCS8J7B9vuKnaRltPTrp9Kl0hPsH6votXG00OmsypOV8lYboSn7pxuyb%2F1l8XUlp9M0v0gIKoL9og3nXmZYFaGCcMO%2Fx4roGpF7SFA0cqXGlnhwGeBmIY5cVxgeM6aJ2RjPXp3fb6q41WjTiipEvOXCvcfuW7XLemxoEv%2F2ribszd6n7ql7aO7l850fOFqzBiZGeBNu3D0OZFnJeSsOHMEquD6Ahw9dbRl9ahaaRSEMDxQtrn36Bj2jayIY88OTyu7CWjtApT2eZ2SfAjBhr3IzHbnbSPhtoL82nsH7WwqHGeqq3uxYDdqH7ZkgjE3JlQV9SDQCPTnfpPxIrYg%3D%3D&bcchecksum=2590966377&code=&bdToken=&realnameswitch=&setpwdswitch=&bctime=1520951421&bdstoken=&authsid=&jumpset=&appealurl=&realnameverifyemail=0&traceid=&realnameauthsid=&accounts= 请求完以后,返回值里没有什么明显的有用值,那我就直接访问了一下首页

我们怎么判定登录成功呢,一般就是获取有用户名的页面,然后获取一下用户名,看是否存在,如果有那么就登录成功了。很幸运访问首页后登录成功了。百度模拟登录到这里就结束了。之前微博模拟登录的时候,访问一个页面,返回值里是下一个页面链接,再访问再返回下一个。我们在处理这种的时候呢,我们要怎么处理呢?

逆向推理:首先找我们需要的目标点,比如一开始我就找登录请求,然后看登录请求里面需要哪些参数,然后再一步步分析这些参数的来源,其实就是逆向推,另外登录请求完成后,再找一个目标点,就是已登录的页面,如果没有成功,就从登录往下看。基本就是这么一个思路。


最后要再说一下,写这个的目的并不是为了什么项目之类的,就是学习,练习一下,所以大家就不要吹毛求疵了,而且我也不接受吐槽。有意见可以提,反正我也不改^_^

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爬虫实战之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参数 codestring
  • 参数 verifycode
  • 参数 traceid
  • 参数 ppui_logintime
  • 参数 rsakey
  • fp_info&fp_uid
  • 参数password
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档