python获取cookie源码,适合大部分网站

顾名思义就是获取cookie的
通过扫码登录的方式,通过LWPCookieJar模块,可以获取各大网站的cookie信息,并将其保存到指定的cookie文件中, 后续使用可以直接加载cookie文件,无需二次登录。
注意:切勿将保存的cookie文件随意泄露给他人,以免出现不可控因素。

  • 登录功能: 当用户打开程序时,程序会尝试读取存储在本地的cookie文件以检查用户是否已登录。
    如果检测到用户未登录,程序将生成一个二维码,并在GUI界面中显示该二维码,提示用户使用Bilibili手机客户端扫描二维码进行登录。
    一旦用户成功扫描二维码登录,程序将显示用户的个人资料图片,并在界面上显示登录成功的提示信息。 注销功能:
    用户可以点击GUI界面上的“注销登录”按钮,以注销当前登录的账户。 注销操作将导致用户的登录状态失效,需要重新登录。 辅助功能:
    代码中使用了多线程来处理登录和注销操作,以确保界面的流畅性和响应性。 使用了PIL库来处理图像,生成和显示二维码以及用户的个人资料图片。
    使用了requests库来发送HTTP请求与Bilibili的认证系统进行交互,并处理用户登录状态的验证和注销操作。
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
 
 
temp_cookie = './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):
        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()
    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()
  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逆风微笑的大雪生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值