Automat licytacyjny AWP
Program, który automatycznie licytuje pakiety części na aukcjach. Przeszedł od Selenium, przez sześć przeglądarek headless, po bezpośrednie endpointy bez przeglądarki. Gra jak snajper, bo nie licytuje pierwszy, przebija z losowym skokiem i trzyma twardy limit ceny. Dostarcza wygrane pakiety do Stacji.
- 99,9%
- wygranych licytacji
- ~50 ms
- odświeżanie ofert
- ~10 ms
- oddanie strzału
- Python
- CustomTkinter
- Selenium
- Web scraping
- API
- Multithreading

Wprowadzenie
Firma kupuje części w pakietach wygrywanych na aukcjach. Aukcja kończy się o 16:00:00, a wygrywa ten, kto do tej sekundy złoży najwyższą ofertę. Liczy się timing, bo decydują ostatnie sekundy.
Napisałem AWP, program, który licytuje za nas. Nazwę wziąłem od snajperki z CS:GO, bo cała sztuka polega na jednym, dobrze wymierzonym strzale na końcu. Stoi na Pythonie z biblioteką CustomTkinter i działa tak samo na Windowsie i macOS.
Trzy wersje
Program dochodził do obecnej formy w trzech krokach, a każdy zdejmował wąskie gardło poprzedniego.
- Selenium. Pierwsza wersja wchodziła na każdą aukcję i klikała wszystkie oferty, a po cenę minimalną musiała wejść w szczegóły. Działała wolno, bo każde kliknięcie czekało, aż strona się załaduje i wyrenderuje.
- Sześć przeglądarek. Druga wersja była wielowątkowa. Otwierała sześć przeglądarek headless i dzieliła między nie pracę: jedne odświeżały oferty, inne oddawały strzały.
- Bezpośrednie endpointy. Obecna wersja wymagała rozpracowania, co i jak leci na serwer aukcji. Znalazłem endpointy do oddania strzału i do odświeżania ofert, więc przeglądarka przestała być potrzebna. Doszły do tego optymalizacje. Dziś jedynym hamulcem programu jest limit pieniędzy, do którego ma licytować.
Strategia licytowania
Program nie licytuje pierwszy. Dopóki nikt nie podbije ceny, AWP czeka. Dopiero gdy ktoś inny odda ofertę, od razu ją przebija, więc sami nie nakręcamy ceny.
Resztę zachowania ustawiasz na dole okna.
- minimalny i maksymalny skok ceny, a między tymi wartościami program losuje, żeby nie podbijać zawsze o tę samą kwotę,
- maksymalna cena, do której wolno licytować,
- przebijanie tylko po cudzej ofercie, opisane wyżej,
- moment startu, czyli od kiedy program zaczyna oddawać strzały.
Program dzieli się na dwie tabele. U góry jest filtrowanie i lista wszystkich dostępnych aukcji. Niżej siedzą ustawienia licytowania dla ofert, w których bierzemy udział.
Wątki i odświeżanie
Przy starcie ustawiasz, ile wątków przeznaczyć na program. Każda aktywna oferta dostaje jeden osobny wątek tylko do oddawania strzałów, żeby nic jej nie blokowało. Pozostałe wątki odświeżają oferty.
Przy ośmiu wątkach i czterech ofertach cztery wątki strzelają, po jednym na ofertę, a cztery odświeżają. Starty wątków rozkładam równomiernie w czasie, więc w każdej chwili któryś z nich właśnie kończy odświeżanie. W efekcie oferty odświeżają się co około 50 ms, a oddanie strzału zajmuje około 10 ms.
Trzecia wersja licytuje prosto po endpointach, bez przeglądarki. Jedynym hamulcem został limit pieniędzy, do którego program ma dobić.
Rezultaty
- Program wygrywa 99,9% licytacji, w których bierze udział.
- Trzecia wersja licytuje bezpośrednio po endpointach, bez przeglądarki. Oferty odświeżają się co około 50 ms, a strzał schodzi w około 10 ms.
- Strategia snajpera sprawia, że program nie licytuje pierwszy, przebija z losowym skokiem ceny i trzyma twardy limit, więc nie przepłaca.
- Jedna aplikacja na Windowsa i macOS.
- Wygrane pakiety trafiają prosto do Stacji, która przetwarza je na części.