2012-12-01 12 views
6

からテキストチャット読んで私は、PostgreSQLデータベースに仮想店舗で行われたトランザクションを記録するためには自動的にMinecraftのではMinecraftの

minecraft chat screenshot

下図のように、自動的にチャットを読むための方法を見つけることを願っていました。好ましくはPythonを使用します。私はMinecraftサーバーを所有していません。

私の計画では、Minecraftサーバーから送信されたパケットを(信頼性は高くなっていますが難しかったが)直接読み取る方法や、バックアップ計画として、テキストをスクレイプする方法を見つけることができます。私はフォントをmonospacedに変更できるリソースを見つけました。これは、フォントを読み込む信頼性の高い方法を提供し、各文字の画面上に完全に一貫した場所を作成すると信じています。私は黒に近いがかなりはない方向に向けることができるが、そうしたくないことを好むだろう。上に描かれているように、フォントにはさまざまな色があります。

上記のように縮小しても、私はまだPythonを使ってテキストに変換する方法がわかりません。

私のアプローチに関するヒント?どのように私はサーバーから来るパケットを読むことができたかのヒント?私の画面からテキストを掻くことに関するヒント?

+0

おそらく、サーバーが受信するトラフィックを傍受したいと思うでしょう。 Pythonはこの仕事のためのツールではありません(Pythonラッパーを使用してバニラサーバーを実行している場合を除きます).-ヘルプが必要な場合は、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を参照してください。このプログラムには、直接またはソースを参照するのに役立つさまざまなプログラムへのリンクがあります。

たとえば、ユーティリティでは、最初に表示されるのはロギングプロキシです。

そして少し下に、mc3p、PythonプロキシであるJoran Beasleyが提案したプログラムがあり、プラグインがサポートされています。これは1.2.5までしか動作しませんが、sadimusi/mc3pは1.4.2互換のフォークと主張します。 J.F. Sebastianによると、mc3pにはログプラグイン用のインターフェースがあるので、postgresにログを書き込むことができます。

パケットを自分で読みたい場合は、それほど難しくありません。一般的なTCPプロキシをPythonの数十行に書くことも、Pythonスクリプトにデータを送るnetcatの周りに2行のshellscriptに書き込むこともできます。

ハード部分がデータをインターセプトしていません。それはプロトコルを解析しています。 Minecraftはおそらく "Nightbane:1ドル100,000ドルで"、しかし "offer:Nightbane:1:tnt:100"や "\ x13 \ x09Nightbane \ x00 \ x01 \ x72 \ x00 \ x64"のようなものは送っていないでしょう。 wikiが言うことから、プロトコルは文書化されていますが、不十分で、時には不正確な場合もあります。また、wikiも時には間違っています。公式のコードは非常に醜いので、読みにくいです。つまり、おそらく、sadimusi/mc3pやMcPacketSnifferやProtoProxyのような他のプロジェクトの1つを読んで、おそらくそのプロジェクトを再実装するのではなく、そのプロジェクトを使うのが簡単かどうかを尋ねなければなりません。 。

いずれにしても、画面を削ることが最善の方法です。

1

実際には、Minecraftからチャットを読むのにさらに良い方法があり、スクリーンスクレーピングまたはパケットデコードのいずれも必要としません。

Minecraftは、チャットメッセージ(および他の多くのもの)をログファイルに自動的に1人プレイヤーとマルチプレイヤーで書き込みます。 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, 
関連する問題