本帖最后由 lihelh 于 2020-10-9 00:24 编辑
编程小白,第一次发编程版的帖子(证明了我的六级号是水出来的)大佬多多关照
思路
这个程序使用了socket库来发送请求,struct库来解析数据包(均可pip install)
1. 握手部分
其实握手没有那么难,看完wiki之后 可以写出下面的伪代码
复制代码 2. 发送ServerListPing请求
这里就更简单了
复制代码
3. 加入亿点点细节
成品
整个项目也耗费了不少精力,希望转载能带下原链接 谢谢啦
mstool.py.txt
(5.03 KB, 下载次数: 30)
编程小白,第一次发编程版的帖子(证明了我的六级号是水出来的)大佬多多关照
前言
一个风和日丽的上午,我忽然想在官网和QQ群里加个获取服务器在线玩家的小功能- 于是这个小项目就诞生了
思路
- 好了不废话了 要实现获取在线玩家,需要从MC的协议入手
- MC的协议总共分为几个过程
- 握手
- 获取状态
- 登入
- 进行游戏
- 查询完资料后,我们得知,需要获取玩家列表,可以在第二步 也就是ServerListPing过程中实现(对于某些服务器 如Bungee 将无法获得玩家列表)。(详细协议可见:https://wiki.vg/Server_List_Ping)
这个程序使用了socket库来发送请求,struct库来解析数据包(均可pip install)
1. 握手部分
其实握手没有那么难,看完wiki之后 可以写出下面的伪代码
- # 握手包 - 用包ID开头 (null byte)
- byts = self.ID
- # 编码方法版本(https://wiki.vg/Protocol_version_numbers):
- byts = byts + self._encode_varint(data[3])
- # 编码服务器地址:
- host_bytes = data[4].encode("utf8")
- byts = byts + self._encode_varint(len(host_bytes)) + host_bytes
- # 编码服务器端口:
- byts = byts + struct.pack(">H", data[5])
- # 编码下一个状态:
- byts = byts + self._encode_varint(1)
- # 编码长度:
- byts = self._encode_varint(len(byts)) + byts
- return byts
这里就更简单了
- return self._encode_varint(len(self.ID)) + self.ID
3. 加入亿点点细节
成品
整个项目也耗费了不少精力,希望转载能带下原链接 谢谢啦
MCBBS有你更精彩~