Python扫码登录保存和验证cookies值——知乎篇(十)

一、找到生成二维码网址

  • 知乎扫码登录还是比较简单的,没有任何加密
  • 打开知乎扫码登录页面: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()

四 、 更多文章

  1. 抖音篇(一)
  2. 快手篇(二)
  3. 微视篇(三)
  4. 微信公众号篇(四)
  5. 微博篇(五))
  6. B站篇(六))
  7. CSDN篇(八))
  8. 网易云音乐篇(九))
  • 后期小编将开设登录后批量采集各平台数据(点赞、播放量、评论、图片、视频、音乐等)专栏文章!记得关注哟!😜
  • 如果文章能帮到您,愿意给小编点个 👍 吗,么么哒~😘 (●’◡’●)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值