您当前的位置:首页 > 计算机 > 编程开发 > Python

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

时间:04-26来源:作者:点击数:

顾名思义就是获取cookie的

通过扫码登录的方式,通过LWPCookieJar模块,可以获取各大网站的cookie信息,并将其保存到指定的cookie文件中, 后续使用可以直接加载cookie文件,无需二次登录。

注意:切勿将保存的cookie文件随意泄露给他人,以免出现不可控因素。

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()

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门