Python:实现b站登录并保存登录信息(baidu Comate插件帮助我逐行分析代码)

📚博客主页:knighthood2001
公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

前言

我在某个论坛中,看到一个很有实战意义的python 爬虫Demo。

代码如下:

import os.path
from time import sleep
from http.cookiejar import LWPCookieJar
import requests
from re import findall
from tkinter import StringVar, Tk, messagebox
from os import path
from io import BytesIO
from PIL import Image, ImageTk
from qrcode import QRCode
from tkinter.ttk import Button, Label
from threading import Thread
# TODO 这段代码只适用于bilibili
temp_cookie = 'bzcookies.txt'
headers = {
    'authority': 'api.vc.bilibili.com',
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'content-type': 'application/x-www-form-urlencoded',
    'origin': 'https://message.bilibili.com',
    'referer': 'https://message.bilibili.com/',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"', 'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81',
}


def is_login(session):
    try:
        session.cookies.load(ignore_discard=True)
    except Exception as e:
        print(e)
    login_url = session.get("https://api.bilibili.com/x/web-interface/nav", verify=False, headers=headers).json()
    if login_url['code'] == 0:
        print(f"Cookies值有效, {login_url['data']['uname']}, 已登录!")
        # verification()
        return True
    else:
        print('Cookies值已经失效,请重新扫码登录!')
        # verification()
        return False


def scan_code(session2):
    global bili_jct
    get_login = session2.get('https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header',
                             headers=headers).json()
    qrcode_key = get_login['data']['qrcode_key']
    qr = QRCode()
    qr.add_data(get_login['data']['url'])
    img = qr.make_image()
    pil_image_change = img.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
    code_pic = ImageTk.PhotoImage(pil_image_change)
    token_url = f'https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main-fe-header'
    label_ver1 = Label(root, image=code_pic)
    v1.set('等待扫码')
    label_ver1.grid(row=1, column=1, rowspan=8, columnspan=1, sticky='n')
    while 1:
        qrcode_data = session2.get(token_url, headers=headers).json()
        if qrcode_data['data']['code'] == 0:
            v1.set('扫码成功')
            session2.get(qrcode_data['data']['url'], headers=headers)
            break
        else:
            v1.set(qrcode_data['data']['message'])
        sleep(1)
        root.update()
    session2.cookies.save()
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()
    bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]


def bz_login():
    global code_pic
    session1.cookies = LWPCookieJar(filename=temp_cookie)
    status = is_login(session1)
    if not status:
        scan_code(session1)
        verification()
    else:
        verification()

# 验证
def verification():
    url = 'https://api.bilibili.com/x/web-interface/nav'
    resp1 = session1.get(url=url, headers=headers).json()
    global tk_image
    if resp1['data']['isLogin']:
        face_url = resp1['data']['face']
        image_bytes = requests.get(face_url).content
        data_stream = BytesIO(image_bytes)
        pil_image = Image.open(data_stream)
        pil_image_change = pil_image.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
        tk_image = ImageTk.PhotoImage(pil_image_change)
        status = "cookie有效!登录成功!"
    else:
        thread_it(bz_login)
        status = 'cookie无效!重新登录'
    label_ver = Label(root, image=tk_image)
    label_ver.grid(row=1, column=1, rowspan=8, columnspan=1, sticky='n')
    v1.set(status)


def thread_it(func, *args):
    thread = Thread(target=func, args=args, daemon=True)
    thread.start()


def cancel_login():
    msg1 = messagebox.askyesno(title="提示", message="注销后cookie将失效,是否注销登录?")
    if msg1:
        url3 = 'https://passport.bilibili.com/login/exit/v2'
        data3 = {'biliCSRF': f'{bili_jct}'}
        session1.post(url=url3, headers=headers, data=data3).json()
        verification()


if __name__ == '__main__':
    root = Tk()
    v1 = StringVar()
    if not path.exists(temp_cookie):
        os.makedirs(temp_cookie)  # 创建文件
        with open(temp_cookie, 'w', encoding='utf-8') as f:
            f.write("")
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()  # 读取cookie
    try:
        bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]
    except Exception as e:
        print(e)
    requests.packages.urllib3.disable_warnings()  # 隐藏一些警告
    session1 = requests.session()
    root.geometry('300x225')  # 创建指定尺寸的框
    root.title("cookie")
    thread_it(bz_login)
    btn1 = Button(root, width=10, text='注销登录', command=cancel_login)
    btn1.grid(row=3, column=2)
    label_ver2 = Label(root, textvariable=v1)
    label_ver2.grid(row=9, column=1, rowspan=8, columnspan=1, sticky='n')
    root.mainloop()

这段Python代码主要实现了Bilibili的自动登录功能,利用了Bilibili的登录机制,通过扫描二维码的方式获取登录信息,并保存登录信息以便后续使用。

我之前写代码,没有在Pycharm中安装过代码辅助助手,今天让我们一起试试Baidu Comate智能编码助手,帮我更好的理解这段代码吧。

百度 comate是百度倾力打造的AI写代码平台,它集成了百度强大的文心一言技术,为用户提供了强大的代码生成和智能编程支持,Comate支持100多种编程语言(如Python、C、C++、Java、Go等)和主流开发环境(如VSCode、IntelliJ IDEA),满足不同开发者的需求。
在这里插入图片描述

具体实现过程

首先打开你的项目文件,然后Baidu Comate智能编码助手插件在右侧。

在这里插入图片描述

项目总览

对于大部分人来说,到手一个代码,肯定要先从宏观角度,先了解一下这段代码总体是在做什么的。

这能方便我们对这个项目有一个总览。

因此我们全选代码->右键->百度Comate代码工具->代码解释
在这里插入图片描述
如下图所示,代码助手首先会讲解一下,代码实现的功能,然后是具体代码的讲解。
在这里插入图片描述
这个代码,很多内容是关于爬虫的,很多知识和库我也不知道,让我们一起看看它的讲解。

  1. 导入必要的库:
    os.path:用于文件路径的操作。
    sleep:用于暂停线程的执行。
    LWPCookieJar:用于保存和加载cookie。
    requests:用于发送HTTP请求。
    re.findall:用于从字符串中查找符合正则表达式的所有内容。
    Tkinter:用于创建GUI界面。
    PIL:用于图像处理。
    qrcode:用于生成二维码。
    threading:用于多线程处理。

  2. 定义全局变量:
    temp_cookie:保存cookie的文件名。
    headers:HTTP请求头信息。

  3. 定义函数:
    is_login(session):检查当前session的cookies是否有效,如果有效则返回True,否则返回False。
    scan_code(session2):生成登录二维码并等待用户扫描,扫描成功后保存cookies。
    bz_login():主要的登录函数,先检查cookies是否有效,如果无效则调用scan_code函数进行登录。
    verification():验证登录状态,如果登录成功则显示用户头像,否则提示重新登录。
    thread_it(func, *args):创建一个新的线程来执行指定的函数。
    cancel_login():注销登录,并调用verification函数更新状态。

  4. 主程序:

    • 创建一个Tkinter的GUI窗口。
    • 检查temp_cookie文件是否存在,如果不存在则创建该文件。
    • 尝试从temp_cookie文件中读取cookies,并提取bili_jct值。
    • 创建一个requests的session对象。
    • 在一个新的线程中调用bz_login函数进行登录。
    • 创建注销登录的按钮,并绑定cancel_login函数。
    • 显示登录状态标签。
    • 进入Tkinter的主事件循环。

这里面,Baidu Comate智能编码助手会给出我导入这个库是做什么的,对于新手来说很友好。

此外,很多新手对于函数的具体作用,会搞不清楚,但是当baidu Comate插件给出每个函数具体实现的功能时,就好理解多了。

从代码运行流程入手

if __name__ == '__main__':
    root = Tk()
    v1 = StringVar()
    # 创建存储cookie的txt文件
    if not path.exists(temp_cookie):
        os.makedirs(temp_cookie)  # 创建文件
        with open(temp_cookie, 'w', encoding='utf-8') as f:
            f.write("")
    # 读取cookie
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()  # 读取cookie
    try:
        bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]
    except Exception as e:
        print(e)
    requests.packages.urllib3.disable_warnings()  # 隐藏一些警告
    session1 = requests.session()
    root.geometry('300x225')  # 创建指定尺寸的框
    root.title("cookie")
    thread_it(bz_login)
    btn1 = Button(root, width=10, text='注销登录', command=cancel_login)
    btn1.grid(row=3, column=2)
    label_ver2 = Label(root, textvariable=v1)
    label_ver2.grid(row=9, column=1, rowspan=8, columnspan=1, sticky='n')
    root.mainloop()

这是代码运行流程。

在这里插入图片描述
首先,这两行代码创建了一个Tkinter窗口(root)和一个用于存储和跟踪字符串值的变量(v1)。之后,可以使用root来添加和管理窗口中的组件,并使用v1来在这些组件之间共享或传递字符串值。


    # 创建存储cookie的txt文件
    if not path.exists(temp_cookie):
        os.makedirs(temp_cookie)  # 创建文件
        with open(temp_cookie, 'w', encoding='utf-8') as f:
            f.write("")
    # 读取cookie
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()  # 读取cookie

这段代码我熟,它是用来创建一个空的存储cookie的txt文件,然后每次进行读取txt中的cookie


在这里插入图片描述
我自己其实写代码的习惯不好,不会写捕获异常,防止代码崩溃。这点我后续可以好好学习一下。

requests.packages.urllib3.disable_warnings()  # 隐藏一些警告

这一行代码,可以隐藏一些警告,使得打印台的打印内容好看些。不会爆红。

在这里插入图片描述


session1 = requests.session()

在这里插入图片描述
这个session1对象可以被用来发送HTTP请求,并且会自动处理cookies和连接问题。

一旦你有了这个session1对象,你就可以使用它来发送各种HTTP请求,如GET、POST等

这一块内容,我之前没有涉及到。

因此我继续追问

在这里插入图片描述
怪不得这个项目代码中有那么多session1

在这里插入图片描述


登录函数

接下来我们看bz_login函数,这个函数非常重要。

这个函数将所有函数串在一起了。

首先就是加载一下你保存的cookie,判断是否登录,如果登录,就去验证状态,如果没有登录,就显示二维码,提示扫码登录,然后去验证状态。

# 主要的登录函数,先检查cookies是否有效,如果无效则调用scan_code函数进行登录。
def bz_login():
    """
    使用session1对象登录Bilibili,如果未登录则执行扫码登录和验证操作。

    Args:
        无
    Returns:
        无
    """
    global code_pic
    session1.cookies = LWPCookieJar(filename=temp_cookie)  # 用于保存和加载cookies。
    status = is_login(session1)  # 判断是否已经登录
    if not status:  # 没有登录
        scan_code(session1)  # 执行扫码登录
        verification()  # 验证
    else:  # 验证
        verification()

接着就是由bz_login函数中调用的函数,依次往上去找。

判断是否登录

首先就是is_login函数,使用baidu Comate的行间注释,可以得到下面每行的讲解。

# 检查当前session的cookies是否有效,如果有效则返回True,否则返回False。
def is_login(session):
    """
    判断是否已经登录

    Args:
        session: requests.Session对象,用于发送HTTP请求
    Returns:
        bool: 如果已经登录则返回True,否则返回False
    """
    try:
        # 尝试加载cookies,忽略丢弃的cookies
        session.cookies.load(ignore_discard=True)
    except Exception as e:
        # 如果加载失败,则打印异常信息
        print(e)

    # 发送HTTP请求获取登录状态信息
    login_url = session.get("https://api.bilibili.com/x/web-interface/nav", verify=False, headers=headers).json()
    # 判断登录状态
    if login_url['code'] == 0:
        # 如果登录状态码为0,则表示登录成功
        print(f"Cookies值有效, {login_url['data']['uname']}, 已登录!")
        return True
    else:
        # 如果登录状态码不为0,则表示登录失败
        print('Cookies值已经失效,请重新扫码登录!')
        return False
login_url = session.get("https://api.bilibili.com/x/web-interface/nav", verify=False, headers=headers).json()

在这里插入图片描述

实际操作过程中:我们进行扫码登录的时候,其会去对这个API调用请求

(https://api.bilibili.com/x/web-interface/nav)

在这里插入图片描述

在这里插入图片描述
可以看到login_url['data']['uname']就是你的用户名。

因此,你应该能懂这里的代码了吧。


登录二维码+保存cookie

接着,我们回到bz_login函数,继续往下看。这回就是没有登录的时候,进入scan_code函数。

首先,我们打开登录按钮,然后找到我标红的内容。

https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header
在这里插入图片描述

可以发现qrcode_key: “3827b5a4371498d0f7b5d7250030ce67”,这个就是我们下面这个登录需要的一个参数。

在这里插入图片描述

这个轮询二维码的意思,就是比如它每隔一段时间,就会在此发送这个请求。

因此这个函数的代码就比较好理解了。

    # 发送请求获取登录二维码信息
    get_login = session2.get('https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header',
                             headers=headers).json()
    # 获取二维码的key
    qrcode_key = get_login['data']['qrcode_key']

这个就是去获取我刚刚说的qrcode_key: “3827b5a4371498d0f7b5d7250030ce67”。

# 创建二维码对象
    qr = QRCode()
    # 设置二维码的数据
    qr.add_data(get_login['data']['url'])
    # 生成二维码图片
    img = qr.make_image()
    # 调整二维码图片大小
    pil_image_change = img.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
    # 将图片转换为Tkinter可以显示的格式
    code_pic = ImageTk.PhotoImage(pil_image_change)

这段代码就是将网页的二维码,重新通过qrcode的方式生成,方便你扫码登录。


下图是未登录的状态
在这里插入图片描述
下图是登录的状态,因此你有很多方式去判断是否登录。
在这里插入图片描述

    while 1:
        # 轮询二维码状态
        qrcode_data = session2.get(token_url, headers=headers).json()
        # 判断二维码状态
        if qrcode_data['data']['code'] == 0:
            # 扫码成功
            v1.set('扫码成功')
            # 使用session2获取登录成功后的页面信息
            session2.get(qrcode_data['data']['url'], headers=headers)
            break
        else:
            # 更新状态信息
            v1.set(qrcode_data['data']['message'])
        sleep(1)
        root.update()
    # 保存会话的cookie
    session2.cookies.save()

这段代码讲的就是我说的那个意思。

首先进入死循环,一直显示这个二维码,判断是否登录,并使用session2获取登录成功后的页面信息,方便后续将cookie进行保存。否则更新对应的状态。

    # 读取临时保存的cookie
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()
    # 从cookie中提取bili_jct的值
    bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]

这段代码就是用来提取一个重要的参数。
在这里插入图片描述


验证函数

最后,来到了verification函数,也就是验证函数。

经过逐行解释的代码如下:

# 验证登录状态,如果登录成功则显示用户头像,否则提示重新登录。
def verification():
    # 定义URL地址
    url = 'https://api.bilibili.com/x/web-interface/nav'
    # 发送GET请求并解析返回的JSON数据
    resp1 = session1.get(url=url, headers=headers).json()
    # 声明全局变量tk_image
    global tk_image
    # 判断返回的JSON数据中是否已登录
    if resp1['data']['isLogin']:
        # 获取用户头像的URL地址
        face_url = resp1['data']['face']
        # 发送GET请求获取头像图片的内容
        image_bytes = requests.get(face_url).content
        # 将字节流转换为BytesIO对象
        data_stream = BytesIO(image_bytes)
        # 打开图片并转换为PIL Image对象
        pil_image = Image.open(data_stream)
        # 调整图片大小为200x200,使用双三次插值算法进行缩放
        pil_image_change = pil_image.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
        # 将PIL Image对象转换为Tkinter可以显示的PhotoImage对象
        tk_image = ImageTk.PhotoImage(pil_image_change)
        # 设置状态信息为登录成功
        status = "cookie有效!登录成功!"
    else:
        # 如果未登录,则调用线程执行登录函数
        thread_it(bz_login)
        # 设置状态信息为重新登录
        status = 'cookie无效!重新登录'
    # 创建一个标签,并设置其显示的图片为tk_image
    label_ver = Label(root, image=tk_image)
    # 将标签放置在指定的网格位置
    label_ver.grid(row=1, column=1, rowspan=8, columnspan=1, sticky='n')
    # 设置状态变量的值为status
    v1.set(status)

首先就是你登陆后,会去请求这个网站,里面会有很多返回内容

https://api.bilibili.com/x/web-interface/nav

在这里插入图片描述
你需要的内容就可以通过json读取。包括是否登录,头像的网址等等等等。


注销登录

最后就是注销登录了。

在这里插入图片描述
这里大家可以自行去网站尝试一下,寻找一下注销的接口,返回的内容。


最后,这个项目大致上就讲完了。

这是经过Baidu Comate智能编码助手渲染过的代码哟。更适合非项目作者去了解这个项目。

import os.path
from time import sleep
from http.cookiejar import LWPCookieJar
import requests
from re import findall
from tkinter import StringVar, Tk, messagebox
from os import path
from io import BytesIO
from PIL import Image, ImageTk
from qrcode import QRCode
from tkinter.ttk import Button, Label
from threading import Thread
# TODO 这段代码只适用于bilibili
temp_cookie = 'bzcookies.txt'
headers = {
    # 'authority': 'api.vc.bilibili.com',
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'content-type': 'application/x-www-form-urlencoded',
    'origin': 'https://message.bilibili.com',
    'referer': 'https://message.bilibili.com/',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81',
}

# 检查当前session的cookies是否有效,如果有效则返回True,否则返回False。
def is_login(session):
    """
    判断是否已经登录

    Args:
        session: requests.Session对象,用于发送HTTP请求
    Returns:
        bool: 如果已经登录则返回True,否则返回False
    """
    try:
        # 尝试加载cookies,忽略丢弃的cookies
        session.cookies.load(ignore_discard=True)
    except Exception as e:
        # 如果加载失败,则打印异常信息
        print(e)

    # 发送HTTP请求获取登录状态信息
    login_url = session.get("https://api.bilibili.com/x/web-interface/nav", verify=False, headers=headers).json()
    # 判断登录状态
    if login_url['code'] == 0:
        # 如果登录状态码为0,则表示登录成功
        print(f"Cookies值有效, {login_url['data']['uname']}, 已登录!")
        return True
    else:
        # 如果登录状态码不为0,则表示登录失败
        print('Cookies值已经失效,请重新扫码登录!')
        return False

# 生成登录二维码并等待用户扫描,扫描成功后保存cookies。
def scan_code(session2):
    """
    生成登录二维码并轮询其状态,若二维码被扫描并验证通过,则保存会话的cookie并提取bili_jct的值。

    Args:
        session2 (requests.Session): 会话对象,用于发送HTTP请求。

    Returns:
        None: 此函数无返回值,直接操作全局变量bili_jct。

    """
    # 获取登录二维码
    global bili_jct
    # 发送请求获取登录二维码信息
    get_login = session2.get('https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header',
                             headers=headers).json()
    # 获取二维码的key
    qrcode_key = get_login['data']['qrcode_key']
    # 创建二维码对象
    qr = QRCode()
    # 设置二维码的数据
    qr.add_data(get_login['data']['url'])
    # 生成二维码图片
    img = qr.make_image()
    # 调整二维码图片大小
    pil_image_change = img.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
    # 将图片转换为Tkinter可以显示的格式
    code_pic = ImageTk.PhotoImage(pil_image_change)
    # 生成轮询二维码状态的URL
    token_url = f'https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main-fe-header'
    # 显示二维码图片
    label_ver1 = Label(root, image=code_pic)
    v1.set('等待扫码')
    label_ver1.grid(row=1, column=1, rowspan=8, columnspan=1, sticky='n')
    while 1:
        # 轮询二维码状态
        qrcode_data = session2.get(token_url, headers=headers).json()
        # 判断二维码状态
        if qrcode_data['data']['code'] == 0:
            # 扫码成功
            v1.set('扫码成功')
            # 使用session2获取登录成功后的页面信息
            session2.get(qrcode_data['data']['url'], headers=headers)
            break
        else:
            # 更新状态信息
            v1.set(qrcode_data['data']['message'])
        sleep(1)
        root.update()
    # 保存会话的cookie
    session2.cookies.save(filename=temp_cookie)
    # 读取临时保存的cookie
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()
    # 从cookie中提取bili_jct的值
    bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]

# 主要的登录函数,先检查cookies是否有效,如果无效则调用scan_code函数进行登录。
def bz_login():
    """
    使用session1对象登录Bilibili,如果未登录则执行扫码登录和验证操作。

    Args:
        无
    Returns:
        无
    """
    global code_pic
    session1.cookies = LWPCookieJar(filename=temp_cookie)  # 用于保存和加载cookies。
    status = is_login(session1)  # 判断是否已经登录
    if not status:  # 没有登录
        scan_code(session1)  # 执行扫码登录
        verification()  # 验证
    else:  # 验证
        verification()

# 验证登录状态,如果登录成功则显示用户头像,否则提示重新登录。
def verification():
    # 定义URL地址
    url = 'https://api.bilibili.com/x/web-interface/nav'
    # 发送GET请求并解析返回的JSON数据
    resp1 = session1.get(url=url, headers=headers).json()
    # 声明全局变量tk_image
    global tk_image
    # 判断返回的JSON数据中是否已登录
    if resp1['data']['isLogin']:
        # 获取用户头像的URL地址
        face_url = resp1['data']['face']
        # 发送GET请求获取头像图片的内容
        image_bytes = requests.get(face_url).content
        # 将字节流转换为BytesIO对象
        data_stream = BytesIO(image_bytes)
        # 打开图片并转换为PIL Image对象
        pil_image = Image.open(data_stream)
        # 调整图片大小为200x200,使用双三次插值算法进行缩放
        pil_image_change = pil_image.resize((200, 200), resample=Image.BICUBIC, box=None, reducing_gap=None)
        # 将PIL Image对象转换为Tkinter可以显示的PhotoImage对象
        tk_image = ImageTk.PhotoImage(pil_image_change)
        # 设置状态信息为登录成功
        status = "cookie有效!登录成功!"
    else:
        # 如果未登录,则调用线程执行登录函数
        thread_it(bz_login)
        # 设置状态信息为重新登录
        status = 'cookie无效!重新登录'
    # 创建一个标签,并设置其显示的图片为tk_image
    label_ver = Label(root, image=tk_image)
    # 将标签放置在指定的网格位置
    label_ver.grid(row=1, column=1, rowspan=8, columnspan=1, sticky='n')
    # 设置状态变量的值为status
    v1.set(status)

# 创建一个新的线程来执行指定的函数。
def thread_it(func, *args):
    thread = Thread(target=func, args=args, daemon=True)
    thread.start()

# 注销登录,并调用verification函数更新状态。
def cancel_login():
    # 弹出提示框询问用户是否注销登录
    msg1 = messagebox.askyesno(title="提示", message="注销后cookie将失效,是否注销登录?")
    if msg1:
        # 如果用户选择注销登录
        # 定义注销登录的URL地址
        url3 = 'https://passport.bilibili.com/login/exit/v2'
        # 构建注销登录的请求数据
        data3 = {'biliCSRF': f'{bili_jct}'}
        # 发送POST请求进行注销登录操作,并获取返回的JSON数据
        session1.post(url=url3, headers=headers, data=data3).json()
        # 调用verification函数进行登录状态验证
        verification()
if __name__ == '__main__':
    root = Tk()
    v1 = StringVar()
    # 创建存储cookie的txt文件
    if not path.exists(temp_cookie):
        os.makedirs(temp_cookie)  # 创建文件
        with open(temp_cookie, 'w', encoding='utf-8') as f:
            f.write("")
    # 读取cookie
    with open(temp_cookie, 'r', encoding='utf-8') as f:
        bzcookie = f.read()  # 读取cookie
    try:
        bili_jct = findall(r'bili_jct=(.*?);', bzcookie)[0]
    except Exception as e:
        print(e)
    requests.packages.urllib3.disable_warnings()  # 隐藏一些警告
    session1 = requests.session()
    root.geometry('300x225')  # 创建指定尺寸的框
    root.title("cookie")
    thread_it(bz_login)
    btn1 = Button(root, width=10, text='注销登录', command=cancel_login)
    btn1.grid(row=3, column=2)
    label_ver2 = Label(root, textvariable=v1)
    label_ver2.grid(row=9, column=1, rowspan=8, columnspan=1, sticky='n')
    root.mainloop()

我使用Baidu Comate智能编码助手生成了一个流程图。
在这里插入图片描述
这个流程图还是很清楚的讲述了这个项目做的事情的。

使用后的一些感悟

好用的地方

在这里插入图片描述
它可以帮助你写函数的注释,也就是下面这个。

    """
    使用session1对象登录Bilibili,如果未登录则执行扫码登录和验证操作。

    Args:
        无

    Returns:
        无

    """

一般好的项目,方便你理解,或多或少都会有英文写的这个。因此这一个功能简直太酷了,你几乎不需要费力,就能自动帮你生成。


点击行间注释,它会每一行给你解释这一行在做什么。

在这里插入图片描述
这一点也很棒,有了这个,你可以一行一行看。

要是能够将这个结果和项目中对应的这个片段进行一键替换,那就更好了。

因此你可以这样操作:

百度Comate助手


在这里插入图片描述
你也可以生成单元测试,目前对我来说,暂时还用不到,但是有总比没有强。以后或许能用到。

可以改进的地方

  1. 建议官方可以添加一个复制一个问题答案的全部内容的按钮,否则需要用鼠标选中全部内容,然后复制,但是会没有相应markdown格式。
    在这里插入图片描述
  2. 希望官方能够添加一个换行的快捷键,比如shift+Enter,不然有时候看着不太舒服。(即使它知道要在哪里进行换行)
    在这里插入图片描述

结束语

作为第一次在pycharm中安装代码助手,Baidu Comate智能编码助手总体体验下来,还是很不错的,尤其是能够帮助你逐行解释,然后给你生成函数注释,懒人福音。

👉Baidu Comate体验地址:https://comate.baidu.com/zh

快来使用吧,提高写代码的效率。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

knighthood2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值