2012-12-01 18 views
6

In Minecraft speravo di trovare un modo per leggere la chat automaticamente come nella foto qui sottoleggere automaticamente chattare testo da Minecraft

minecraft chat screenshot

Al fine di registrare le transazioni effettuate nel negozio virtuale in un database PostgreSQL. Preferibilmente usando Python. Non possiedo il server Minecraft.

Il mio piano è quello di trovare un modo per leggere direttamente i pacchetti inviati dal server di Minecraft (preferito per affidabilità, ma di difficoltà sconosciuta) o come piano di backup forse capire come schermare il testo. Ho trovato alcune risorse che mi permetteranno di cambiare il font a monospaced, il che fornirebbe un modo più affidabile di leggere il font e credo crei punti perfettamente coerenti sullo schermo per ogni personaggio. Potrei affrontare una direzione che è vicina al nero ma non del tutto, ma preferirei non doverlo fare. Come nella foto sopra, vedi che ci sono molti colori diversi di font con cui fare i conti.

Anche dopo averlo ridotto come descritto sopra, non sono ancora sicuro su come trasformarlo in testo usando python.

Qualche consiglio sul mio approccio? Qualche suggerimento su come posso leggere i pacchetti provenienti dal server? Qualche consiglio su come raschiare il testo dal mio schermo?

+0

Probabilmente vorrete intercettare il traffico ricevuto dal server. Python non è uno strumento troppo fattibile per questo lavoro (a meno che tu non stia utilizzando un server Vanilla con un wrapper Python) - per ulteriori informazioni, controlla http://wiki.vg/Main_Page e #mcdevs su irc.freenode.net . – Natan

+1

@kuyan: non possiede il server, vuole registrare le cose sul suo client. – abarnert

+2

forse questo aiuterà? https://github.com/mmcgill/mc3p –

risposta

2

Innanzitutto, come suggerito da kuyan, vedere http://wiki.vg/Main_Page, che contiene collegamenti a vari programmi che possono essere utili, direttamente o per l'origine.

Ad esempio, in Utilità, la prima cosa che emerge è un proxy di registrazione.

E un po 'giù, c'è il mc3p, il programma suggerito da Joran Beasley, un proxy Python, con supporto per i plugin. Funziona solo fino a 1.2.5, ma il sadimusi/mc3p afferma di essere un fork compatibile con 1.4.2. Come dice J.F. Sebastian, mc3p ha un'interfaccia per i plugin di log, quindi puoi semplicemente scriverne uno che registri su postgres.

Se si desidera leggere da soli i pacchetti, non è difficile. Puoi scrivere un proxy TCP generico in alcune dozzine di righe di Python o scrivere uno su 2 righe di shellscript attorno a netcat che trasmette i dati al tuo script Python.

La parte difficile non è l'intercettazione dei dati; sta analizzando il protocollo. Probabilmente Minecraft non sta inviando "Nightbane: 1 tnt per 100.000 dollari ciascuno", ma qualcosa come "offerta: Nightbane: 1: tnt: 100" o "\ x13 \ x09Nightbane \ x00 \ x01 \ x72 \ x00 \ x64". Da quanto dice il wiki, il protocollo è documentato, ma scarsamente, a volte impreciso, e il wiki è talvolta errato, e il codice ufficiale è molto brutto e difficile da leggere. Il che significa che il modo migliore per capire il protocollo è probabilmente leggendo sadimusi/mc3p o uno degli altri progetti come McPacketSniffer o ProtoProxy, a quel punto devi chiedere se sarebbe più semplice usare quel progetto invece di reimplementarlo .

In ogni caso, raschiare lo schermo dovrebbe essere l'ultima risorsa.

1

C'è in realtà un modo ancora migliore per leggere la chat da Minecraft, e non richiede né lo screen scraping né la decodifica dei pacchetti.

Minecraft scrive automaticamente messaggi di chat (e numerose altre cose) per registrare i file, sia in singleplayer che in multiplayer. Su Windows, si trovano in %appdata%/.minecraft/logs. I registri precedenti vengono compressi utilizzando gzip, ma il registro della sessione più recente viene scritto nel file di testo latest.log in tempo reale. I messaggi di chat contengono il testo [Client thread/INFO]: [CHAT].È possibile aprirlo come si farebbe con un normale file utilizzando:

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, 

Oppure, se si desidera leggere chattare in tempo reale, è possibile utilizzare il codice qui sotto, leggermente modificato dal codice da questo 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, 
Problemi correlati