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

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

文章目录

  • 前言
  • 具体实现过程
    • 项目总览
    • 从代码运行流程入手
      • 登录函数
      • 判断是否登录
      • 登录二维码+保存cookie
      • 验证函数
      • 注销登录
  • 使用后的一些感悟
    • 好用的地方
    • 可以改进的地方
  • 结束语

前言

我在某个论坛中,看到一个很有实战意义的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智能编码助手,帮我更好的理解这段代码吧。
在这里插入图片描述

具体实现过程

首先打开你的项目文件,然后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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599003.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

O2OA(翱途)支持高斯_openGauss,瀚高_HighGo,磐维_panweidb等各种国产postgres分支数据库接入

O2OA(翱途)作为一款企业级应用平台,其支持多种数据库系统是其灵活性和可扩展性的重要体现。从MySQL、Oracle到国产的达梦、神州等数据库,再到对PostgreSQL的原生支持,O2OA展现了其对不同数据库环境的良好适应性。特别地…

LeetCode 难题解析 —— 正则表达式匹配 (动态规划)

10. 正则表达式匹配 思路解析 这道题虽然看起来不难理解,但却存在多种可能,当然这种可能的数量是有限的,且其规律对于每一次判别都使用,所以自然而然就想到用 动态规划 的方法啦 接下来逐步分析可能的情况: &#x…

stm32f103zet6_DAC_2_输出电压

实现效果 DAC输出的电压 同过电压表测量电压 1.DAC配置的步骤 初始化DAC时钟。配置DAC的GPIO端口。设置DAC的工作模式(例如,是否使用触发功能,是否启用DAC中断等)。启动DAC。 2常用的函数 函数 HAL_DAC_Start() - 开启指定…

企业终端安全管理软件有哪些?终端安全管理软件哪个好?

终端安全的重要性大家众所周知,关系到生死存亡的东西。 各类终端安全管理软件应运而生,为企业提供全方位、多层次的终端防护。 有哪些企业终端安全管理软件? 一、主流企业终端安全管理软件 1. 域智盾 域智盾是一款专为企业打造的全面终端…

淘宝商品搜索API:关键字搜索返回值详解与利用

在当今电子商务蓬勃发展的时代,淘宝作为中国最大的在线购物平台之一,拥有海量的商品信息和用户数据。为了更好地满足商家和开发者的需求,淘宝提供了商品搜索API,允许通过关键字搜索来获取商品信息。本文将详细解析淘宝商品搜索API…

LeetCode 每日一题 Day 144-157

2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟,感染 将会从值为 start 的节点开始爆发。 每分钟,如果节点满足以下全部条件,就会被感染&#xf…

抖音小店怎么快速出体验分?分享三种不花一分钱,就能出分的技巧

哈喽~我是电商月月 才做抖音小店,新开的店铺是没有体验分的 没有体验分就没法用猜你喜欢和搜索流量,也没法持续做精选联盟,没体验分店铺就不好出单 于是很多朋友就去网上选择找S分机构,想快速出体验分,但这种方式我…

学习软考----数据库系统工程师24

关系数据库设计基础知识 函数依赖 码 多值依赖 性质

Semi-decentralized Federated Ego Graph Learning for Recommendation

论文概况 本文是2023年WWW的一篇联邦推荐论文,提出了一个半去中心化的联合自我图学习框架。 Introduction 作者提出问题 现有的推荐方法收集所有用户的自我图来组成一个全局图,导致隐私风险。联合推荐系统已被提出来缓解隐私问题,但在客户…

TXT文本高效批量编辑,支持批量将每个单号间的空白行进行删除掉,文本内容管理更方便

TXT文本是一种常用的存储快递单号的数据格式。然而,当TXT文本中存在大量的空白行时,不仅浪费了存储空间,还可能导致批量编辑和查询变得低效。为了解决这一问题,我们推出了高效的TXT文本批量编辑功能,支持批量删除单号间…

EOCR-ELR-30RM7Q电机保护器 施耐德韩国三和

EOCR-ELR-30RM7Q电机保护器 施耐德韩国三和 基于MCU(微处理器)的密集型设计 精确的接地故障保护功能 电力系统和电动机的接地故障保护 零序电流互感器监测接地故障 电流和故障延时单独设定 LED显示电源输入和运行状态 嵌入式安装 EOCR主要产品有电子式电动机保护继电器&#xf…

redis分片java实践、redis哨兵机制实现、redis集群搭建

redis分片java实践 linux安装redishttps://mp.csdn.net/mp_blog/creation/editor/134864302复制redis.conf配置文件成redis1.conf、redis2.conf、redis3.conf 修改redis的端口信息和存pid文件的路径。存pid文件的路径只要不同就行了,没什么特别要求。 指定配置文件…

记录汇川:电磁阀封装

二位电磁阀封装: 中封三位电磁阀封装: HMI:

5.6代码

1.最大公约数 这个题最重要的是要找到一个区间是1&#xff0c;找到之后就可以直接加次数就可以了 #include <bits/stdc.h>using namespace std;main() {long long n,i,j,a0,b,ans99999;cin>>n;long long s[n],dp[n][n];for(i0;i<n;i){cin>>s[i];if(s[i]1…

小程序预览或上传代码时,遇到app.json未找到某个wxml文件的解决方法

uniapp小程序&#xff0c;点击预览或者是上传代码&#xff0c;遇到app.json无法找到某个wxml文件的解决方法&#xff1a;清缓存 问题&#xff1a; message&#xff1a;Error: app.json: 未找到 ["subPackages"][3]["pages"][3] 对应的 subPackages4/pages/…

央国企加速新质生产力形成和发展,HR数字化工具如何推动创新内核构建?

自今年两会以来&#xff0c;“新质生产力”一词获得了广泛的关注。众多专家学者对其重要性、定义及作用进行了热烈且深入的讨论&#xff0c;一致强调了新质生产力的核心地位。对于那些致力于转型为现代化国有企业的国资中央企业而言&#xff0c;培育新质生产力无疑成为了当前及…

充电宝哪个牌子好?比较好用充电宝牌子,这些品牌别错过

作为一个资深的手机控&#xff0c;深知手机对于现代人的重要性。从早到晚&#xff0c;无论是点外卖、看剧还是处理各种事务&#xff0c;手机几乎成了我生活的必需品。然而&#xff0c;手机电量的问题总是让人头疼。在家时&#xff0c;找个插座充电自然不成问题&#xff0c;但出…

论文查重率高,有什么办法降重吗?推荐几个ai降重工具

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

论文查重率高,有什么办法降重吗?推荐笔灵AI

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…
最新文章