Python扫码登录保存和验证cookies值——CSDN篇(八)

python实现扫码登录CSDN网页版

  • 一、CSDNapp扫码登录
    • 1、该二维码生成方式和上一篇一样没有实在链接
    • 2、找到确认链接
    • 3、保存cookies值并进行验证
    • 完整代码
  • 二、微信扫码登录CSDN
    • 1、微信扫码登录有实在的二维码链接
    • 2、找确认网址
    • 3、保存cookies值并进行验证
    • 完整代码
  • 三、遇到的问题

一、CSDNapp扫码登录

1、该二维码生成方式和上一篇一样没有实在链接

  • 找到获取二维码隐藏文字信息

https://passport.csdn.net/v1/api/app/scan/createAppScan

  • 该链接虽是POST,但是无需参数带入就可以访问
session = requests.session()
getlogin = session.post('https://passport.csdn.net/v1/api/app/scan/createAppScan', headers=headers).json()
token = getlogin['data']['token']
pngurl =getlogin['data']['url']
  • 获取了token和pngurl两个参数之后,就可以进行扫码操作
  • 这次小编没有找js生成方式,用了另外一个简单方法

方法:就是将刷新CSDN登录页面,选择CSDN登录二维码,将二维码图片进行保存,然后用python对这二维码进行识别获取文字信息,或者用抖音APP登录功能直接进行扫码获取该二维码信息链接。获取信息之后发现该链接就是pngurl的参数

  • 隐藏文字链接获取了,直接再python进行缓存打开显示二维码进行扫码操作
getlogin = session.post('https://passport.csdn.net/v1/api/app/scan/createAppScan', headers=headers).json()
token = getlogin['data']['token']
pngurl =getlogin['data']['url']
qr = qrcode.QRCode()
qr.add_data(pngurl)
img = qr.make_image()
# 缓存的好处就是不需要保存本地
a = BytesIO()
img.save(a, 'png')
png = a.getvalue()
a.close()
# 打开二维码进行扫码操作
t = showpng(png)
t.start()

2、找到确认链接

  • 确认链接挺好找的,就是F12之后,实时反复出现的链接就是

https://passport.csdn.net/v1/api/app/scan/webRefreshToken

  • 通过观察访问此链接要几个参数,但只需要一个参数即可:token
  • 然后对该链接反复测试登录,获取登录后参数变化
tokenurl = 'https://passport.csdn.net/v1/api/app/scan/webRefreshToken'
while 1:
    qrcodedata = session.post(tokenurl, json={
     "token": token}, headers=headers).json()
    if '0' in str(qrcodedata['data']['code']):
        print('二维码未失效,请扫码!')
    elif '1' in str(qrcodedata['data']['code']):
        print('已扫码,请确认!')
    elif '2' in str(qrcodedata['data']['code']):
        print('已确认,登录成功!')
        break
    else:
        print('其他:', qrcodedata)
    time.sleep(2)#2秒访问1次
  • 登录成功后,就获取需要cookie了

3、保存cookies值并进行验证

完整代码

# -*- coding: utf-8 -*-
import pickle
import qrcode
import agent
from threading import Thread
import time
import requests
from io import BytesIO
from PIL import Image
import os
requests.packages.urllib3.disable_warnings()
headers = {
     'User-Agent': agent.get_user_agents(), 'Referer': "https://passport.csdn.net/login?code=public"}

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://msg.csdn.net/v1/im/query/historySession3", headers=headers).json()
    if 'success' in str(loginurl['message']):
        print('Cookies值有效,已登录!')
        return session, True
    else:
        print('Cookies值已经失效,请重新扫码登录!')
        return session, False

#csdn软件扫码
def csdlogin():
    # 写入
    session = requests.session()
    if not os.path.exists('csdncookies.cookie'):
        with open('csdncookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    # 读取
    session.cookies = pickle.load(open('csdncookies.cookie', 'rb'))
    session, status = islogin(session)
    if not status:
        getlogin = session.post('https://passport.csdn.net/v1/api/app/scan/createAppScan', headers=headers).json()
        token = getlogin['data']['token']
        pngurl =getlogin['data']['url']
        qr = qrcode.QRCode()
        qr.add_data(pngurl)
        img = qr.make_image()
        # 缓存的好处就是不需要保存本地
        a = BytesIO()
        img.save(a, 'png')
        png = a.getvalue()
        a.close()
        # 打开二维码进行扫码操作
        t = showpng(png)
        t.start()
        tokenurl = 'https://passport.csdn.net/v1/api/app/scan/webRefreshToken'
        while 1:
            qrcodedata = session.post(tokenurl, json={
     "token": token}, headers=headers).json()
            if '0' in str(qrcodedata['data']['code']):
                print('二维码未失效,请扫码!')
            elif '1' in str(qrcodedata['data']['code']):
                print('已扫码,请确认!')
            elif '2' in str(qrcodedata['data']['code']):
                print('已确认,登入成功!')
                break
            else:
                print('其他:', qrcodedata)
            time.sleep(2)
        with open('csdncookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    return session

if __name__ == '__main__':
    csdlogin()

二、微信扫码登录CSDN

1、微信扫码登录有实在的二维码链接

  • 生成二维码链接的网址

https://passport.csdn.net/v1/register/pc/officialAccount/createQrCode

  • 访问此链接获取新的网址qrCodeUrl,在浏览器上打开该网址就是二维码图片,所以就不需要进行缓存转二维码图片了,直接扫码操作
getlogin = session.post('https://passport.csdn.net/v1/register/pc/officialAccount/createQrCode', headers=headers).json()
pngurl = session.get(getlogin['data']['qrCodeUrl'], headers=headers).content
t = showpng(pngurl)
t.start()

2、找确认网址

  • 和上面一样,就是网址不一样

https://passport-api.csdn.net/v1/register/pc/officialAccount/checkLogin

  • 通过小编反复测试获取下面参数
tokenurl = 'https://passport-api.csdn.net/v1/register/pc/officialAccount/checkLogin'
while 1:
    qrcodedata = session.post(tokenurl, headers=headers).json()
    if '1070' in str(qrcodedata['code']):
        print('二维码未失效,请扫码!')
    elif '1015' in str(qrcodedata['code']):
        print('二维码已失效!')
    elif '0' in str(qrcodedata['code']):
        print('已确认,登入成功!')
        break
    else:
        print('其他:', qrcodedata)
    time.sleep(2)

3、保存cookies值并进行验证

完整代码

# -*- coding: utf-8 -*-
import pickle
import qrcode
import agent
from threading import Thread
import time
import requests
from io import BytesIO
from PIL import Image
import os
requests.packages.urllib3.disable_warnings()
headers = {
     'User-Agent': agent.get_user_agents(), 'Referer': "https://passport.csdn.net/login?code=public"}

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://msg.csdn.net/v1/im/query/historySession3", headers=headers).json()
    if 'success' in str(loginurl['message']):
        print('Cookies值有效,已登录!')
        return session, True
    else:
        print('Cookies值已经失效,请重新扫码登录!')
        return session, False

#微信扫码
def csdlogin():
    # 写入
    session = requests.session()
    if not os.path.exists('csdncookies.cookie'):
        with open('csdncookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    # 读取
    session.cookies = pickle.load(open('csdncookies.cookie', 'rb'))
    session, status = islogin(session)
    if not status:
        getlogin = session.post('https://passport.csdn.net/v1/register/pc/officialAccount/createQrCode', headers=headers).json()
        pngurl =session.get(getlogin['data']['qrCodeUrl'],headers=headers).content
        t = showpng(pngurl)
        t.start()
        tokenurl = 'https://passport-api.csdn.net/v1/register/pc/officialAccount/checkLogin'
        while 1:
            qrcodedata =session.post(tokenurl, headers=headers).json()
            if '1070' in str(qrcodedata['code']):
                print('二维码未失效,请扫码!')
            elif '1015' in str(qrcodedata['code']):
                print('二维码已失效!')
            elif '0' in str(qrcodedata['code']):
                print('已确认,登入成功!')
                break
            else:
                print('其他:', qrcodedata)
            time.sleep(2)
        with open('csdncookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    return session
    
if __name__ == '__main__':
    csdlogin()

三、遇到的问题

  • 获取扫码登录cookie还是比较简单的,但是小编遇到无法解决的问题

https://bizapi.csdn.net/blog-console-api/v1/article/list?pageSize=20

  • 该链接是登录CSDN后台后生成文章管理的列表,小编发现既然无法单独打开此网址,即使存在登录cookie也是无法访问,这样就无法在python访问
  • 小编猜想可能是缺少参数

x-ca-key: 2038……
x-ca-nonce: 27798095-6c0a-473……41
x-ca-signature: +zkhXW7/……JNsk=
access-control-max-age: 172……
x-ca-request-id: 96C4B4……B6703

  • 但是这些参数小编不知如何获取来源,小编能力有限,不知有哪位大神可以解决!

你可能感兴趣的:(Python实现扫码登录,python,cookie)