基于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
相关产品推荐
相关产品推荐

