Jak napisać własnego bota do gry przeglądarkowej?

Myślałeś kiedyś może nad napisaniem własnego bota do jakiejkolwiek gry, by otrzymywać extra bonusy lub po prostu wykonać jakąś akcję, podczas, gdy nie ma Cię przy komputerze? Jeśli tak, to właśnie w tym poście dowiesz się, jak w łatwy sposób to osiągnąć.

Na początku parę słów sprostowania – w tytule wprawdzie są gry przeglądarkowe, jednakże chodzi mi o wysyłanie zapytań do serwera HTTP i odbieranie odpowiedzi, więc nie wszystkie gry przeglądarkowe będzie dało się w poniższy sposób zautomatyzować, jednakże z drugiej strony znajdą się pewnie tytuły, które nie są przeglądarkowe, jednakże korzystają z HTTP.

Wykorzystamy Google App Engine oraz język Python w wersji 2.7 (w tej wersji jest wspierany przez GAE). GAE wprawdzie wspiera Javę, jednakże pisząc w Pythonie mamy to udogodnienie, iż kodu nie trzeba kompilować i możemy skorzystać z linii Pythona, w której to można wydawać polecenie po poleceniu zachowując bieżący stan VMki Pythona. GAE wspiera także język GO oraz całkiem niedawno dodany PHP.

Obsługa protokołu HTTP

Gdy już zainstalujesz interpreter w systemie zalecam teraz go włączyć i czytając to, co znajduje się poniżej, na bieżąco testować różne możliwości. Odradzam wykorzystywanie interpreterów online (niektóre akcje trwają bardzo długo).

Na początku należy zaimportować potrzebne moduły:

Następnie określamy parametry zapytania POST/GET/(…) oraz nagłówki HTTP jako słowniki {nazwa: wartość}. Należy pamiętać, by nie okroić zbytnio zapytania (jak np. z poprawnej nazwy przeglądarki), bo serwer może nie wykonać naszego zapytania i przekierować nas przykładowo na stronę główną. Na ile możemy sobie pozwolić można sprawdzić przy wykorzystaniu dowolnego debuggera proxy, jak np. Charles czy Fiddler 2.

Kolejną ważną sprawą, o której zapomnieć nie można, jest nawiązanie połączenia HTTP. Uwaga! Z własnych doświadczeń i innych internautów wiem, iż warto jest odnawiać połączenie przed każdorazowym wykonaniem zapytania, ponieważ w przeciwnym bardzo często występują błędy (połączenie keep-alive bez tego ‚keepu’). Można więc pokusić się o stworzenie specjalnej metody/funkcji.

Następnie należy wysłać zapytanie do serwera i odebrać odpowiedź. W przypadku wystąpienia timeoutu próba uzyskania odpowiedzi zakończy się rzuceniem wyjątku. Zwracam uwagę na odpowiednie wcięcia w kodzie – w Pythonie to od nich zależy przynależność danej instrukcji do konkretnego bloku, np. pętli, funkcji czy warunku.

W tym momencie ważne jest przeanalizowanie odpowiedzi. Przy logowaniu serwer wyśle inną odpowiedź przy poprawnym zalogowaniu się niż przy podaniu złych danych. Tu zalecam za pomocą dowolnego debuggera proxy przeanalizować reakcję serwera na różne przypadki. Może być tak, że np. przy poprawnym zalogowaniu się zostaniemy przekierowani na inną stronę niż ta dedykowana logowaniu (logiczne, nie?) – np. odpowiedź „302 Found”.
Gdy już stwierdzimy, iż zostaliśmy poprawnie zalogowani, trzeba zadbać o to, by serwer przy następnym zapytaniu nas rozpoznał. Zazwyczaj trzeba ustawić ciasteczka (często wystarcza jedno konkretne), które przysyła nam serwer w nagłówku HTTP odpowiedzi, jednakże warto ustawić wszystkie:

W tym momencie z odpowiednio zmodyfikowanym nagłówkiem możemy wysyłać kolejne zapytania do serwera, a on nas rozpozna. Gwoli wyjaśnienia powyższego kodu – pojedynczy nagłówek jest reprezentowany jako dwuelementowa tupla, gdzie pierwszym elementem jest nazwa nagłówka (np. ‚Set-Cookie’), a drugim jego wartość. Więcej o httplibie dla Pythona możesz znaleźć tutaj.

W tym momencie jesteś już w stanie napisać prosty skrypt, który zaloguje Cię do gry i np. podpije ofertę w domu aukcyjnym czy znajdzie jakąś pracę dla naszej postaci. Jakie i gdzie zapytania należy konkretnie wysłać? To zależy od gry. Po prostu popatrz w źródło strony (a konkretniej formularz, poprzez który wysyłasz zapytanie) i będzie wszystko jasne. Można także posłużyć się w tym celu debuggerem proxy.

Wprowadzenie do Google App Engine

Jeżeli nie stoi Ci na przeszkodzie pozostawienie komputera 24/7 w celach bocenia tudzież masz już własny serwer, na którym możesz uruchomić skrypt Pythona to GAE nie jest Ci potrzebne, jednakże zachęcam Cię do zapoznania się z tą ciekawą usługą. Na początku powinieneś zarejestrować własną aplikację na stronie GAE: https://appengine.google.com/ (wymagane konto Google) oraz ściągnąć Google App Engine Launcher – program dedykowany deploymentowi – dostarczony wraz z odpowiednim SDK dla Pythona. W GAEL utwórz nową aplikację o tej samej nazwie, co zarejestrowana na GAE online. W folderze powinieneś znaleźć conajmniej: app.yaml, main.py, cron.yaml. Jeżeli jakiś plik nie istnieje możesz go spokojnie utworzyć.

app.yaml

Pole application jest bardzo ważne – to nazwa naszej aplikacji zarejestrowanej online. Jednym z ważniejszych pól jest tutaj handlers. To ono określa, co się stanie w zależności od konkretnej końcówki URL (określonej regexem). script: main.app oznacza, że obiekt o nazwie app w pliku main.py jest handlerem zapytania (o tym poniżej).

main.py

Obiekt app, który wskazaliśmy w pliku app.yaml, służy do skierowania sterowania w odpowiednie miejsce – w zależności od końcówki adresu URL, np. appname.appspot.com/run spowoduje w tym przykładzie przekazanie sterowania do BotHandler.

cron.yaml

Więcej informacji o konfigurowaniu crona możesz znaleźć tutaj.

Deployment aplikacji

Teraz wystarczy uruchomić Google App Engine Launcher, wybrać utworzoną wcześniej aplikację, nacisnąć przycisk „Deploy”, podać swoje dane konta Google i gotowe! Możesz sprawdzić czy aplikacja działa, przy okazji zerknąć na logi i nacieszyć się tym jakże wspaniałym widokiem :).

GAEL i log

Google App Engine Launcher wraz z logami w tle.

Jeżeli zainteresowałeś się technologią GAE to zachęcam do zerknięcia tutaj. Możesz również poszukać informacji o obsłudze innych języków lub konkretnych elementów platformy, jak np. baza danych.

Podsumowanie i przykład

Przedstawiłem w tym poście w wielkim skrócie obsługę protokołu HTTP w języku Python i przy okazji zaprezentowałem minimum wymagane do umieszczenia aplikacji na serwerach Google’a. Przykład (kod źródłowy) bota do pewnej gry możesz znaleźć tutaj. KOD ŹRÓDŁOWY ZAMIESZCZONY WYŁĄCZNIE W CELACH EDUKACYJNYCH ZA ZGODĄ ADMINISTRATORA GRY – ZAKAZ UŻYWANIA W CELU OSIĄGNIĘCIA JAKIEJKOLWIEK KORZYŚCI W GRZE.
Mam nadzieję, iż ten post bardzo Wam się spodobał. Zachęcam do subskrypcji poprzez kanał RSS tudzież mailowo i serdecznie pozdrawiam 🙂

5 myśli nt. „Jak napisać własnego bota do gry przeglądarkowej?

      • Wcześniej nie interesowałem się tym zagadnieniem, trochę mnie te POSTy i GETy przerażały. A to wcale nie takie trudne :> Myslę, że się odezwę w razie jakichś strasznych problemów 😉

    • Wszystko jest zależne od kodu po stronie serwera. Kod 200 OK oznacza, że zapytanie do serwera zostało wykonane poprawnie. Wyświetlenie komunikatu o błędnych danych do logowania także jest poprawnym zachowaniem. Wykorzystaj jakiegoś debuggera proxy (polecam Fiddlera 2/Fiddlera 4 – świetny i darmowy) i przejrzyj komunikację z serwerem – co się zmienia, gdy podasz dobre hasło, a co się stanie, gdy podasz złe hasło. Może się okazać, że będziesz musiał przeglądać zwrócony kod HTML (i do tego, jak niemalże wszystkiego, są już istniejące pythonowe moduły).
      PS jeśli nie chcesz męczyć się z ustawianiem ciasteczek samemu, przyjrzyj się modułowi ‚requests’ (nie wiedziałem o nim w trakcie pisania postu).

Dodaj komentarz