最新知乎模拟登陆过程分析

最新的知乎,当填完账号,密码,点击登陆按钮,使用chrome的调试面板,看看发送了哪些请求?

 

注意红色的名为sign_in的文件,这就是登陆请求的文件,故意将密码填写错误,便于观察。

 

在http的请求头中,包含了General,Response Headers,Request Headers ,From Data,From Data 一般是将表单内容用post方法提交给服务器程序指定路由处理。

这种奇奇怪怪,有点眼熟的代码,做程序的大多数人知道,这是对提交字段做了加密处理。

 

问题1: 提交的字段有哪些?

问题2: 处理字段加密的函数在哪?

 

解决了问题二,应该就知道问题一的答案了。

 

进入chrome ->srouce 面板 一探究竟。加密函数应该是在网页的某个文件中,具体哪个文件?搜搜看,和加密相关的英文,只要相关的函数名没有加密,就可以搜到,先通过chrome的全局搜索encrypt定位到文件,快捷键ctrl + shift +f,在文件中搜索encrypt定位到函数。

这个函数Q传入了e这个参数,通过_encrypt(e)加密。打上断点看看,e是什么,加密后又是什么?

 

看到这个函数的返回值与一开始提到的From data中的加密形式是一致,而e中的值又符合字段=值的这种url请求得编码格式,那么e中的每个字段就是post过程中提交的字段,每个字段的含是什么?它们的值是否固定?

 

先列出这些字段,根据英文意思分析一下:

"client_id":客户端的ID
"grant_type":授权类型,
"timestamp":时间戳,
"source":源地址,
"signature":签名,
"username":用户名,
"password":密码,
"captcha": 验证码,
"lang": 验证码类型,
"ref_source":,
"utmSource":,

 

 

它们的值是否固定,多调试几次对比e中的各个字段,就可以判定它们是否固定。

这里不固定的是时间戳(已知),验证码,签名

签名又是一种加密,它是根据什么值来加密的?

按照上面的同样的做法,去chrome->srouce面板搜索signature,如下:

这个函数,展示了signature的加密过程,通过密钥,SHA-1密码散列函数,SHA-1可以生成一个被称为消息摘要的160(20字节)散列值,散列值通常的呈现形式为40个十六进制数,r.update(),添加了e,u,com.zhihu.web,n对应的key为clientID,grantType,timestamp,source,即通过这几个字段的值sha-1加密的值即为signature.而这几个值都是已知的,可算出signature.

 

解决了签名的问题,再来解决验证码的问题,打开知乎观察chrome->network面板中请求的文件,其中captcha?lang=en文件中request url便是请求获取验证码的完整地址,后面lang是请求验证码的类型,点击倒立的中文字和输入英文字符串两种。

同时观察请求这个地址的返回值,false,即没有验证码。

 

反复刷新知乎登陆页面,看看这个请求这个文件,返回true的情况是什么样.

当服务器返回浏览器true时,下面好像多了一个同名文件captcha?lang=cn

查看文件如下:

 

请求的是同一个地址,不过不同的是request method:put, PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源),再来看看响应结果:

Base64编码的图片,那这就是验证码的图片,通过函数对base64解码写入文件,还原图片。百度搜一搜,即可解决。

 

故意提交一个错误的验证码,看看network中多了什么文件。

请求地址相同,请求方法为post,而post的字段有哪些呢,如下:

 

 

总结验证码思路:

1.向验证码的地址发起请求获取验证码通过get的方式,若响应结果false,则captcha字段为空。

2.若响应结果true,则代码有验证码,继续向验证码地址发起请求通过put方法获取base64编码的格式,通过程序将图片打开,若是字符验证码,从键盘中输入这个字符串并记录下变量中,若验证码是点击倒立的字,获取的是鼠标点击图片上的点,点的坐标即为验证码,可以是一个,也可以是多个。

3.构造input_text对象,post给服务器,

 

这个验证码即是captcha字段的值,也是检验验证码正确性构造input_text对象需要的值。

 

到这里,captcha是什么也解决了。

接下来,只要把这些字段按照url编码,传递给加密函数,然后再提交到登陆的地址即可完成登陆。

问题1,加密函数是什么?我们之前找到的是加密函数的位置,并不是全部的加密函数。

问题2,如何运行加密函数?execjs这个库,可以通过本地环境,一般指的node环境,在node中运行这些js代码,但node环境运行加密函数js和在浏览器中并不一样,需要在node环境中调整代码,使之呈现的和浏览器一样。

 

问题1:加密函数的位置之前已经找到,但是你单纯的运行Q函数是不行的,你需要Q函数的上下文来支持运行Q函数,也就是找Q函数的父级函数,父级函数中的整个内容都是Q的上下文。

 

问题2: 将代码放在node环境中运行调试,看看都报了哪些错,比如浏览器中的window在node环境中是会产生错误的等等。

 

另外还有一点就是,当你请求一个地址的时候,需要带上请求头header。

 

最后,放上成功登陆的结果。

 

 

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值