4399全自动登陆取cookie

import execjs
import requests
import ddddocr
import re
import time
import threading


def get_img(username, password):
    url = "http://ptlogin.4399.com/ptlogin/loginFrame.do?postLoginHandler=default&redirectUrl=&displayMode=popup&css=&appId=www_home&gameId=&username=qazx86523553&externalLogin=qq&password=&mainDivId=popup_login_div&autoLogin=false&includeFcmInfo=false&qrLogin=true&userNameLabel=4399%E7%94%A8%E6%88%B7%E5%90%8D&userNameTip=%E8%AF%B7%E8%BE%93%E5%85%A54399%E7%94%A8%E6%88%B7%E5%90%8D&welcomeTip=%E6%AC%A2%E8%BF%8E%E5%9B%9E%E5%88%B04399&level=0&regLevel=4&v=1701267999248"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
    }
    res = requests.post(url, headers=headers)
    ls = []
    ls.extend(re.findall(r'sessionId" value="(.*?)" />', res.content.decode()))
    sessionid = ls[0]
    img_url = "https://ptlogin.4399.com/ptlogin/captcha.do?captchaId=" + str(sessionid)
    headers = {
        "Accept": "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
        "Connection": "keep-alive",
        "Cookie": '_4399stats_vid=1682246116137431; Qnick=; _gprp_c=""; Hm_lvt_334aca66d28b3b338a76075366b2b9e8=1689257991; index4399skin=0; _4399tongji_vid=168925817866036; ptusertype=huodong.4399_login; Puser=1104026885; Pnick=%E8%81%BF%E8%81%BF%EF%BC%8D; USESSIONID=7ac8d01b-875c-4866-bc9f-892615aa7335; phlogact=l13014',
        "Host": "ptlogin.4399.com",
        "Referer": "http://ptlogin.4399.com/ptlogin/loginFrame.do?postLoginHandler=refreshParent&redirectUrl=&displayMode=popup&css=&bizId=&appId=huodong&gameId=&username=1104026885&externalLogin=qq&password=&mainDivId=popup_login_div&autoLogin=true&includeFcmInfo=false&qrLogin=false&userNameLabel=4399%E7%94%A8%E6%88%B7%E5%90%8D&userNameTip=%E8%AF%B7%E8%BE%93%E5%85%A54399%E7%94%A8%E6%88%B7%E5%90%8D&welcomeTip=%E6%AC%A2%E8%BF%8E%E5%9B%9E%E5%88%B04399&level=0&regLevel=0&v=1692147013751",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203",
    }
    img_res = requests.post(img_url, headers=headers).content
    ocr = ddddocr.DdddOcr()
    checkcode = ocr.classification(img_res)
    print("识别出的验证码为:" + checkcode)
    url = "https://ptlogin.4399.com/ptlogin/login.do?v=1"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
    }
    data = {
        "loginFrom": "uframe",
        "postLoginHandler": "default",
        "layoutSelfAdapting": "true",
        "externalLogin": "qq",
        "displayMode": "popup",
        "layout": "vertical",
        "bizId": "",
        "appId": "www_home",
        "gameId": "",
        "css": "",
        "redirectUrl": "",
        "sessionId": "",
        "mainDivId": "popup_login_div",
        "includeFcmInfo": "false",
        "level": "0",
        "regLevel": "4",
        "userNameLabel": "4399用户名",
        "userNameTip": "请输入4399用户名",
        "welcomeTip": "欢迎回到4399",
        "sec": "1",
        "password": password,
        "username": username,
        "autoLogin": "on",
        "inputCaptcha": checkcode,
        "sessionId": sessionid,
    }
    res = requests.post(url, data=data, headers=headers)
    cookies = res.cookies
    flag1 = False
    for cookie in cookies:
        if cookie.name == "ck_accname":
            flag1 = True
    if flag1 == True:
        print("登陆成功!" + "\n取回cookie:")
        ck = ""
        for cookie in cookies:
            ck += cookie.name + ":" + cookie.value
        return ck
    else:
        print("登录失败,触发图片验证码验证登陆模式!")
        return get_img(username, password)


def _4399login(username_, password_):
    f = open(r"D:\python项目\requests相关\4399login\aes.js")
    js = f.read()
    f.close()
    ctx = execjs.compile(js)
    username = str(username_)
    password = ctx.call("encryptAES", str(password_))
    print(password)

    url1 = "https://ptlogin.4399.com/ptlogin/login.do?v=1"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
    }
    data = {
        "loginFrom": "uframe",
        "postLoginHandler": "default",
        "layoutSelfAdapting": "true",
        "externalLogin": "qq",
        "displayMode": "popup",
        "layout": "vertical",
        "bizId": "",
        "appId": "www_home",
        "gameId": "",
        "css": "",
        "redirectUrl": "",
        "sessionId": "",
        "mainDivId": "popup_login_div",
        "includeFcmInfo": "false",
        "level": "0",
        "regLevel": "4",
        "userNameLabel": "4399用户名",
        "userNameTip": "请输入4399用户名",
        "welcomeTip": "欢迎回到4399",
        "sec": "1",
        "password": password,
        "username": username,
        "autoLogin": "on",
    }
    res = requests.post(url1, data=data, headers=headers)
    cookies = res.cookies
    flag = False
    for cookie in cookies:
        if cookie.name == "ck_accname":
            flag = True
    if flag == True:
        print("登陆成功!" + "\n取回cookie:")
        ck = ""
        for cookie in cookies:
            ck += cookie.name + ":" + cookie.value
        return ck
    else:
        print("登录失败,触发图片验证码验证登陆模式!")
        return get_img(username, password)


def thread_(uid, psd):
    ck = _4399login(uid, psd)
    print(ck)
    cookie.append(ck)


if __name__ == "__main__":
    t1 = time.time()
    f = open(r"D:\seer\赛尔脱机\NL_SDK\非DLL项目\4399main\2022-06-11.txt")
    data = f.read().split("\n")
    accounts = []
    cookie = []
    for i in data:
        de = {}
        de["username"] = i.split("=")[0]
        de["password"] = i.split("=")[1]
        accounts.append(de)
    threads = []
    for account in accounts:
        thread = threading.Thread(
            target=thread_, args=(account["username"], account["password"])
        )
        threads.append(thread)
    for thread in threads:
        thread.start()
        time.sleep(0.1)
    for thread in threads:
        thread.join()

    fi = open(r"D:\seer\赛尔脱机\NL_SDK\非DLL项目\4399main\2023-11-30_cookies.txt", "w")
    for k in cookie:
        fi.write(k + "\n")
    f.close()
    fi.close()
    t2 = time.time()
    worktime = t2 - t1
    print(f"取回完成!用时{worktime}秒")