python实现扫码登录知乎网页版
一、找到生成二维码网址
- 知乎扫码登录还是比较简单的,没有任何加密
- 打开知乎扫码登录页面:
https://www.zhihu.com/signin
- 按F12找到生成
token
参数的链接:https://www.zhihu.com/api/v3/account/api/login/qrcode
- 下面这个链接就是二维码图片的链接
- 看看二维码的网址变化,发现
https://www.zhihu.com/api/v3/account/api/login/qrcode/
PMvdQ7xoQzKAeYMu
/image?utm_campaign=internal&utm_medium=qr&utm_source=login&utm_term=force_launch&utm_content=qrscand
PMvdQ7xoQzKAeYMu
就是token值,那就好办了,先访问生成token的链接
session = requests.session()
session.post('https://www.zhihu.com/udid',headers=headers)
url = 'https://www.zhihu.com/api/v3/account/api/login/qrcode'
login = session.post(url, headers=headers).json()
token = login['token']
- 有人会问,
session.post('https://www.zhihu.com/udid',headers=headers)
这是什么 - 如果直接访问
https://www.zhihu.com/api/v3/account/api/login/qrcode
是生成不出token
值的 - 访问此链接必须要一个cookie参数,访问
https://www.zhihu.com/udid
会成生d_c0
值
session = requests.session()
session.post('https://www.zhihu.com/udid',headers=headers)
print(session.cookies)
#输出 <RequestsCookieJar[<Cookie _xsrf=pstHRRvS……for .zhihu.com/>, <Cookie d_c0="AABcp1NOzRKPTp_iA8w20SrgUDO0gArUw1E=|16157
- session类,有储存cookie功能,所以要先访问
https://www.zhihu.com/udid
链接
二、输入token值,显示二维码
- 上面得到了token值,那现在就把token值放入二维码链接中,打开二维码
session = requests.session()
session.post('https://www.zhihu.com/udid',headers=headers)
url = 'https://www.zhihu.com/api/v3/account/api/login/qrcode'
login = session.post(url, headers=headers).json()
token = login['token']
tokenurl = 'https://www.zhihu.com/api/v3/account/api/login/qrcode/{}/image?utm_campaign=internal&utm_medium=qr&utm_source=login&utm_term=force_launch&utm_content=qrscand'
png = session.get(tokenurl.format(token),headers=headers)
t = showpng(png.content)
t.start() #打开二维码
- 二维码弹出,进行扫码操作之前,要找到二维码状态的链接
- 这个链接一般都是实时更新的,确保二维码时效性
- 发现此链接也需要token值,将其放入该链接进行访问,测试登录结果
session = requests.session()
session.post('https://www.zhihu.com/udid',headers=headers)
url = 'https://www.zhihu.com/api/v3/account/api/login/qrcode'
login = session.post(url, headers=headers).json()
token = login['token']
tokenurl = 'https://www.zhihu.com/api/v3/account/api/login/qrcode/{}/image?utm_campaign=internal&utm_medium=qr&utm_source=login&utm_term=force_launch&utm_content=qrscand'
png = session.get(tokenurl.format(token),headers=headers)
t = showpng(png.content)
t.start()
dataurl = 'https://www.zhihu.com/api/v3/account/api/login/qrcode/{}/scan_info'
while 1:
data = session.get(dataurl.format(token), headers=headers).json()
try:
if '0' in str(data['status']):
print('二维码未失效,请扫码!')
elif '1' in str(data['status']):
print('已扫码,请确认!')
else:
break
except:
print('登录成功!')
break
time.sleep(2)
三、保存cookie和验证cookie是否登录
完整代码
# -*- coding: utf-8 -*-
import pickle
import agent
from threading import Thread
import time
import requests
from io import BytesIO
import os
from PIL import Image
requests.packages.urllib3.disable_warnings()
headers = {'User-Agent': agent.get_user_agents(),'referer': 'https://www.zhihu.com/'}
class showpng(Thread):
def __init__(self, data):
Thread.__init__(self)
self.data = data
def run(self):
img = Image.open(BytesIO(self.data))
img.show()
def islogin(session):
try:
session.cookies.load(ignore_discard=True)
except Exception:
pass
loginurl = session.get("https://www.zhihu.com/api/v4/me?include=visits_count", headers=headers).json()
try:
if loginurl['messages_count'] == 0:
print('Cookies值有效,', loginurl['name'],',已登录!')
return session, True
else:
print('Cookies值已经失效,请重新扫码登录!')
return session, False
except:
print('Cookies值已经失效,请重新扫码登录!')
return session, False
def login():
# 写入
session = requests.session()
if not os.path.exists('zhcookies.cookie'):
with open('zhcookies.cookie', 'wb') as f:
pickle.dump(session.cookies, f)
# 读取
session.cookies = pickle.load(open('zhcookies.cookie', 'rb'))
session, status = islogin(session)
if not status:
session = requests.session()
session.post('https://www.zhihu.com/udid', headers=headers)
url = 'https://www.zhihu.com/api/v3/account/api/login/qrcode'
login = session.post(url, headers=headers).json()
token = login['token']
tokenurl = 'https://www.zhihu.com/api/v3/account/api/login/qrcode/{}/image?utm_campaign=internal&utm_medium=qr&utm_source=login&utm_term=force_launch&utm_content=qrscand'
png = session.get(tokenurl.format(token), headers=headers)
t = showpng(png.content)
t.start()
dataurl = 'https://www.zhihu.com/api/v3/account/api/login/qrcode/{}/scan_info'
while 1:
data = session.get(dataurl.format(token), headers=headers).json()
try:
if '0' in str(data['status']):
print('二维码未失效,请扫码!')
elif '1' in str(data['status']):
print('已扫码,请确认!')
else:
break
except:
name = session.get('https://www.zhihu.com/api/v4/me?include=visits_count', headers=headers).json()
print( name['name'],'登录成功!')
break
time.sleep(2)
with open('zhcookies.cookie', 'wb') as f:
pickle.dump(session.cookies, f)
return session
if __name__ == '__main__':
login()
四 、 更多文章
- 后期小编将开设登录后批量采集各平台数据(点赞、播放量、评论、图片、视频、音乐等)专栏文章!记得关注哟!😜
- 如果文章能帮到您,愿意给小编点个 赞 👍 吗,么么哒~😘 (●’◡’●)