import pprint
import time
import qrcode
import requests


class Login:
    """
    B站登录账号\n
    保存登录cookie
    """
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"
    }

    def __init__(self):
        self.cookie, self.csrf = self.run()

    @staticmethod
    def get_qrcode_info():
        """获取二维码关键信息"""
        url_get_qrcode_key = "https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header&go_url=https:%2F%2Fwww.bilibili.com%2F&web_location=333.1007"
        res = requests.get(url=url_get_qrcode_key, headers=Login.headers).json()
        # print(res)
        qrcode_key = res["data"]["qrcode_key"]
        qrcode_url = res["data"]["url"]
        return qrcode_key, qrcode_url

    @staticmethod
    def make_qrcode_img(qrcode_url):
        """制作获取二维码图片"""
        im = qrcode.make(data=qrcode_url)
        im.save("login_code.png")
        im.show()

    def get_cookie(self, qrcode_key):
        """根据二维码扫描情况获取cookie"""
        url_scan_code = f"https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main-fe-header&web_location=333.1007"
        cookie_data = []
        n = 1
        while True:
            time.sleep(5)
            response = requests.get(url=url_scan_code, headers=Login.headers)
            res = response.json()
            # pprint.pprint(res)
            code = res["data"]["code"]
            msg = res["data"]["message"]

            if code == 86038:
                print(n, msg)
                n += 1
            if code == 86101:
                print(n, msg)
                n += 1
            if code == 86090:
                print(n, msg)
                n += 1
            if code == 0:
                cookie = response.cookies.get_dict()
                print(n, "二维码已扫码确认,cookie:", cookie)
                cookie_data.append(cookie)
                break

        cookie_text = cookie_data[0]
        csrf = cookie_text["bili_jct"]
        cookie = self.cookie_into_header(cookie_text)
        return cookie, csrf

    @staticmethod
    def cookie_into_header(cookie):
        cookie_in_header = str(cookie).replace("{", "").replace("}", "").replace(",", ";").replace(":", "=").replace('"', '').replace("'", "").replace(" ", "")
        # print("cookie:", cookie_in_header)
        return cookie_in_header

    @staticmethod
    def save_cookie(cookie):
        with open("login_cookie.txt", mode="w", encoding="utf-8") as f:
            f.write(cookie)

    def run(self):
        qrcode_key, qrcode_url = self.get_qrcode_info()
        self.make_qrcode_img(qrcode_url)
        cookie, csrf = self.get_cookie(qrcode_key)
        self.save_cookie(cookie)

        return cookie, csrf


def main():
    user = Login()
    cookie = user.cookie
    csrf = user.csrf
    print("cookie:", cookie)
    print("csrf:", csrf)


if __name__ == '__main__':
    main()
    pass


#
#
#
# 1. 获取二维码关键信息:get_qrcode_info() "https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header&go_url=https:%2F%2Fwww.bilibili.com%2F&web_location=333.1007"
# 2. 制作获取二维码图片 get_qrcode_img(qrcode_url)
# 3. 根据二维码扫描情况获取cookie get_cookie(qrcode_key) :f"https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main-fe-header&web_location=333.1007"
# 4. 保存cookie save_cookie(cookie)
#

更多推荐