Kupowanie samochodu za pomocą Pythona, RPI i Telegrama

Jakiś czas temu zacząłem rozglądać się za samochodem. Szybko znużyło mnie przeglądanie ofert na np. otomoto.pl, więc postanowiłem zautomatyzować cały proces i ułatwić sobie życie.

Pomysł na cały system jest bardzo prosty. Mam kod w Pythonie, który pobiera nowe oferty z otomoto.pl (dla wybranego przeze mnie samochodu). Kod jest uruchamiany co 10 minut na RPI za pomocą cron joba, a następnie wysyła do mnie wszystkie nowe oferty na kanale na Telegramie. Tym sposobem nie muszę tworzyć nowego systemu powiadomień, a mam informację od razu na i komórce, i komputerze.

Pierwszym krokiem jest naturalnie pobranie wszystkich ofert. Podzieliłem to na 3 funkcje: pobranie listy ofert na jednej stronie, pobranie szczegółów jednej oferty, a potem pobranie wszystkich stron. Wszystkie oferty będą zapisywane w pliku w formacie JSON, który będzie wczytywany na samym początku kodu. Tym sposobem będę mógł sprawdzić, które oferty są nowe, a które stare.

Pracę rozpoczynam od analizy kodu otomoto.pl, tutaj przyda się narzędzie do inspekcji kodu (Ctrl + Shift + I) i podglądu sieci (Ctrl + Shift + E). Szybko zauważam, że wszystkie oferty znajdują się w elemencie “article”:

clip_image002[6]

Dlatego w pierwszej funkcji, jaką stworzę podaję właśnie “article” nawigując za pomocą xpath. W parametrze URL są wszystkie filtry z otomoto.pl, na jakich mi zależy. Następnie pobieram wszystkie kawałki kodu pod “article” i sprawdzam jaki jest adres URL każdego z nich. Jeśli nie ma go w pliku ze starymi ofertami, pobieram szczegóły i wysyłam powiadomienie.

 

Aby pobrać VIN i Telefon musiałem sprawdzić ruch, jaki jest generowany przez stronę. Tym sposobem odkryłem pod jakim adresem te informacje się znajdują. Nie będę musiał przechodzić przez ReCaptcha ani uruchamiać JavaScript.

clip_image003

Na tej podstawie napisałem funkcję:

 

 

Aby pobrać VIN lub telefon wystarczy wkleić w przeglądarkę https://www.otomoto.pl/ajax/misc/vin/ + ID oferty, która znajduje się na końcu adresu każdej oferty.

Kolejna funkcja pobiera szczegóły każdej oferty zapisanej pod article. Tutaj również bardzo przydaje się inspekcja kodu. Na czerwono zaznaczyłem elementy, które mnie interesują:

image

Tutaj również nawigując za pomocą Xpath, pobieram informacje, które są dla mnie istotne. Dodatkowo, mając URL zdjęcia samochodu, pobieram to zdjęcie na dysk i zapisuje jako image.jpeg. To zdjęcie zostanie mi wysłane przez Telegram razem ze wszystkimi szczegółami oferty.

 

Aby pobrać wiele stron muszę mieć informację ile ich jest. Dlatego za pomocą inspektora sprawdzam, gdzie znajduje się to w kodzie HTML i pobieram za pomocą funkcji:

 

 

Mając już te kawałki kodu, mogłem zacząć wysyłkę poprzez Telegram. Żeby mieć taką możliwość musiałem stworzyć Bota. Aby to zrobić należy rozpocząć rozmowę z BotFather. Wystarczy napisać /newbot, podać nazwę Bota, a w odpowiedzi dostaniemy token.

clip_image005

Korzystając z tego tokena mogłem stworzyć dwie funkcje. Jedna do wysyłania wiadomości na czacie, a druga do wysyłania zdjęcia image.jpeg do czatu.

 

 

Mając już gotowy kod, mogłem zapisać do na moim RPI, który jest stale uruchomiony. Tym sposobem jestem pewien, że skrypt zawsze będzie działał. Aby kod odpalał się automatycznie skorzystałem z usługi CRON, która jest swoistym harmonogramem zadań na linux. Aby dodać nowe zadanie wpisuję:

 

A następnie dodaję w pliku adres mojego skryptu:

Taki zapis oznacza, że o dowolnego dnia, o dowolnej godzinie, która mi minuty 10, 20, 30 itp. skrypt zadziała.

I właśnie w ten sposób udało mi się stworzyć automat, który powiadamia mnie o ciekawych ofertach. Przykład działania:

clip_image006

Tym sposobem mogę być pierwszą osobą, która dzwoni do sprzedającego i mieć przewagę pierwszeństwa.

Poniżej cały kod. Zapraszam do komentowania.

 

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *