2012-12-01 23 views
6

聊天的文字在我的世界,我希望能找到一種方法來自動讀取聊天像想象下面自動讀取從我的世界

minecraft chat screenshot

爲了記錄在虛擬店鋪做成一個PostgreSQL數據庫事務。最好使用Python。我不擁有Minecraft服務器。

我的計劃是要麼找到一種方法,直接讀取從Minecraft服務器發送的數據包(首選可靠性,但未知難度),或者作爲備份計劃,可能會弄清楚如何屏蔽文本。我發現了一些資源,可以讓我將字體更改爲等寬字體,這將提供更可靠的字體閱讀方式,並且我相信爲每個字符在屏幕上創建完美一致的位置。我可以面對一個接近黑色的方向,但並不完全,但寧願不必。如上圖所示,您看到有很多不同顏色的字體可以與之抗衡。

即使在如上所述減少它之後,我仍然不確定如何使用python將其變爲文本。

我的方法的任何提示?有關我如何讀取來自服務器的數據包的任何提示?有關從屏幕上刮取文字的提示?

+0

您可能要截取服務器接收的流量。 Python對於這項工作來說不太可行(除非你使用Python包裝器運行Vanilla服務器) - 要獲得更多幫助,請查看irc.freenode.net上的http://wiki.vg/Main_Page和#mcdevs。 。 – Natan

+1

@kuyan:他不擁有這臺服務器,他想把東西記錄在他的客戶端上。 – abarnert

+2

也許這將有助於? https://github.com/mmcgill/mc3p –

回答

2

首先,作爲kuyan建議,見http://wiki.vg/Main_Page,其具有鏈接到可能是有用的,無論是直接或用於源看的各種程序。

例如,在Utilities下,出現的第一件事就是日誌代理。

,有點下降,有mc3p,通過Joran比斯利,一個Python代理提出的方案,插件支持。它只能工作到1.2.5,但是sadimusi/mc3p聲稱是1.4.2兼容的分支。正如J.F.塞巴斯蒂安所說,mc3p有一個日誌插件的界面,所以你可以寫一個日誌到postgres。

如果你想自己讀取數據包,那並不難。您可以在幾十行Python中編寫通用的TCP代理,或者在netcat的兩行shellcript中編寫一行,將數據發送到您的Python腳本。

困難的部分是不攔截數據;它解析協議。 Minecraft可能不會發送「Nightbane:每個100.000美元1泰銖」,但類似於「offer:Nightbane:1:tnt:100」或「\ x13 \ x09Nightbane \ x00 \ x01 \ x72 \ x00 \ x64」。根據wiki的說法,該協議是有記錄的,但很差,有時甚至不準確,維基有時也是不正確的,官方的代碼非常難看,很難閱讀。這意味着找出協議的最佳方式可能是通過閱讀sadimusi/mc3p或其他項目(如McPacketSniffer或ProtoProxy),在這一點上,您必須詢問使用該項目而不是重新實現它會更容易。

無論如何,刮屏應該是你的最後手段。

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,