use*_*827 5 python text screen-scraping minecraft
在Minecraft中,我希望找到一种方法来自动阅读聊天,如下图所示

为了将虚拟商店中进行的事务记录到PostgreSQL数据库中.最好使用Python.我不拥有Minecraft服务器.
我的计划是找到一种直接读取Minecraft服务器发送的数据包的方法(首选可靠性,但难度不大),或者作为备份计划可能会弄清楚如何屏蔽文本.我找到了一些资源,可以让我将字体更改为monospaced,这将提供更可靠的字体读取方式,我相信在屏幕上为每个字符创建完美一致的位置.我可以面对一个接近黑色但不完全的方向,但不愿意这样做.如上图所示,您可以看到有许多不同颜色的字体可供使用.
即使在如上所述减少它之后,我仍然不确定如何使用python将其转换为文本.
关于我的方法的任何提示?有关如何读取来自服务器的数据包的任何提示?有关从屏幕上抓取文字的提示吗?
小智 13
事实上,有一种更好的方法可以从 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,
Run Code Online (Sandbox Code Playgroud)
或者,如果您想实时阅读聊天,您可以使用下面的代码,对该答案中的代码稍作修改:
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,
Run Code Online (Sandbox Code Playgroud)
首先,正如 kuyan 建议的那样,请参阅http://wiki.vg/Main_Page,其中包含可能有用的各种程序的链接,无论是直接链接还是供查看源代码。
\n\n例如,在“实用程序”下,首先出现的是日志记录代理。
\n\n再往下一点,有mc3pJoran Beasley\xe2\x80\x94a Python 代理建议的程序,带有插件支持。它仅适用于 1.2.5,但sadimusi/mc3p声称是 1.4.2 兼容的分支。正如 JF Sebastian 所说,mc3p它有一个日志插件接口,因此您可以编写一个日志插件来记录到 postgres。
如果您想自己读取数据包,那并不难。您可以用几十行 Python\xe2\x80\x94 编写一个通用 TCP 代理,或者在 netcat 周围编写两行 shell 脚本之一,将数据发送到 Python 脚本。
\n\n困难的部分不是拦截数据;而是 它正在解析协议。Minecraft 可能不会发送“Nightbane: 1 tnt for 100.000 Dollars every”,而是类似“offer:Nightbane:1:tnt:100”或“\\x13\\x09Nightbane\\x00\\x01\\x72\ \x00\\x64"。从维基上的说法来看,该协议有文档记录,但很差,有时不准确,维基有时也不正确,而且官方代码非常丑陋且难以阅读。这意味着弄清楚协议的最佳方法可能是阅读 Sadimusi/mc3p 或其他项目之一,例如 McPacketSniffer 或 ProtoProxy,此时您必须询问是否使用该项目而不是重新实现它会更容易。
\n\n无论如何,刮擦屏幕应该是最后的手段。
\n| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |