You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于KeyAuth的Python TKinter登录密钥验证功能故障求助

问题分析与修复方案

你的KeyAuth密钥验证功能失效主要是以下几个核心问题导致的,逐一解决后就能正常工作:

1. KeyAuth API核心参数未配置

初始化keyauthapp时,name、ownerid、secret是空字符串,这些是连接KeyAuth后台的必备参数,必须从你的KeyAuth应用后台复制对应值填入:

keyauthapp = api(
    name = "你的应用名称",  # 从KeyAuth后台复制
    ownerid = "你的OwnerID",  # 从KeyAuth后台复制
    secret = "你的应用Secret",  # 从KeyAuth后台复制
    version = "1.0",
    hash_to_check = getchecksum()
)

2. 过早获取用户订阅信息

你在窗口启动前就调用keyauthapp.user_data.subscriptions,此时用户还未登录,user_data为空,会直接触发报错。把这段代码移到check_license函数内,仅在验证成功后执行:

def check_license():
    key = entry_1.get().strip()  # 去除输入前后空格,避免无效输入
    if not key:
        messagebox.showwarning("提示", "请输入密钥")
        return
    if keyauthapp.license(key):
        messagebox.showinfo("Успешная активация ключа", "Ключ активирован успешно.")
        # 登录成功后再获取订阅信息
        subs = keyauthapp.user_data.subscriptions
        for sub in subs:
            expiry = datetime.utcfromtimestamp(int(sub["expiry"])).strftime('%Y-%m-%d %H:%M:%S')
            print(f"Подписка Истекает: {expiry}. Приятного использования!")
    else:
        # 打印具体错误信息,方便排查问题
        print(f"KeyAuth错误详情: {keyauthapp.response}")
        messagebox.showerror("Ошибка активации ключа", f"验证失败: {keyauthapp.response}")

3. 校验和函数逻辑错误

getchecksum里用''.join(sys.argv)会把所有命令行参数拼接成字符串,导致打开错误的文件。应该用sys.argv[0]获取当前脚本的路径:

def getchecksum():
    md5_hash = hashlib.md5()
    script_path = sys.argv[0]
    with open(script_path, "rb") as file:
        md5_hash.update(file.read())
    digest = md5_hash.hexdigest()
    return digest

4. 清理冗余代码

你的代码重复导入了os和time,直接删除重复的导入语句即可。


修复后的完整代码

from pathlib import Path
from tkinter import *
from tkinter import messagebox
from keyauth import api
import sys
import hashlib
from datetime import datetime


OUTPUT_PATH = Path(__file__).parent
ASSETS_PATH = OUTPUT_PATH / Path(r"C:\Users\Razy\Desktop\KeyAuth-Python-Example-main\build\assets\frame0")


def relative_to_assets(path: str) -> Path:
    return ASSETS_PATH / Path(path)


window = Tk()
window.geometry("700x350")
window.configure(bg = "#121212")

def minimize_window():
    window.iconify()

def close_app():
    window.destroy()

canvas = Canvas(
    window,
    bg = "#121212",
    height = 350,
    width = 700,
    bd = 0,
    highlightthickness = 0,
    relief = "ridge"
)
canvas.place(x = 0, y = 0)

entry_image_1 = PhotoImage(file=relative_to_assets("entry_1.png"))
entry_bg_1 = canvas.create_image(350.0, 179.0, image=entry_image_1)
entry_1 = Entry(bd=0, bg="#9F9F9F", fg="#000716", highlightthickness=0)
entry_1.place(x=260.0, y=165.0, width=180.0, height=26.0)

canvas.create_rectangle(271.0, 200.0, 428.0, 201.0, fill="#3E3E3E", outline="")
canvas.create_text(291.0, 139.0, anchor="nw", text="Enter your key here", fill="#FFFFFF", font=("SedgwickAveDisplay Regular", 14 * -1))

exit_button = PhotoImage(file=relative_to_assets("exit.png"))
ext = Button(image=exit_button, borderwidth=0, highlightthickness=0, command=close_app, relief="flat")
ext.place(x=676.0, y=12.0, width=10.0, height=10.0)

min_button = PhotoImage(file=relative_to_assets("min.png"))
min_btn = Button(image=min_button, borderwidth=0, highlightthickness=0, command=minimize_window, relief="flat")
min_btn.place(x=658.0, y=12.0, width=10.0, height=10.0)

canvas.create_text(19.0, 12.0, anchor="nw", text="GTA 5 RP BOTS", fill="#9F9F9F", font=("SedgwickAveDisplay Regular", 10 * -1))

def getchecksum():
    md5_hash = hashlib.md5()
    script_path = sys.argv[0]
    with open(script_path, "rb") as file:
        md5_hash.update(file.read())
    digest = md5_hash.hexdigest()
    return digest

# 替换为你KeyAuth后台的实际参数
keyauthapp = api(
    name = "你的应用名称",
    ownerid = "你的OwnerID",
    secret = "你的应用Secret",
    version = "1.0",
    hash_to_check = getchecksum()
)

def check_license():
    key = entry_1.get().strip()
    if not key:
        messagebox.showwarning("提示", "请输入密钥")
        return
    if keyauthapp.license(key):
        messagebox.showinfo("Успешная активация ключа", "Ключ активирован успешно.")
        subs = keyauthapp.user_data.subscriptions
        for sub in subs:
            expiry = datetime.utcfromtimestamp(int(sub["expiry"])).strftime('%Y-%m-%d %H:%M:%S')
            print(f"Подписка Истекает: {expiry}. Приятного использования!")
    else:
        print(f"KeyAuth错误详情: {keyauthapp.response}")
        messagebox.showerror("Ошибка активации ключа", f"验证失败: {keyauthapp.response}")

log_button = PhotoImage(file=relative_to_assets("login.png"))
login_b = Button(image=log_button, borderwidth=0, highlightthickness=0, command=check_license, relief="flat")
login_b.place(x=250.0, y=209.0, width=80.0, height=24.0)

buy_btn = PhotoImage(file=relative_to_assets("buy.png"))
buy = Button(image=buy_btn, borderwidth=0, highlightthickness=0, command=lambda: print("button_4 clicked"), relief="flat")
buy.place(x=370.0, y=209.0, width=80.0, height=24.0)

window.resizable(False, False)
window.mainloop()

内容的提问来源于stack exchange,提问作者quxro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:14:53