【问题标题】:Automatically read chat text from Minecraft自动从 Minecraft 读取聊天文本
【发布时间】:2012-11-19 06:08:51
【问题描述】:

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

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

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

即使按照上述方法进行了缩减,我仍然不确定如何使用 python 将其转换为文本。

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

【问题讨论】:

  • @kuyan:他不拥有服务器,他想在他的客户端上记录东西。
  • 也许这会有所帮助? github.com/mmcgill/mc3p
  • @JoranBeasley:如果 mc3p 像描述的那样工作,那么创建一个基于 mc3p.plugin.log 记录到 postgres 的日志插件应该很简单
  • 我相信 MC 是用 Java 编写的,我完全理解您要求提供 Python 解决方案,但您可能希望在这篇文章中添加 Java 标记并让一些 Java 程序员参与进来——也许你可以做一个小的编辑来捕获聊天细节(然后将它发送到 Python)。
  • 如果你想直接登录到数据库,这里是example of DBHandler for logging module that sends log messages to database;虽然先登录到文件并稍后加载到/与数据库同步可能更灵活

标签: python text screen-scraping minecraft


【解决方案1】:

事实上,有一种更好的方式来读取 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,

或者如果你想实时阅读聊天,你可以使用下面的代码,稍微修改了来自answer的代码:

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,

【讨论】:

  • 这行得通!在 1.15 中是 [main/INFO]: [CHAT] 而不是 [Client thread/INFO]: [CHAT]
  • 也许您知道我如何将 CHAT 行拆分为发送者、接收者和文本?因为每个服务器都有不同的聊天格式
【解决方案2】:

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

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

还有一点,mc3p,由 Joran Beasley 推荐的程序——一个 Python 代理,支持插件。它仅适用于 1.2.5,但 sadimusi/mc3p 声称是兼容 1.4.2 的分支。正如 J.F. Sebastian 所说,mc3p 有一个日志插件接口,因此您只需编写一个日志到 postgres 的接口。

如果您想自己读取数据包,那并不难。您可以在几十行 Python 中编写一个通用 TCP 代理,或者在 netcat 周围编写 2 行中的一个 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,此时您必须询问仅使用该项目而不是重新实现它是否更容易.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2011-10-01
    • 2010-10-18
    相关资源
    最近更新 更多