知乎改版使用restapi后模拟登录

前一篇博客有人评论说知乎又改版了,去看了一下还真的是….又研究了一下新版的登录,有了这篇文章

首先是抓包分析,知乎的登录接口变为了https://www.zhihu.com/api/v3/oauth/sign_in ,找下这个接口的参数,懒的一个个复制了,浏览器里抓来就贴这里了,各位将就看下

------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="client_id"

c3cef7c66a1843f8b3a9e6a1e3160e20
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="grant_type"

password
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="timestamp"

1514945556611
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="source"

com.zhihu.web
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="signature"

5e2ca2d664e45e4a6ab34f31a87dcdf8937a4149
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="username"

+86123456788
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="password"

hahahahaha
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="captcha"


------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="lang"

cn
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="ref_source"

homepage
------WebKitFormBoundarydoRg2ZraS5Tg7rrX
Content-Disposition: form-data; name="utm_source"

baidu
------WebKitFormBoundarydoRg2ZraS5Tg7rrX--

多次请求,其他参数都是固定的,但是signature参数是个什么东西…知道意思是签名,但是我们要从哪里获取这个呢.网页源码里没有,那肯定是js生成的,去js里搜索在
https://static.zhihu.com/heifetz/main.app.da67b2ab04cd46a8caa1.js中总算是找到了.为了好看下载到编译器里,实在太大,编译器直接卡死了,太尴尬了….漫长的等待后拿到这么一段js

function (e, t, n) {
    "use strict";
    function r(e, t) {
        var n = Date.now(), r = new a.a("SHA-1", "TEXT");
        return r.setHMACKey("d1b964811afb40118a12068ff74a12f4", "TEXT"), r.update(e), r.update(i.a), r.update("com.zhihu.web"), r.update(String(n)), c({
            clientId: i.a,
            grantType: e,
            timestamp: n,
            source: "com.zhihu.web",
            signature: r.getHMAC("HEX")
        }, t)
    }

signature 参数仅仅就是对一堆变量进行hmac sha1 hash得到的一个值,对应的几个参数,clientId,grantType,source都是不变的,唯一有变化的是timestamp这个时间锉,知道加密过程就好说了,剩下用python模拟就好了

这里记录一下踩过的坑,由于我一些代码直接去复制以前的,以为只用关注登录接口,参数加密都研究好了发现怎么都不对,提示什么验证码票据没有,还想着自己传了验证码的,结果好半天才发现,验证码接口也变了….新的验证码接口为https://www.zhihu.com/api/v3/oauth/captcha?lang=cn,和以前一样,我们还是把后面的参数改为en,方便我们操作

另外还有一个,这些接口现在直接调用的话,会出现没认证的情况,查看登录的接口,添加了header

authorization: oauth c3cef7c66a1843f8b3a9e6a1e3160e20

其实后面那串就是client_id ,固定的,加上就行

注意验证码返回的是json,处理不能按照以前那样,

    def parser_captcha(self, response):
        show_captcha = json.loads(response.text)['show_captcha']
        if show_captcha:
            with open('captcha.jpg', 'wb') as f:
                f.write(response.body)
                f.close()
            try:
                im = Image.open('captcha.jpg')
                im.show()
                im.close()
            except:
                print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))
            captcha = input("please input the captcha\n>")
        else:
            captcha = ''

我请求多次show_captcha都是False,下面的就没法测试了,不排除会返回图片的可能,登录成功如下
登录结果

好了,还有什么问题欢迎留言讨论,学习愉快

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值