Python调用Mojang API查询可用用户名,如何保存到桌面文本文件?
Minecraft可用用户名批量检测修复方案
原代码存在的问题
- 未处理网络异常和非预期HTTP状态码,程序易中途崩溃
- 文件频繁打开却未关闭,导致系统资源耗尽或内容未写入磁盘
- 生成的用户名包含数字开头的无效格式(Minecraft用户名不能以数字开头)
- 仅生成3位用户名,未覆盖需求中的4位
- 输出文件默认在程序运行目录,而非桌面
- 429限流重试逻辑不完善,可能无限递归或重试不足
修复后的完整代码
import requests as r import itertools from time import sleep import os def check_name(name, retry_count=3): url = "https://api.mojang.com/users/profiles/minecraft/{}" try: res = r.get(url.format(name), timeout=10) if res.status_code == 204: return True elif res.status_code == 200: return False elif res.status_code == 429: # 优先使用API返回的重试等待时间,默认10秒 wait_time = int(res.headers.get('Retry-After', 10)) sleep(wait_time) if retry_count > 0: return check_name(name, retry_count-1) else: print(f"多次重试失败,跳过用户名 {name}") return False else: print(f"检查 {name} 出错,状态码: {res.status_code}") return False except Exception as e: print(f"请求 {name} 时发生异常: {str(e)}") if retry_count > 0: sleep(5) return check_name(name, retry_count-1) else: return False def generate_names(length): # Minecraft用户名规则:仅允许小写字母、数字、下划线,首字符不能是数字 all_chars = "abcdefghijklmnopqrstuvwxyz_0123456789" first_chars = "abcdefghijklmnopqrstuvwxyz_" # 首字符排除数字 if length == 1: return list(first_chars) # 首字符从合法集合选,后续字符从全集合选 return [first + ''.join(rest) for first in first_chars for rest in itertools.product(all_chars, repeat=length-1)] # 获取系统桌面路径,确保文件输出到桌面 desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") output_file = os.path.join(desktop_path, "available_minecraft_names.txt") # 生成3位和4位的合法用户名列表 target_names = generate_names(3) + generate_names(4) # 使用with语句自动管理文件,避免资源泄漏和未写入问题 with open(output_file, 'a', encoding='utf-8') as f: total = len(target_names) for index, name in enumerate(target_names, start=1): print(f"进度: {index}/{total} | 正在检查: {name}") if check_name(name): f.write(f"{name}\n") f.flush() # 强制写入磁盘,避免缓冲丢失 sleep(0.5) # 主动添加请求间隔,降低被限流风险
关键修改说明
- 文件管理优化:用
with语句打开文件,自动关闭,同时每次写入后调用flush()确保内容立即保存到磁盘 - 桌面路径输出:通过
os模块获取系统桌面路径,直接将结果写入桌面的文件中 - 合法用户名生成:修复原代码生成数字开头无效用户名的问题,严格遵循Minecraft用户名规则
- 异常与错误处理:捕获网络超时、连接错误等异常,处理所有非预期HTTP状态码,避免程序崩溃
- 限流重试优化:读取API返回的
Retry-After头确定等待时间,限制重试次数,防止无限递归 - 进度可视化:添加进度打印,方便实时查看程序运行状态
- 请求频率控制:主动添加0.5秒间隔,降低API请求频率,减少被限流的概率
内容的提问来源于stack exchange,提问作者Zalan
相关产品推荐
相关产品推荐

