7

Minecraftで、下の写真のようにチャットを自動的に読む方法を見つけたいと思っていました。

minecraftチャットのスクリーンショット

仮想ショップで行われたトランザクションをPostgreSQLデータベースに記録するため。できればPythonを使用してください。私はMinecraftサーバーを所有していません。

私の計画は、Minecraftサーバーから送信されたパケットを直接読み取る方法を見つけるか(信頼性のために推奨されますが、難易度は不明です)、バックアップ計画として、テキストをスクリーンスクレイピングする方法を見つけることです。フォントを等幅に変更できるリソースをいくつか見つけました。これにより、フォントをより信頼性の高い方法で読み取ることができ、各文字の画面上に完全に一貫した場所を作成できると思います。私は黒に近い方向を向くことができましたが、完全ではありませんが、そうする必要はありません。上の写真のように、フォントにはさまざまな色があります。

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

私のアプローチに関するヒントはありますか?サーバーからのパケットを読み取る方法についてのヒントはありますか?画面からテキストをスクレイピングするためのヒントはありますか?

4

2 に答える 2

14

実際、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,

または、チャットをリアルタイムで読みたい場合は、この回答のコードから少し変更した以下のコードを使用できます。

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,
于 2018-03-03T16:04:22.460 に答える
2

まず、kuyanが提案したように、http: //wiki.vg/Main_Pageを参照してください。これには、直接またはソースを参照するために役立つ可能性のあるさまざまなプログラムへのリンクがあります。

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

そして少し下に、mc3pプラグインをサポートするPythonプロキシであるJoranBeasleyによって提案されたプログラムがあります。1.2.5までしか機能しsadimusi/mc3pませんが、1.4.2互換のフォークであると主張しています。JF Sebastianが言うように、mc3pログプラグインのインターフェースがあるので、postgresにログを記録するインターフェースを書くことができます。

自分でパケットを読みたいのなら、それは難しいことではありません。汎用TCPプロキシを数十行​​のPythonで作成するか、データをPythonスクリプトにティーするnetcatの周囲に2行に1つのシェルスクリプトを作成することができます。

難しい部分はデータを傍受することではありません。プロトコルを解析しています。Minecraftはおそらく「Nightbane:1 tnt for 100.000 Dollars」ではなく、「offer:Nightbane:1:tnt:100」や「\ x13 \ x09Nightbane \ x00 \ x01 \ x72 \ x00\x64」のようなものを送信しています。ウィキの言うことから、プロトコルは文書化されていますが、不十分で、時には不正確であり、ウィキも間違っていることがあり、公式コードは非常に醜くて読みにくいです。つまり、プロトコルを理解するための最良の方法は、おそらくsadimusi / mc3pまたはMcPacketSnifferやProtoProxyなどの他のプロジェクトのいずれかを読むことです。その時点で、プロジェクトを再実装するのではなく、そのプロジェクトを使用する方が簡単かどうかを尋ねる必要があります。 。

とにかく、画面をこすることはあなたの最後の手段であるべきです。

于 2012-12-01T00:41:33.017 に答える