鱼C论坛

 找回密码
 立即注册
查看: 4058|回复: 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}")` 会返回包含玩家信息的字符串。这个字符串可能会包含玩家的属性、位置、游戏模式等数据。

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

  1. import re

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

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

  7. if position_match:
  8.     x, _, y, _, z, _ = position_match.groups()
  9.     print(f"玩家 {player_name} 的位置: X={x}, Y={y}, Z={z}")
  10. else:
  11.     print("无法找到玩家位置")
复制代码


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

最佳答案

查看完整内容

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

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

  1. import re

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

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

  7. if position_match:
  8.     x, _, y, _, z, _ = position_match.groups()
  9.     print(f"玩家 {player_name} 的位置: X={x}, Y={y}, Z={z}")
  10. else:
  11.     print("无法找到玩家位置")
复制代码


请注意,这个方法需要您熟悉正则表达式以解析所需的数据。同时,您需要根据实际情况调整正则表达式以匹配返回的字符串中的数据。
小甲鱼最新课程 -> https://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`:

  1. pip install mcstatus
复制代码


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

  1. from mcstatus import MinecraftServer

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

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

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


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

使用道具 举报

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

那假如我要实时监听服务器消息,有没有办法用Python实现
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

首先安装 `mcrcon`:

  1. pip install mcrcon
复制代码


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

  1. import time
  2. from mcrcon import MCRcon

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

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

  19.         # 为了不过度请求服务器,等待几秒钟
  20.         time.sleep(5)
复制代码


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

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

使用道具 举报

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

`player_info =  ...

ok,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-29 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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