Files
backend/scripts/generate_test_account.py

483 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CarrotSkin 测试账户生成器
此脚本创建新用户、角色,并输出所有测试信息
"""
import json
import random
import sys
from datetime import datetime
from pathlib import Path
try:
import requests
except ImportError:
print("错误: 需要安装 requests 库")
print("请运行: pip install requests")
sys.exit(1)
# 颜色输出支持Windows 和 Unix 都支持)
try:
from colorama import init, Fore, Style
init(autoreset=True)
HAS_COLORAMA = True
# colorama 没有 GRAY使用 WHITE 代替
Fore.GRAY = Fore.WHITE
except ImportError:
# 如果没有 colorama使用空字符串
class Fore:
CYAN = YELLOW = GREEN = RED = GRAY = WHITE = RESET = ""
class Style:
RESET_ALL = ""
HAS_COLORAMA = False
# API 基础 URL
BASE_URL = "http://localhost:8080/api/v1"
def print_colored(text, color=Fore.RESET):
"""打印彩色文本"""
print(f"{color}{text}{Style.RESET_ALL}")
def print_header(text):
"""打印标题"""
print_colored(f"\n{'=' * 40}", Fore.CYAN)
print_colored(f" {text}", Fore.CYAN)
print_colored(f"{'=' * 40}\n", Fore.CYAN)
def print_step(text):
"""打印步骤标题"""
print_colored(f"\n=== {text} ===", Fore.YELLOW)
def print_success(text):
"""打印成功消息"""
print_colored(f"{text}", Fore.GREEN)
def print_error(text):
"""打印错误消息"""
print_colored(f"{text}", Fore.RED)
def print_info(text):
"""打印信息消息"""
print_colored(f" {text}", Fore.GRAY)
def register_user():
"""步骤1: 注册新用户"""
print_step("步骤1: 注册新用户")
random_num = random.randint(10000, 99999)
username = f"testuser{random_num}"
email = f"test{random_num}@example.com"
login_password = "password123"
verification_code = "123456"
print_info(f"用户名: {username}")
print_info(f"邮箱: {email}")
print_info(f"密码: {login_password}")
register_data = {
"username": username,
"email": email,
"password": login_password,
"verification_code": verification_code
}
try:
response = requests.post(
f"{BASE_URL}/auth/register",
json=register_data,
headers={"Content-Type": "application/json"},
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
jwt_token = result["data"]["token"]
user_id = result["data"]["user_info"]["id"]
user_role = result["data"]["user_info"]["role"]
print_success("注册成功!")
print_info(f"用户ID: {user_id}")
print_info(f"角色: {user_role}")
return {
"username": username,
"email": email,
"login_password": login_password,
"jwt_token": jwt_token,
"user_id": user_id,
"user_role": user_role
}
else:
print_error(f"注册失败: {result.get('message', '未知错误')}")
sys.exit(1)
except requests.exceptions.RequestException as e:
print_error(f"注册失败: {str(e)}")
sys.exit(1)
def create_profile(jwt_token):
"""步骤2: 创建Minecraft角色"""
print_step("步骤2: 创建Minecraft角色")
profile_name = f"TestPlayer{random.randint(100, 999)}"
print_info(f"角色名: {profile_name}")
profile_data = {
"name": profile_name
}
headers = {
"Authorization": f"Bearer {jwt_token}",
"Content-Type": "application/json"
}
try:
response = requests.post(
f"{BASE_URL}/profile/",
json=profile_data,
headers=headers,
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
profile_uuid = result["data"]["uuid"]
print_success("角色创建成功!")
print_info(f"角色UUID: {profile_uuid}")
print_info(f"角色名: {result['data']['name']}")
return {
"profile_name": profile_name,
"profile_uuid": profile_uuid
}
else:
print_error(f"角色创建失败: {result.get('message', '未知错误')}")
sys.exit(1)
except requests.exceptions.RequestException as e:
print_error(f"角色创建失败: {str(e)}")
sys.exit(1)
def reset_yggdrasil_password(jwt_token):
"""步骤3: 重置并获取Yggdrasil密码"""
print_step("步骤3: 重置并获取Yggdrasil密码")
headers = {
"Authorization": f"Bearer {jwt_token}",
"Content-Type": "application/json"
}
try:
response = requests.post(
f"{BASE_URL}/user/yggdrasil-password/reset",
headers=headers,
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
yggdrasil_password = result["data"]["password"]
print_success("Yggdrasil密码重置成功!")
print_info(f"Yggdrasil密码: {yggdrasil_password}")
return yggdrasil_password
else:
print_error(f"Yggdrasil密码重置失败: {result.get('message', '未知错误')}")
return ""
except requests.exceptions.RequestException as e:
print_error(f"Yggdrasil密码重置失败: {str(e)}")
return ""
def generate_output(user_info, profile_info, yggdrasil_password):
"""生成输出信息"""
output = f"""========================================
CarrotSkin 测试账户信息
========================================
=== 账户信息 ===
用户名: {user_info['username']}
邮箱: {user_info['email']}
登录密码: {user_info['login_password']}
用户ID: {user_info['user_id']}
=== JWT Token (API认证) ===
Token: {user_info['jwt_token']}
=== 角色信息 ===
角色名: {profile_info['profile_name']}
角色UUID: {profile_info['profile_uuid']}
=== Yggdrasil信息 ===
Yggdrasil密码: {yggdrasil_password}
=== 测试命令 ===
# 1. API登录
curl -X POST http://localhost:8080/api/v1/auth/login \\
-H 'Content-Type: application/json' \\
-d '{{"username":"{user_info['username']}","password":"{user_info['login_password']}"}}'
# 2. 创建角色
curl -X POST http://localhost:8080/api/v1/profile/ \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer {user_info['jwt_token']}' \\
-d '{{"name":"NewProfile"}}'
# 3. 重置Yggdrasil密码
curl -X POST http://localhost:8080/api/v1/user/yggdrasil-password/reset \\
-H 'Content-Type: application/json' \\
-H 'Authorization: Bearer {user_info['jwt_token']}'
# 4. Yggdrasil认证
curl -X POST http://localhost:8080/api/v1/yggdrasil/authserver/authenticate \\
-H 'Content-Type: application/json' \\
-d '{{
"username": "{user_info['username']}",
"password": "{yggdrasil_password}",
"requestUser": true
}}'
# 5. 获取角色信息
curl -X GET http://localhost:8080/api/v1/profile/{profile_info['profile_uuid']}
========================================
"""
return output
def set_user_role(admin_token, user_id, role):
"""设置用户角色"""
headers = {
"Authorization": f"Bearer {admin_token}",
"Content-Type": "application/json"
}
try:
response = requests.put(
f"{BASE_URL}/admin/users/role",
json={"user_id": user_id, "role": role},
headers=headers,
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
print_success(f"用户角色设置为: {role}")
return True
else:
print_error(f"设置角色失败: {result.get('message', '未知错误')}")
return False
except requests.exceptions.RequestException as e:
print_error(f"设置角色失败: {str(e)}")
return False
def login_user(username, password):
"""登录用户"""
try:
response = requests.post(
f"{BASE_URL}/auth/login",
json={"username": username, "password": password},
headers={"Content-Type": "application/json"},
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
return result["data"]["token"]
return None
except requests.exceptions.RequestException:
return None
def create_admin_user():
"""创建管理员用户"""
print_step("创建管理员用户")
random_num = random.randint(10000, 99999)
username = f"admin{random_num}"
email = f"admin{random_num}@example.com"
login_password = "admin123456"
verification_code = "123456"
print_info(f"用户名: {username}")
print_info(f"邮箱: {email}")
print_info(f"密码: {login_password}")
register_data = {
"username": username,
"email": email,
"password": login_password,
"verification_code": verification_code
}
try:
response = requests.post(
f"{BASE_URL}/auth/register",
json=register_data,
headers={"Content-Type": "application/json"},
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("code") == 200:
jwt_token = result["data"]["token"]
user_id = result["data"]["user_info"]["id"]
print_success("用户注册成功!")
print_info(f"用户ID: {user_id}")
# 使用默认管理员账户提升权限
print_info("尝试使用默认管理员账户提升权限...")
default_admin_token = login_user("admin", "admin123456")
if default_admin_token:
if set_user_role(default_admin_token, user_id, "admin"):
print_success("管理员权限设置成功!")
return {
"username": username,
"email": email,
"password": login_password,
"jwt_token": jwt_token,
"user_id": user_id,
"role": "admin"
}
print_error("无法提升权限,请手动设置")
return {
"username": username,
"email": email,
"password": login_password,
"jwt_token": jwt_token,
"user_id": user_id,
"role": "user"
}
else:
print_error(f"注册失败: {result.get('message', '未知错误')}")
return None
except requests.exceptions.RequestException as e:
print_error(f"注册失败: {str(e)}")
return None
def generate_admin_output(admin_info):
"""生成管理员账户输出信息"""
output = f"""========================================
CarrotSkin 管理员账户信息
========================================
=== 账户信息 ===
用户名: {admin_info['username']}
邮箱: {admin_info['email']}
密码: {admin_info['password']}
用户ID: {admin_info['user_id']}
角色: {admin_info['role']}
=== JWT Token (API认证) ===
Token: {admin_info['jwt_token']}
=== 管理员API示例 ===
# 1. 获取用户列表
curl -X GET "{BASE_URL}/admin/users" \\
-H "Authorization: Bearer {admin_info['jwt_token']}"
# 2. 设置用户角色为管理员
curl -X PUT "{BASE_URL}/admin/users/role" \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer {admin_info['jwt_token']}" \\
-d '{{"user_id": 1, "role": "admin"}}'
# 3. 获取材质列表(审核)
curl -X GET "{BASE_URL}/admin/textures" \\
-H "Authorization: Bearer {admin_info['jwt_token']}"
# 4. 删除材质
curl -X DELETE "{BASE_URL}/admin/textures/1" \\
-H "Authorization: Bearer {admin_info['jwt_token']}"
========================================
"""
return output
def main():
"""主函数"""
print_header("CarrotSkin 测试账户生成器")
# 选择模式
print("请选择操作:")
print(" 1. 创建普通测试用户")
print(" 2. 创建管理员用户")
print(" 3. 创建两者")
choice = input("\n请输入选项 (1/2/3) [默认: 1]: ").strip() or "1"
if choice in ["1", "3"]:
# 创建普通用户
print_header("创建普通测试用户")
# 步骤1: 注册用户
user_info = register_user()
# 步骤2: 创建角色
profile_info = create_profile(user_info["jwt_token"])
# 步骤3: 重置Yggdrasil密码
yggdrasil_password = reset_yggdrasil_password(user_info["jwt_token"])
# 输出信息
print_header("普通用户信息汇总")
output = generate_output(user_info, profile_info, yggdrasil_password)
print(output)
# 保存到文件
output_file = f"test_account_{user_info['username']}.txt"
try:
with open(output_file, "w", encoding="utf-8") as f:
f.write(output)
print_success(f"信息已保存到文件: {output_file}")
except Exception as e:
print_error(f"保存文件失败: {str(e)}")
if choice in ["2", "3"]:
# 创建管理员用户
print_header("创建管理员用户")
admin_info = create_admin_user()
if admin_info:
print_header("管理员账户信息汇总")
admin_output = generate_admin_output(admin_info)
print(admin_output)
# 保存到文件
admin_output_file = f"admin_account_{admin_info['username']}.txt"
try:
with open(admin_output_file, "w", encoding="utf-8") as f:
f.write(admin_output)
print_success(f"管理员信息已保存到文件: {admin_output_file}")
except Exception as e:
print_error(f"保存文件失败: {str(e)}")
print_header("测试完成!")
if __name__ == "__main__":
main()