2012-12-01 14 views
6

W Minecraft miałem nadzieję znaleźć sposób, aby automatycznie odczytać chat jak na zdjęciu poniżejAutomatycznie czytaj czat tekst z Minecraft

minecraft chat screenshot

W celu zarejestrowania transakcji dokonywanych w wirtualnym sklepie w bazie danych PostgreSQL. Najlepiej używać Pythona. Nie jestem właścicielem serwera Minecraft.

Moim planem jest albo znaleźć sposób na bezpośrednie odczytanie pakietów wysłanych z serwera Minecrafta (zalecane dla niezawodności, ale o nieznanej trudności) lub jako plan awaryjny może dowiedzieć się, jak wyskrobać tekst. Znalazłem trochę zasobów, które pozwoliłyby mi zmienić czcionkę na monospaced, co zapewniłoby bardziej wiarygodny sposób czytania czcionki i uważam, że tworzą idealnie spójne miejsca na ekranie dla każdej postaci. Mógłbym zmierzyć kierunek, który jest bliski czerni, ale niezupełnie, ale wolałby nie mieć. Jak pokazano powyżej, istnieje wiele różnych kolorów czcionki, z którymi można się również zmagać.

Nawet po zmniejszeniu go w sposób opisany powyżej, nadal nie jestem pewien, jak przekształcić go w tekście za pomocą Pythona.

Jakieś wskazówki dotyczące mojego podejścia? Jakieś wskazówki, jak mogę odczytać pakiety przychodzące z serwera? Wszelkie wskazówki dotyczące skrobania tekstu z mojego ekranu?

+0

Prawdopodobnie będziesz chciał przechwycić ruch, który otrzymuje serwer. Python nie jest zbyt wykonalnym narzędziem do tego zadania (chyba że używasz serwera Vanilla z opakowaniem Pythona) - więcej pomocy znajdziesz na http://wiki.vg/Main_Page i #mcdevs na irc.freenode.net . – Natan

+1

@kuyan: On nie jest właścicielem serwera, chce nagrywać rzeczy na swoim kliencie. – abarnert

+2

może to pomoże? https://github.com/mmcgill/mc3p –

Odpowiedz

2

Po pierwsze, jak kuyan zasugerował, zobacz http://wiki.vg/Main_Page, która zawiera linki do różnych programów, które mogą być użyteczne, bezpośrednio lub za źródło patrzeć.

Na przykład, pod Utilities, pierwszą rzeczą, która przychodzi to proxy logowania.

I nieco w dół, jest mc3p, program sugerowany przez Jorana Beasley'a - proxy Pythona, z obsługą wtyczek. Działa tylko do wersji 1.2.5, ale sadimusi/mc3p twierdzi, że jest widelcem zgodnym z 1.4.2. Jak mówi J.F. Sebastian, mc3p ma interfejs dla wtyczek logów, więc możesz po prostu napisać taki, który loguje się do postgreSzu.

Jeśli chcesz przeczytać pakietów siebie, że nie jest to trudne. Możesz napisać ogólny proxy TCP w kilkudziesięciu wierszach Pythona - lub napisać jeden na 2 linie skoroszytu wokół netcata, który kieruje dane do twojego skryptu Python.

Najtrudniejsze nie jest przechwytywanie danych; to parsowanie protokołu. Minecraft prawdopodobnie nie wysyła "Nightbane: 1 tnt za 100 000 dolarów", ale coś w stylu "oferta: Nightbane: 1: tnt: 100" lub "\ x13 \ x09 Nightbane \ x00 \ x01 \ x72 \ x00 \ x64". Z tego, co mówi wiki, protokół jest udokumentowany, ale kiepsko, a czasami niedokładnie, a wiki jest czasem niepoprawne, a oficjalny kod jest bardzo brzydki i trudny do odczytania. Co oznacza, że ​​najlepszym sposobem na poznanie protokołu jest prawdopodobnie przeczytanie sadimusi/mc3p lub jednego z innych projektów, takich jak McPacketSniffer lub ProtoProxy, w którym to momencie musisz zapytać, czy łatwiej byłoby po prostu użyć tego projektu zamiast go ponownie wdrożyć. .

W każdym razie, skrobanie ekranu powinien być ostatecznością.

1

W rzeczywistości jest jeszcze lepszy sposób, aby przeczytać czat z Minecrafta i nie wymaga skrobania ekranu ani dekodowania pakietów.

Minecraft automatycznie zapisuje wiadomości czatu (i wiele innych rzeczy) w plikach dziennika, zarówno w trybie jednoosobowym, jak i wieloosobowym. W systemie Windows są one umieszczone pod numerem %appdata%/.minecraft/logs. Poprzednie logi są kompresowane za pomocą gzip, ale protokół ostatniej sesji jest zapisywany w pliku tekstowym latest.log w czasie rzeczywistym. Wiadomości na czacie zawierają tekst [Client thread/INFO]: [CHAT].Można też otworzyć go tak samo, jak z normalnym pliku przy użyciu:

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, 

Lub jeśli chcesz przeczytać czat w czasie rzeczywistym, można użyć poniższy kod, lekko zmodyfikowany z kodu z tego 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,