夜雨聆风学习资料网

ARTICLE · 1058223

《Python通用注册机授权工具:源码注入、打包、签发,全自动一条龙完成》

《Python通用注册机授权工具:源码注入、打包、签发,全自动一条龙完成》

“带你横跨办公自动化的数据江海”

@摸鱼

前言

关于摸鱼

(

ABOUT MOYU

)

闻道有先后,术业有专攻。

各位大佬朋友们好!

~我依旧是你们的老朋友摸鱼~

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了150多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼。

好了,多了不说,少了不唠,今天给大佬们分享一款【Python 通用注册机授权工具】。做 Python 项目交付的朋友应该深有体会——程序写完了要发给客户,怎么防止被随意传播、被白嫖,是个绕不开的问题。手动加授权代码吧,容易漏、容易写错,打包成 exe 之后还可能被 PyInstaller 优化掉;用现成的方案吧,要么只支持在线验证、断网就废,要么客户换块硬盘机器码就变、授权码当场失效,实在头疼。这款工具真正做到一键注入、自动打包、精准签发,让 Python 程序的授权交付变得前所未有地轻松。

《该办公工具成品展示:》

《该办公工具的演示视频:》

关注
重播 分享 赞

《该办公工具核心功能亮点:》

01

 亮点一:源码注入 + 打包 + 签发,一条命令串完⭐⭐⭐

        • 不用手写授权代码,不用手动配环境,从源码到可交付 exe 一条命令。

        02

         亮点二:机器码绑定 + 换硬件不重发码🔴

            • 这是很多同类方案没有的——机器码稳定 + 换机可迁移,既防漂移又不断客户。

            03

            亮点三:Ed25519 签名授权码,客户端只内置公钥⚡

            • 翻看客户端代码也无法伪造授权码;签名验证在客户端本地完成,不依赖网络。

            《该办公工具代码展示:》

            下面,我就奉上python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"

            from __future__ import annotationsfrom PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFontfrom PyQt6.QtWidgets import (    QApplication,    QDialog,    QFrame,    QHBoxLayout,    QLabel,    QLineEdit,    QMessageBox,    QPushButton,    QVBoxLayout,    QWidget,)from ..config import AUTH_PRODUCT, AUTH_VERSION, AUTHOR_CONTACTfrom . import codes, storagefrom .keys import get_public_keyfrom .machine import get_machine_code_strdef show_auth_dialog() -> bool:    """弹出授权对话框,返回是否验证通过。"""    return _show_qt_dialog()def _status() -> tuple[str, str]:    """返回 (状态文案, 颜色)。试用中=绿色,已过期=红色。"""    remaining = storage.get_trial_remaining_days()    if remaining is None:        return "", ""    if remaining > 0:        return f"试用中 · 剩余 {remaining} 天", "#27ae60"    return "试用已结束,请输入授权码", "#e74c3c"def _verify(auth_code: str) -> tuple[bool, str]:    if not auth_code.strip():        return False, "请输入授权码。"    try:        codes.validate_for_machine(            auth_code.strip(), get_public_key(), get_machine_code_str()        )        return True, "授权成功!"    except ValueError as exc:        return False, str(exc)def _show_qt_dialog() -> bool:    result = {"authorized": False}    machine_code = get_machine_code_str()    trial_text, trial_color = _status()    ACCENT = "#2d8cf0"    # 顶层窗口:带 parent=None 时若已有 QApplication 会挂到它上;否则需要自建 app。    app = QApplication.instance()    owns_app = app is None    if owns_app:        import sys as _sys        app = QApplication(_sys.argv)    window = QDialog()    window.setWindowTitle("程序授权")    window.setFixedSize(600, 640)    window.setModal(True)    # 置顶 + 抢焦点(与 Tk 版 -topmost + focus_force + grab_set 对齐)    window.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint, True)    window.activateWindow()    window.raise_()    # ============ 主题样式(来自 b.py)============    window.setStyleSheet("""        QWidget {            background: #f5f7fa;            font-family: "Microsoft YaHei", "PingFang SC", sans-serif;            font-size: 13px;            color: #333;        }        QLabel { background: transparent; }        QLineEdit {            border: 1px solid #d0d7de;            border-radius: 6px;            padding: 6px 10px;            background: white;            font-size: 14px;        }        QLineEdit:focus {            border: 1px solid #2d8cf0;        }        QPushButton {            background: #2d8cf0;            color: white;            border: none;            border-radius: 6px;            padding: 8px 16px;        }        QPushButton:hover { background: #1c7ed6; }        QPushButton:disabled { background: #b0b0b0; }    """)    root = QVBoxLayout(window)    root.setContentsMargins(0, 0, 0, 0)    root.setSpacing(0)    # 顶部品牌栏    head = QFrame()    head.setStyleSheet(f"background-color: {ACCENT};")    head.setFixedHeight(96)    head_lay = QVBoxLayout(head)    head_lay.setContentsMargins(0, 16, 0, 12)    head_lay.setSpacing(2)    title = QLabel("🔒  软件授权验证")    tf = QFont("Microsoft YaHei", 16)    tf.setBold(True)    title.setFont(tf)    title.setStyleSheet("color: #ffffff; background: transparent;")    title.setAlignment(Qt.AlignmentFlag.AlignCenter)    head_lay.addWidget(title)    # subtitle = QLabel(f"{AUTH_PRODUCT}  ·  v{AUTH_VERSION}")    # subtitle.setStyleSheet("color: #bdc3c7; background: transparent;")    # subtitle.setAlignment(Qt.AlignmentFlag.AlignCenter)    # head_lay.addWidget(subtitle)    root.addWidget(head)    # 主体区    body = QWidget()    body_lay = QVBoxLayout(body)    body_lay.setContentsMargins(20, 16, 20, 16)    body_lay.setSpacing(12)    root.addWidget(body, 1)    # ---- 机器码卡片 ----    mc_card = QFrame()    mc_card.setStyleSheet(        "QFrame { background-color: #ffffff; border: 1px solid #e0e0e0; "        "border-radius: 10px; }"        "QLabel { background: transparent; }"    )    mc_lay = QVBoxLayout(mc_card)    mc_lay.setContentsMargins(14, 12, 14, 12)    mc_lay.setSpacing(4)    mc_title = QLabel("您的机器码")    mcf = QFont("Microsoft YaHei", 12)    mcf.setBold(True)    mc_title.setFont(mcf)    mc_title.setStyleSheet(f"color: {ACCENT}; background: transparent;")    mc_lay.addWidget(mc_title)    mc_hint = QLabel("请把机器码发给作者,换取授权码后粘贴到下方。")    mc_hint.setStyleSheet("color: #7f8c8d; background: transparent;")    mc_lay.addWidget(mc_hint)    mc_row = QHBoxLayout()    mc_row.setContentsMargins(0, 6, 0, 0)    mc_value = QLabel(machine_code)    mc_value.setFont(QFont("Consolas", 15, weight=QFont.Weight.Bold))    mc_value.setStyleSheet("color: #2c3e50; background: transparent;")    mc_row.addWidget(mc_value)    mc_row.addStretch(1)    def on_copy() -> None:        QApplication.clipboard().setText(machine_code)        QMessageBox.information(window, "复制成功", "机器码已复制到剪贴板")    copy_btn = QPushButton("复制机器码")    copy_btn.setFixedSize(94, 30)    copy_btn.setStyleSheet(        "QPushButton { background: #2d8cf0; color: white; border: none; "        "border-radius: 6px; }"        "QPushButton:hover { background: #1c7ed6; }"    )    copy_btn.clicked.connect(on_copy)    mc_row.addWidget(copy_btn)    mc_lay.addLayout(mc_row)    body_lay.addWidget(mc_card)    # ---- 状态横幅 ----    if trial_text:        banner = QFrame()        banner.setStyleSheet(            f"background-color: {trial_color}; border-radius: 8px;"        )        banner_lay = QVBoxLayout(banner)        banner_lay.setContentsMargins(0, 9, 0, 9)        banner_text = QLabel(trial_text)        bf = QFont("Microsoft YaHei", 11)        bf.setBold(True)        banner_text.setFont(bf)        banner_text.setStyleSheet("color: white; background: transparent;")        banner_text.setAlignment(Qt.AlignmentFlag.AlignCenter)        banner_lay.addWidget(banner_text)        body_lay.addWidget(banner)    # ---- 授权码卡片 ----    code_card = QFrame()    code_card.setStyleSheet(        "QFrame { background-color: #ffffff; border: 1px solid #e0e0e0; "        "border-radius: 10px; }"        "QLabel { background: transparent; }"    )    code_lay = QVBoxLayout(code_card)    code_lay.setContentsMargins(14, 12, 14, 10)    code_lay.setSpacing(6)    code_title = QLabel("输入授权码")    code_title.setFont(mcf)    code_title.setStyleSheet(f"color: {ACCENT}; background: transparent;")    code_lay.addWidget(code_title)    code_row = QHBoxLayout()    entry = QLineEdit()    entry.setPlaceholderText("在此粘贴授权码")    entry.setFont(QFont("Consolas", 12))    entry.setMinimumHeight(36)    code_row.addWidget(entry, 1)    def on_paste() -> None:        try:            value = QApplication.clipboard().text()            entry.setText(value.strip())        except Exception:            pass    paste_btn = QPushButton("粘贴")    paste_btn.setFixedSize(54, 34)    paste_btn.setStyleSheet(        "QPushButton { background: #2d8cf0; color: white; border: none; "        "border-radius: 6px; }"        "QPushButton:hover { background: #1c7ed6; }"    )    paste_btn.clicked.connect(on_paste)    code_row.addWidget(paste_btn)    code_lay.addLayout(code_row)    status = QLabel("")    status.setStyleSheet("color: #e74c3c; background: transparent;")    code_lay.addWidget(status)    body_lay.addWidget(code_card)    # ---- 验证 / 取消 ----    def on_verify() -> None:        ok, msg = _verify(entry.text())        if ok:            storage.save_auth_code_file(entry.text().strip())            QMessageBox.information(window, "成功", "授权成功!程序现在可以运行。")            result["authorized"] = True            window.accept()        else:            status.setText(msg)            entry.clear()    btn_row = QHBoxLayout()    verify_btn = QPushButton("验证授权")    verify_btn.setFixedHeight(40)    verify_btn.setStyleSheet(        "QPushButton { background: #2d8cf0; color: white; border: none; "        "border-radius: 6px; font-weight: bold; }"        "QPushButton:hover { background: #1c7ed6; }"    )    verify_btn.clicked.connect(on_verify)    btn_row.addWidget(verify_btn, 1)    cancel_btn = QPushButton("取消")    cancel_btn.setFixedHeight(40)    cancel_btn.setStyleSheet(        "QPushButton { background: #e0e0e0; color: #333; border: none; "        "border-radius: 6px; font-weight: bold; }"        "QPushButton:hover { background: #cfcfcf; }"    )    cancel_btn.clicked.connect(window.reject)    btn_row.addWidget(cancel_btn, 1)    body_lay.addLayout(btn_row)    body_lay.addStretch(1)    contact = QLabel(f"联系作者:{AUTHOR_CONTACT}")    contact.setStyleSheet("color: #9e9e9e; background: transparent;")    contact.setAlignment(Qt.AlignmentFlag.AlignCenter)    body_lay.addWidget(contact)    # 回车 = 验证    entry.returnPressed.connect(on_verify)    window.exec()    if owns_app:        # 我们自建的 QApplication:不需要在这里退出(调用方拿到结果后自行决定);        # 保留 app 对象避免被 GC —— 无需显式处理。        pass    return result["authorized"]

            这款Python注册机通用授权工具,可自动完成原需手动逐个文件加授权、反复配置打包环境、用双手一遍遍核对授权逻辑一整天的工作。从面对多个项目散落各处的文件逐个打开加守卫、反复核对是否漏注入、不断重复处理"依赖没装全",""客户换硬盘机器码变了"的繁琐与崩溃,到只需选定目标 .py 并一键打包,系统即可自动完成解析依赖、建干净环境、装缺失库、注入授权守卫、生成客户端模块、调用 PyInstaller 打包、按机器码签发授权码的全链路交付,支持按机器码签发、按档位/功能位/宽限期配置、按迁移窗口接受备用变体码多种模式,还能一键续期、实时查看到期看板、导出授权报表、在线吊销,全程无需人工干预,工作效率获得指数级提升,终于解放了双手和时间!

            大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

            《该办公工具的应用场景:》

              场景
              说明

              Python 独立开发者卖软件

              给程序加机器码绑定授权,防止客户传播

              给客户交付 exe 时加授权

              打包前自动注入守卫 + 打包

              软件分档售卖

              版本档 / 功能位

              限时试用 / 到期续费

              试用期 + 宽限期 + 提醒

              客户换硬件不想重发码

              迁移窗口

              发现盗版要停用某台机器

              在线吊销

              管理一批客户和授权

              客户档案 + 到期看板 + 续期

              出门在外要给客户出码

              远程出码 / 本地签发服务

              结语

              当Python遇见办公,牛马打工人终于笑出了猪叫声

              【职场人必看】每天早上一睁眼,想到又要面对:

              1.📊 堆积如山的Excel表格

              2.📑 机械重复的复制粘贴

              3.✍️ 永远改不完的各类文档

              4.诸如此类的更多........

              是不是连Ctrl+Alt+Delete的心都有了?

              别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

              最后感谢各位大佬阅读,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!

              相关学习资料