鱼C论坛

 找回密码
 立即注册
查看: 2537|回复: 6

[已解决]mcpi库

[复制链接]
发表于 2023-4-22 15:48:13 | 显示全部楼层 |阅读模式
9鱼币
mcpi库有没有办法获取服务器内玩家信息(用户名和消息)服务器是离线服
最佳答案
2023-4-22 15:48:14
wyhpylc 发表于 2023-4-22 16:42
az,player_info = rcon.run(f"data get entity {player_name}")返回的是列表吗?

不好意思,我之前的回答有误。`rcon.run()` 返回的实际上是一个字符串,而不是列表。

`player_info = rcon.run(f"data get entity {player_name}")` 会返回包含玩家信息的字符串。这个字符串可能会包含玩家的属性、位置、游戏模式等数据。

如果您想要从字符串中解析出特定的数据,可以使用正则表达式或其他字符串处理方法。例如,如果您想要提取玩家的位置,可以尝试使用以下代码:
import re

# 获取玩家信息
player_info = rcon.run(f"data get entity {player_name}")

# 使用正则表达式提取玩家的位置
position_pattern = re.compile(r"Pos:\[(-?\d+(\.\d+)?),\s(-?\d+(\.\d+)?),\s(-?\d+(\.\d+)?)\]")
position_match = position_pattern.search(player_info)

if position_match:
    x, _, y, _, z, _ = position_match.groups()
    print(f"玩家 {player_name} 的位置: X={x}, Y={y}, Z={z}")
else:
    print("无法找到玩家位置")

请注意,这个方法需要您熟悉正则表达式以解析所需的数据。同时,您需要根据实际情况调整正则表达式以匹配返回的字符串中的数据。

最佳答案

查看完整内容

不好意思,我之前的回答有误。`rcon.run()` 返回的实际上是一个字符串,而不是列表。 `player_info = rcon.run(f"data get entity {player_name}")` 会返回包含玩家信息的字符串。这个字符串可能会包含玩家的属性、位置、游戏模式等数据。 如果您想要从字符串中解析出特定的数据,可以使用正则表达式或其他字符串处理方法。例如,如果您想要提取玩家的位置,可以尝试使用以下代码: 请注意,这个方法需要您熟悉正则 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-22 15:48:14 | 显示全部楼层    本楼为最佳答案   
wyhpylc 发表于 2023-4-22 16:42
az,player_info = rcon.run(f"data get entity {player_name}")返回的是列表吗?

不好意思,我之前的回答有误。`rcon.run()` 返回的实际上是一个字符串,而不是列表。

`player_info = rcon.run(f"data get entity {player_name}")` 会返回包含玩家信息的字符串。这个字符串可能会包含玩家的属性、位置、游戏模式等数据。

如果您想要从字符串中解析出特定的数据,可以使用正则表达式或其他字符串处理方法。例如,如果您想要提取玩家的位置,可以尝试使用以下代码:
import re

# 获取玩家信息
player_info = rcon.run(f"data get entity {player_name}")

# 使用正则表达式提取玩家的位置
position_pattern = re.compile(r"Pos:\[(-?\d+(\.\d+)?),\s(-?\d+(\.\d+)?),\s(-?\d+(\.\d+)?)\]")
position_match = position_pattern.search(player_info)

if position_match:
    x, _, y, _, z, _ = position_match.groups()
    print(f"玩家 {player_name} 的位置: X={x}, Y={y}, Z={z}")
else:
    print("无法找到玩家位置")

请注意,这个方法需要您熟悉正则表达式以解析所需的数据。同时,您需要根据实际情况调整正则表达式以匹配返回的字符串中的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-22 15:48:54 | 显示全部楼层
本帖最后由 isdkz 于 2023-4-22 15:50 编辑

MCPI (Minecraft: Pi Edition) API 是为了支持在树莓派设备上运行的 Minecraft 版本设计的。不过,您可以使用适用于更通用的 Minecraft 版本的库来获取服务器内的玩家信息。其中一种选择是使用 Minecraft 的 Python 库,如 `mcstatus` 和 `minepy`。

如果您想要获取服务器内玩家的用户名和消息,那么可以使用 RCON 和查询协议来实现。使用 RCON 可以允许您发送命令并接收服务器的响应,而查询协议可以帮助您获取服务器的一些基本信息。`mcstatus` 是一个适用于此目的的 Python 库。首先需要使用 pip 安装 `mcstatus`:
pip install mcstatus

然后,您可以使用以下示例代码来获取玩家的信息:
from mcstatus import MinecraftServer

# 替换为您的服务器地址和RCON密码
server = MinecraftServer.lookup("your_server_address")
rcon = server.rcon("your_rcon_password")

# 获取在线玩家列表
online_players = rcon.run("list")
print(online_players)

# 获取一个玩家的信息
player_name = "player_name"  # 替换为您想要获取信息的玩家名
player_info = rcon.run(f"data get entity {player_name}")
print(player_info)

获取服务器内玩家的消息是一个更复杂的任务。一种可能的方法是编写一个自定义插件,使用 Bukkit/Spigot 或 Fabric 等 Minecraft 服务器插件框架。插件可以监听聊天事件,并将玩家的消息发送到一个外部程序,如 Python 脚本,用于处理和分析。然而,这种方法需要一定的 Java 编程和 Minecraft 服务器管理经验。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-22 16:23:11 | 显示全部楼层
isdkz 发表于 2023-4-22 15:48
MCPI (Minecraft: Pi Edition) API 是为了支持在树莓派设备上运行的 Minecraft 版本设计的。不过,您可以使 ...

那假如我要实时监听服务器消息,有没有办法用Python实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-22 16:25:04 | 显示全部楼层
wyhpylc 发表于 2023-4-22 16:23
那假如我要实时监听服务器消息,有没有办法用Python实现

实时监听服务器消息的一种方法是使用 Python 库创建一个基于插座(socket)的连接,连接到 Minecraft 服务器的 RCON,并持续监听聊天事件。要实现这个功能,可以使用 `mcrcon` 库来与 RCON 交互。请注意,这种方法可能不是最优雅的解决方案,但它可以实现您的需求。

首先安装 `mcrcon`:
pip install mcrcon

接下来,使用以下代码创建一个连接到 Minecraft 服务器 RCON 的 Python 脚本:
import time
from mcrcon import MCRcon

# 用您的服务器 IP 地址、RCON 端口和密码替换以下信息
RCON_IP = "your_server_ip"
RCON_PORT = 25575  # 请确保使用正确的 RCON 端口
RCON_PASSWORD = "your_rcon_password"

# 创建一个新的 RCON 连接
with MCRcon(RCON_IP, RCON_PASSWORD, RCON_PORT) as mcr:
    while True:
        # 运行一个命令以获取最后一条消息,这里我们使用“gamerule”命令
        # 以确保不干扰游戏进程
        mcr.command("gamerule sendCommandFeedback false")
        response = mcr.command("data get block 0 0 0 LastOutput")
        
        # 检查响应并处理结果,例如打印到控制台
        if "LastOutput" in response:
            chat_message = response.replace("LastOutput: ", "")
            print(chat_message)

        # 为了不过度请求服务器,等待几秒钟
        time.sleep(5)

这个代码示例会持续运行,并每隔一段时间请求服务器上的聊天消息。需要注意的是,这个方法可能会对服务器性能产生一定影响,所以谨慎使用。

然而,此方法可能无法获取所有消息,因为它依赖于在某个时刻查询服务器的消息。创建一个自定义 Minecraft 插件,监听聊天事件并将结果发送到 Python 脚本仍然是实现这一目标的更可靠和高效方法。这种方法可以确保所有消息都被捕获,并可以更精确地控制处理逻辑。创建此类插件需要 Java 编程经验和对 Minecraft 服务器插件框架(如 Bukkit/Spigot 或 Fabric)的了解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-22 16:42:15 | 显示全部楼层
isdkz 发表于 2023-4-22 16:25
实时监听服务器消息的一种方法是使用 Python 库创建一个基于插座(socket)的连接,连接到 Minecraft 服 ...

az,player_info = rcon.run(f"data get entity {player_name}")返回的是列表吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-22 17:48:24 | 显示全部楼层
isdkz 发表于 2023-4-22 16:44
不好意思,我之前的回答有误。`rcon.run()` 返回的实际上是一个字符串,而不是列表。

`player_info =  ...

ok,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表