Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Minecraft自动读取聊天文本_Python_Text_Screen Scraping_Minecraft - Fatal编程技术网

Python 从Minecraft自动读取聊天文本

Python 从Minecraft自动读取聊天文本,python,text,screen-scraping,minecraft,Python,Text,Screen Scraping,Minecraft,在Minecraft中,我希望找到一种自动阅读聊天内容的方法,如下图所示 以便将虚拟商店中的交易记录到PostgreSQL数据库中。最好使用Python。我不拥有Minecraft服务器 我的计划是找到一种直接读取从Minecraft服务器发送的数据包的方法(出于可靠性考虑,这是首选,但难度未知),或者作为一种备份计划,我可能会想出如何筛选和删除文本。我已经找到了一些资源,可以让我将字体改为单倍行距,这将提供一种更可靠的方式来阅读字体,我相信在屏幕上为每个字符创建完全一致的位置。我可以面对一个

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

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

我的计划是找到一种直接读取从Minecraft服务器发送的数据包的方法(出于可靠性考虑,这是首选,但难度未知),或者作为一种备份计划,我可能会想出如何筛选和删除文本。我已经找到了一些资源,可以让我将字体改为单倍行距,这将提供一种更可靠的方式来阅读字体,我相信在屏幕上为每个字符创建完全一致的位置。我可以面对一个接近黑色的方向,但不是完全的,但我宁愿不去面对。如上图所示,您可以看到有许多不同颜色的字体需要处理

即使在如上所述对其进行缩减之后,我仍然不确定如何使用python将其转换为文本


关于我的方法有什么建议吗?有没有关于如何读取来自服务器的数据包的提示?有没有从我的屏幕上抓取文本的技巧?

首先,正如kuyan所建议的,请参阅,它有指向各种程序的链接,这些程序可能很有用,可以直接使用,也可以供源代码查看

例如,在Utilities下,首先出现的是日志代理

稍微向下一点,还有
mc3p
,一个由Python代理Joran Beasley推荐的程序,支持插件。它只适用于1.2.5版本,但
sadimusi/mc3p
声称是1.4.2兼容的fork。正如J.F.Sebastian所说,
mc3p
有一个日志插件接口,所以你可以只写一个日志到postgres

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

最困难的部分不是拦截数据;它正在解析协议。Minecraft可能不会发送“Nightbane:1 tnt,每张10万美元”,而是类似于“offer:Nightbane:1:tnt:100”或“\x13\x09Nightbane\x00\x01\x72\x00\x64”。根据维基的说法,协议是有文档记录的,但很差,有时不准确,维基有时也不正确,官方代码非常难看,很难阅读。这意味着了解协议的最佳方法可能是阅读sadimusi/mc3p或其他项目,如McPacketSniffer或ProtoProxy,此时您必须询问是否更容易使用该项目而不是重新实现它


无论如何,抓取屏幕应该是你最后的选择。

事实上,有一种更好的方法可以读取Minecraft的聊天记录,它不需要抓取屏幕或解码数据包

Minecraft会自动将聊天信息(以及许多其他内容)写入日志文件,无论是在单人游戏还是多人游戏中。在Windows上,它们位于
%appdata%/.minecraft/logs
中。以前的日志使用gzip压缩,但最新会话的日志会实时写入文本文件latest.log。聊天信息包含文本
[客户端线程/信息]:[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,
或者,如果您想实时阅读聊天,您可以使用下面的代码,从下面的代码稍加修改:


@库扬:他没有服务器,他想在他的客户机上记录东西。也许这会有帮助@乔兰比斯利:如果mc3p按照上述方式工作,那么根据我相信MC是用Java编写的,创建一个日志插件登录到postgres应该是很简单的,我完全理解您要求的Python解决方案,但是你可能想在这篇文章中添加一个Java标签,让一些Java程序员参与进来——也许你可以做一个小的编辑来捕获聊天细节(然后发送给Python);虽然首先登录到文件,然后加载到db/与db同步可能会更灵活,但这是可行的!在1.15中,它是
[main/INFO]:[CHAT]
而不是
[Client-thread/INFO]:[CHAT]
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,