[Python] 纯文本查看 复制代码 #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
注册码生成器
此脚本用于生成AI小说生成器的注册码。
仅供开发者使用,不应分发给用户。
"""
import sys
import os
import json
import time
import hashlib
import uuid
import base64
import argparse
from datetime import datetime, timedelta
from typing import Dict, Any, Optional
# 注册码类型和对应有效期(天)
LICENSE_TYPES = {
"day": 1, # 日卡
"week": 7, # 周卡
"month": 30, # 月卡
"year": 365 # 年卡
}
# 密钥,必须与license_manager.py中的SECRET_KEY相同
SECRET_KEY = "AI_NOVEL_GENERATOR_SECRET_KEY_2025"
def generate_license(license_type: str, machine_id: str, days: int = None, additional_data: Dict[str, Any] = None) -> str:
"""
生成注册码
Args:
license_type: 注册类型,如"day", "week", "month", "year"
machine_id: 机器唯一ID
days: 自定义有效天数,如果提供则覆盖默认值
additional_data: 要编码到注册码中的额外数据
Returns:
生成的注册码
"""
# 检查注册类型
if license_type not in LICENSE_TYPES and not days:
raise ValueError(f"无效的注册类型: {license_type},有效类型: {', '.join(LICENSE_TYPES.keys())}")
# 确定有效期
validity_days = days if days is not None else LICENSE_TYPES.get(license_type, 30)
# 计算过期时间戳
expiry_time = int(time.time()) + validity_days * 24 * 60 * 60
expiry_hex = format(expiry_time, 'x') # 十六进制表示
# 仅使用机器ID的前8位
machine_id_short = machine_id[:8]
# 编码额外数据
additional_data = additional_data or {}
additional_data["generated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
additional_data["license_type"] = license_type
additional_data["validity_days"] = validity_days
encoded_data = base64.b64encode(json.dumps(additional_data).encode('utf-8')).decode('utf-8')
# 创建验证字符串并计算签名
verify_str = f"{license_type}-{expiry_hex}-{machine_id_short}-{encoded_data}"
signature = hashlib.sha256((verify_str + SECRET_KEY).encode()).hexdigest()[:12]
# 构建并返回完整注册码
license_key = f"{license_type}-{expiry_hex}-{machine_id_short}-{encoded_data}-{signature}"
return license_key
def get_machine_id() -> str:
"""
获取当前机器的唯一ID
Returns:
机器唯一ID的哈希值
"""
try:
# 获取系统特有信息,创建唯一ID
machine_id = str(uuid.getnode()) # MAC地址
# 添加更多系统信息以增强唯一性
if sys.platform == "win32":
import winreg
registry = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
key = winreg.OpenKey(registry, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
product_id = winreg.QueryValueEx(key, "ProductId")[0]
machine_id += product_id
# 计算并返回哈希值
return hashlib.md5(machine_id.encode()).hexdigest()
except:
# 如果出错,使用简单的机器ID
return hashlib.md5(str(uuid.getnode()).encode()).hexdigest()
def format_expiry_date(timestamp: int) -> str:
"""
格式化过期时间
Args:
timestamp: 过期时间戳
Returns:
格式化的日期字符串
"""
return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
def main():
parser = argparse.ArgumentParser(description='生成AI小说生成器的注册码')
parser.add_argument('--type', '-t', choices=list(LICENSE_TYPES.keys()), default='month', help='注册类型')
parser.add_argument('--days', '-d', type=int, help='自定义有效天数')
parser.add_argument('--machine', '-m', help='指定机器ID,默认使用当前机器')
parser.add_argument('--note', '-n', help='注册备注信息')
parser.add_argument('--user', '-u', help='用户标识')
args = parser.parse_args()
# 获取或使用提供的机器ID
machine_id = args.machine if args.machine else get_machine_id()
# 准备额外数据
additional_data = {}
if args.note:
additional_data["note"] = args.note
if args.user:
additional_data["user"] = args.user
# 生成注册码
try:
license_key = generate_license(args.type, machine_id, args.days, additional_data)
# 解析注册码以获取过期时间
parts = license_key.split('-')
expiry_timestamp = int(parts[1], 16)
print("\n===== AI小说生成器注册码 =====")
print(f"注册类型: {args.type}")
print(f"机器ID: {machine_id[:8]}")
print(f"到期时间: {format_expiry_date(expiry_timestamp)}")
print(f"有效天数: {args.days if args.days else LICENSE_TYPES.get(args.type)}")
if args.user:
print(f"用户标识: {args.user}")
if args.note:
print(f"备注信息: {args.note}")
print("\n注册码:")
print(license_key)
print("\n==============================")
except Exception as e:
print(f"生成注册码时出错: {str(e)}")
return 1
return 0
if __name__ == "__main__":
sys.exit(main()) |