7

在我的世界中,我希望找到一种自动阅读聊天的方法,如下图所示

我的世界聊天截图

为了将虚拟商店中的交易记录到 PostgreSQL 数据库中。最好使用 Python。我不拥有 Minecraft 服务器。

我的计划是找到一种方法来直接读取从 Minecraft 服务器发送的数据包(优先考虑可靠性,但难度未知),或者作为备用计划,可能会弄清楚如何筛选文本。我找到了一些资源,可以让我将字体更改为等宽字体,这将提供一种更可靠的字体阅读方式,并且我相信在屏幕上为每个字符创建完全一致的位置。我可以面对一个接近黑色但不完全的方向,但宁愿不必这样做。如上图所示,您也可以看到许多不同颜色的字体需要处理。

即使在如上所述减少它之后,我仍然不确定如何使用 python 将其转换为文本。

关于我的方法的任何提示?关于如何读取来自服务器的数据包的任何提示?从我的屏幕上抓取文本的任何提示?

4

2 回答 2

14

事实上,有一种更好的方式可以从 Minecraft 中读取聊天内容,并且它不需要屏幕抓取或数据包解码。

Minecraft 会自动将聊天消息(和许多其他内容)写入日志文件,无论是单人游戏还是多人游戏。在 Windows 上,它们位于%appdata%/.minecraft/logs. 以前的日志使用 gzip 压缩,但最新会话的日志实时写入文本文件 latest.log。聊天消息包含文本[Client thread/INFO]: [CHAT]。您可以像使用普通文件一样打开它,使用:

import os
with open(os.getenv("APPDATA")+"/.minecraft/logs/latest.log", "r") as logfile:
    for line in logfile:
        if "[Client thread/INFO]: [CHAT]" in line:
            print line,

或者,如果您想实时阅读聊天内容,可以使用下面的代码,对来自此答案的代码稍作修改:

import time, os

def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

if __name__ == "__main__":
    logfile = open(os.getenv("APPDATA")+"/.minecraft/logs/latest.log", "r")
    loglines = follow(logfile)
    for line in loglines:
        if "[Client thread/INFO]: [CHAT]" in line:
            print line,
于 2018-03-03T16:04:22.460 回答
2

首先,正如 kuyan 建议的那样,请参阅http://wiki.vg/Main_Page,其中包含指向各种可能有用的程序的链接,可以直接使用,也可以供源代码查看。

例如,在实用程序下,首先出现的是日志代理。

还有一点,mc3pJoran Beasley 建议的程序是一个 Python 代理,支持插件。它仅适用于 1.2.5,但sadimusi/mc3p声称是兼容 1.4.2 的分支。正如 JF Sebastian 所说,mc3p有一个用于日志插件的接口,因此您只需编写一个将日志记录到 postgres 的接口。

如果您想自己读取数据包,那并不难。您可以在几十行 Python 中编写一个通用 TCP 代理,或者在 netcat 周围编写两行中的一行 shellscript,将数据发送到您的 Python 脚本。

困难的部分不是拦截数据。它正在解析协议。Minecraft 可能不会发送“Nightbane: 1 tnt for 100.000 Dollars each”,而是类似“offer:Nightbane:1:tnt:100”或“\x13\x09Nightbane\x00\x01\x72\x00\x64”之类的东西。根据 wiki 的说法,该协议已记录在案,但很差,有时甚至不准确,而且 wiki 有时也不正确,官方代码非常丑陋且难以阅读。这意味着找出协议的最佳方法可能是阅读 sadimusi/mc3p 或其他项目之一,如 McPacketSniffer 或 ProtoProxy,此时您必须询问仅使用该项目而不是重新实现它是否更容易.

无论如何,刮屏应该是你最后的手段。

于 2012-12-01T00:41:33.017 回答