前一篇博客有人评论说知乎又改版了,去看了一下还真的是….又研究了一下新版的登录,有了这篇文章
首先是抓包分析,知乎的登录接口变为了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,下面的就没法测试了,不排除会返回图片的可能,登录成功如下
好了,还有什么问题欢迎留言讨论,学习愉快