You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)  # 主动添加请求间隔,降低被限流风险

关键修改说明

  1. 文件管理优化:用with语句打开文件,自动关闭,同时每次写入后调用flush()确保内容立即保存到磁盘
  2. 桌面路径输出:通过os模块获取系统桌面路径,直接将结果写入桌面的文件中
  3. 合法用户名生成:修复原代码生成数字开头无效用户名的问题,严格遵循Minecraft用户名规则
  4. 异常与错误处理:捕获网络超时、连接错误等异常,处理所有非预期HTTP状态码,避免程序崩溃
  5. 限流重试优化:读取API返回的Retry-After头确定等待时间,限制重试次数,防止无限递归
  6. 进度可视化:添加进度打印,方便实时查看程序运行状态
  7. 请求频率控制:主动添加0.5秒间隔,降低API请求频率,减少被限流的概率

内容的提问来源于stack exchange,提问作者Zalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:46