1.Cookie和Session的区别
如果你登录知乎,填写过用户名、密码下次进来的时候不想再填写了,那么你在第一次登录后,服务器就会发送给你的浏览器一个Cookie,Cookie中包含了你的用户名、密码,下次再次发送请求给知乎的时候,浏览器会自动给请求加上Cookie,这样服务器就能知道你是谁。这就是Cookie的机制。
但是这种机制是不安全的,当你本地Cookie被别人获取后,就能直接使用你的账号了。于是出现了session机制:当你第一次以用户名、密码登录知乎时,知乎服务器会自己生成一条Session Id和sesson Value保存在服务器端,同时将Session Id作为Cookie中的一个键值对返回给浏览器,当你第二次请求知乎服务器的时候,请求会自动加上Session Id,那么服务器端收到Session Id后,会在服务器上查询是否有此Session Id,如果查询到,那么就匹配到相应的Session Value,也就是包含用户名密码的部分,这时候服务器就能识别出来你是那个用户了。
明确一点:Session Value中包含的是加密的用户名、密码等用户的Profile,是存放在服务器端,同事每一个Session Id都是有一个有效期的,这两点保证了安全性。
2.Http状态码
code | 说明 |
---|---|
200 | 请求被成功处理 |
301/302 | 永久重定向/临时重定向 |
403 | 没有访问权限 |
404 | 灭有对应的资源 |
500 | 服务器错误 |
503 | 服务器停机或正在维护 |
3.分析知乎登录
3.1 找到登录请求URL
通过尝试手机号码和邮箱号,分析得出知乎统一登录网址为:https://www.zhihu.com/api/v3/oauth/sign_in
3.2 找到登录时的header部分
:authority: www.zhihu.com
:method: POST
origin: https://www.zhihu.com
referer: https://www.zhihu.com/signup?next=%2F
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
x-xsrftoken: 405b7e07-d4f5-4b35-8b70-3e129d97a4d8
主要的是找到x-xsrftoken,以前的教程写的都是_xsrf在返回的html中标签中,改版后变化了,我们可以在返回的cookie中找到,所以
首先设置一个header
agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
header = {
"HOST": "www.zhihu.com",
"Referer": "https://www.zhihu.com/",
"User-Agent": agent,
}
取得_xsrf
def get_xsrf():
response = session.post("https://www.zhihu.com/signup?next=%2F", headers=header)
return response.cookies['_xsrf']
随后更新header
header.update({
"X-Xsrftoken": xsrf
})
3.3分析请求登录页面的data数据
3.3.1得到请求的data数据格式为下
------WebKitFormBoundary4YUIdOtklYTeomJn
Content-Disposition: form-data; name="client_id"
c3cef7c66a1843f8b3a9e6a1e3160e20
------WebKitFormBoundary4YUIdOtklYTeomJn
Content-Disposition: form-data; name="grant_type"