LOADING

加载过慢请开启缓存 浏览器默认开启

python创建我的世界服务器

2024/8/15 python

使用python

思路简单,后续会添加爬虫
考虑编写gui界面,方便使用
这个项目只是回顾一下学过的内容,之后会继续完善

from time import *
from sys import *
from requests import *
import os
import tkinter as tk
import tkinter.filedialog as fd

original = {
    "1.21.1": "https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar",
    "1.21": "https://piston-data.mojang.com/v1/objects/450698d1863ab5180c25d7c804ef0fe6369dd1ba/server.jar",
    "1.20.6": "https://piston-data.mojang.com/v1/objects/145ff0858209bcfc164859ba735d4199aafa1eea/server.jar",
    "1.20.5": "https://piston-data.mojang.com/v1/objects/79493072f65e17243fd36a699c9a96b4381feb91/server.jar",
    "1.20.4": "https://piston-data.mojang.com/v1/objects/8dd1a28015f51b1803213892b50b7b4fc76e594d/server.jar",
    "1.20.3": "https://piston-data.mojang.com/v1/objects/4fb536bfd4a83d61cdbaf684b8d311e66e7d4c49/server.jar",
    "1.20.2": "https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar",
    "1.20.1": "https://piston-data.mojang.com/v1/objects/84194a2f286ef7c14ed7ce0090dba59902951553/server.jar",
    "1.20": "https://piston-data.mojang.com/v1/objects/15c777e2cfe0556eef19aab534b186c0c6f277e1/server.jar",
    "1.19.4": "https://piston-data.mojang.com/v1/objects/8f3112a1049751cc472ec13e397eade5336ca7ae/server.jar",
    "1.19.3": "https://piston-data.mojang.com/v1/objects/c9df48efed58511cdd0213c56b9013a7b5c9ac1f/server.jar",
    "1.19.2": "https://piston-data.mojang.com/v1/objects/f69c284232d7c7580bd89a5a4931c3581eae1378/server.jar",
    "1.19.1": "https://piston-data.mojang.com/v1/objects/8399e1211e95faa421c1507b322dbeae86d604df/server.jar"
}



def progressbar(url,path):
    if not os.path.exists(path):   # 看是否有该文件夹,没有则创建文件夹
         os.mkdir(path)
    start = time() #下载开始时间
    response = get(url, stream=True) #stream=True必须写上
    size = 0    #初始化已下载大小
    chunk_size = 1024  # 每次下载的数据大小
    content_size = int(response.headers['content-length'])  # 下载文件总大小
    try:
        if response.status_code == 200:   #判断是否响应成功
            print('Start download,[File size]:{size:.2f} MB'.format(size = content_size / chunk_size /1024))   #开始下载,显示下载文件大小
            filepath = path+'/server.jar'  #设置图片name,注:必须加上扩展名
            with open(filepath,'wb') as file:   #显示进度条
                for data in response.iter_content(chunk_size = chunk_size):
                    file.write(data)
                    size +=len(data)
                    print('\r'+'[下载进度]:%s%.2f%%' % ('>'*int(size*50/ content_size), float(size / content_size * 100)) ,end=' ')
        end = time()   #下载结束时间
        print('Download completed!,times: %.2f秒' % (end - start))  #输出下载用时时间
    except:
        print("\nDownload failed, please check your network or try again later.")

def start():
    sleep(1)
    print("欢迎使用CX的服务器创建工具,本工具将帮助您创建并且运行一个本地的minecraft服务器。")
    sleep(1)
    print("本工具可以创建三种服务端,分别是原版、spigot、paper,不提供fabric和forge服务端的安装。")
    sleep(1)
    print("若您想要安装插件,请使用spigot或者paper;若您想开纯净服,首推spigot,其次原版。")
    sleep(1)
    print("***本工具使用到的网站分别有'https://getbukkit.org/download/spigot'、'https://mcversions.net/'、'https://papermc.io/downloads/all'***")
    sleep(5)
    ser = input("\n\n请输入您想使用的服务端(请务必输入数字,报错闪退了不怪我)[1]原版 [2]spigot [3]paper\n")
    return ser

def download_original():
    a = input("请输入您要下载的服务器版本号:")
    if a not in original:
        print("输入的版本号不存在,请重新输入")
        download_original()
    else:
        #下载服务端
        print("请选择文件夹")
        sleep(1)
        url = original[a]
        root = tk.Tk()
        root.withdraw()
        path = fd.askdirectory()
        print("服务器将会下载到这里:"+path,"下载地址为:" + url)
        sleep(0.5)
        if input("是否下载?[y/n]") == "y":
            progressbar(url,path)
            print("服务端下载完成")
        else:
            print("下载取消")
            exit()

def download_spigot():
    #https://download.getbukkit.org/spigot/spigot-1.20.6.jar  https://cdn.getbukkit.org/spigot/spigot-1.15.jar  https://cdn.getbukkit.org/spigot/spigot-1.8.7-R0.1-SNAPSHOT-latest.jar
    a = input("请输入您要下载的服务器版本号:")
    url = "https://download.getbukkit.org/spigot/spigot-"+a+".jar"
    url1 = "https://cdn.getbukkit.org/spigot/spigot-"+a+".jar"
    url2 = "https://cdn.getbukkit.org/spigot/spigot-"+a+"-R0.1-SNAPSHOT-latest.jar"  #经测试无法正常下载,所以老版本的无法下载
    print("正在检查版本号是否正确...")
    if get(url,stream=True).status_code == 200:
        #下载服务端
        print("请选择文件夹")
        sleep(1)
        root = tk.Tk()
        root.withdraw()
        path = fd.askdirectory()
        print("服务器将会下载到这里:"+path,"下载地址为:" + url)
        sleep(0.5)
        if input("是否下载?[y/n](请注意,spigot下载速度较慢,请耐心等待)") == "y":
            progressbar(url,path)
            print("服务端下载完成")
        else:
            print("下载取消")
            exit()
    elif get(url1,stream=True).status_code == 200:
        #下载服务端
        print("请选择文件夹")
        sleep(1)
        root = tk.Tk()
        root.withdraw()
        path = fd.askdirectory()
        print("服务器将会下载到这里:"+path,"下载地址为:" + url1)
        sleep(0.5)
        if input("是否下载?[y/n](请注意,spigot下载速度较慢,请耐心等待)") == "y":
            progressbar(url1,path)
            print("服务端下载完成")
        else:
            print("下载取消")
            exit()
    elif get(url2,stream=True).status_code == 200:
        #下载服务端
        print("请选择文件夹")
        sleep(1)
        root = tk.Tk()
        root.withdraw()
        path = fd.askdirectory()
        print("服务器将会下载到这里:"+path,"下载地址为:" + url2)
        sleep(0.5)
        if input("是否下载?[y/n](请注意,spigot下载速度较慢,请耐心等待)") == "y":
            progressbar(url2,path)
            print("服务端下载完成")
        else:
            print("下载取消")
            exit()
    else:
        print("输入的版本号不存在,请重新输入")
        download_spigot()
    

def download_paper():
    pass

def run_server():
    print("请选择服务端所在的文件夹")
    sleep(1)
    root = tk.Tk()
    root.withdraw()
    path = fd.askdirectory()
    print("服务端将会初始化并运行这里:"+path)
    sleep(0.5)
    if input("是否初始化并运行?[y/n]") == "y":
        os.chdir(path)
        server = path + "/server.jar"
        eula = path + "/eula.txt"
        if not os.path.exists(server):
            print("服务端不存在,请检查路径是否正确")
            exit()
        with open(eula, "w") as f:
                f.write("eula=true")
                f.close()
        with open(path + "/start.bat", "w") as f:
                mx = input("请输入服务器占用的最大内存(MB)(不输入则默认为2048):")
                ms = input("请输入服务器占用的最小内存(MB)(不输入则默认为1024):")
                if mx == "":
                    mx = "2048"
                if ms == "":
                    ms = "1024"
                f.write("java -Xmx"+mx+"M -Xms"+ms+"M -jar server.jar nogui")
                f.close()
        with open(path + "/帮助文档.txt", "w") as f:
                f.write("0.大部分服务器闪退的原因是Java运行环境配置错误或者版本错误,请按照https://www.bilibili.com/read/cv35088159/这篇文章选择正确的JAVA版本以及https://blog.51cto.com/u_16099326/7413641 这篇文章配置Java运行环境。\n1. 请将服务端放置在您想运行的位置\n2. 双击start.bat文件,即可运行服务端\n3. 若服务端启动失败,请检查是否有文件丢失或路径错误")
                f.close()
        os.system("start " + path + "/start.bat")
        print("服务端初始化并运行完成")
        print("*若服务端启动失败,查看帮助文档*")
        
    else:
        print("运行取消")
        exit()


def main():
    ser = start()  #获取用户输入的服务端

    if ser == "1":  #原版服务端
        print("您选择了原版服务端")
        download_original()
        sleep(1)
        print("开始运行服务端")
        run_server()
    elif ser == "2":  #spigot服务端
        print("您选择了spigot服务端")
        download_spigot()
        sleep(1)
        print("开始运行服务端")
        run_server()
    elif ser == "3":  #paper服务端
        pass
    else:
        print("你真不听话")  #遇到傻逼了
        

if __name__ == '__main__':
    main()