Automatyczne sprawdzanie szkolnego e-dziennika

Szkoła trwa, dzieci się uczą, e-dzienniki się zapełniają, a ja wymyśliłem sobie pewne ułatwienie życia. Nauczyciele dodają oceny i wiadomości o różnych godzinach, czasem wieczorem, a my sprawdzamy to po kilka razy dziennie – często okazuje się, że w e-dzienniku jest nowa wiadomość, coś pilnego, coś trzeba jutro przynieść, albo w ostatniej chwili zmienił się plan zajęć.

A co, gdyby tak sprawdzanie e-dziennika zautomatyzować? Dziennik, z którego korzysta szkoła naszych dzieci ma wprawdzie opcję powiadomień (płatną), ale została wyłączona. W regulaminie są wzmianki o dostępnie do API, ale takiego dostępu nie ma, a przynajmniej nie jest opisany. Dlatego zastanawiałem się, w jaki sposób to zautomatyzować, nie łamiąc przy tym regulaminu (nadmierne wykorzystanie serwera) czy też nie być posądzonym o omijanie zabezpieczeń serwisu.

Z pomocą przyszło Selenium   – dość proste narzędzie do automatyzacji przeglądarki. Po prostu uruchamiana jest wybrana przeglądarka (najczęściej Chromium, ale można użyć Firefoxa) w środowisku graficznym (choćby tylko wirtualnym) i „sterownik” wczytuje stronę, symuluje wprowadzanie hasła, klikanie w linki i odczytuje treść. Można więc powiedzieć, że jest to trochę bardziej rozbudowana forma autouzupełniania hasła, po prostu więcej tu automatyzacji 🙂 Ba, pozwala to nawet zmniejszyć częstotliwość korzystania z mobirega – po prostu jestem pewny, że przy nowych ocenach czy wiadomościach dostanę powiadomienie, a mniej istotne sprawy i tak sprawdzamy ręcznie (za to znacznie rzadziej).

Najważniejsze jest to, że z punktu widzenia serwisu nie ma żadnej różnicy, czy oceny sprawdzam osobiście, czy raz/dwa razy dziennie robi to program, który wczytuje przeglądarkę i po prostu klika za mnie. 

Co potrzeba:

  • Linux i przynajmniej podstawowa znajomość jego obsługi (pewnie uda się też uruchomić to w systemie Windows),
  • jakaś na stałe uruchomiona maszyna – u mnie to wynajęty VPS, choć myślałem też o Raspberry Pi, które służy mi za centrum sterowania mojego „inteligentnego domu”
  • Python z Selenium, choć oczywiście można korzystać z innych języków

Co do samego dziennika – jest to mobireg. Dziennik, który sprawiał trochę problemów. Jego bezpłatna wersja pozwalała tylko na pobieranie „stron” w pdf – dla każdego przedmiotu oddzielnie, a ich „generowanie” trwało bardzo długo. Ośmielę się stwierdzić, że trwało ułamek sekundy, ale oczekiwanie miało zachęcić do wykupienia przez rodzica abonamentu. Na dodatek, co najgorsze, bezpłatna wersja nie pozwalała na otrzymywanie wiadomości od nauczycieli – a to podstawowa poza ocenami funkcja, która bardzo ułatwia życie obu stronom – nauczycielom i rodzicom, ale traci sens, gdy nie wszyscy mogą te wiadomości odebrać. Od tego roku wszyscy mamy pełną wersję (pewnie za sprawą zmiany umowy którą zawiera szkoła) ale wyłączono możliwość powiadomień (a te i tak były dodatkowo płatne).

Do obsługi Selenium posłużyłem się Pythonem, za którego od dawna planowałem się zabrać, ale nie miałem dobrego powodu. Całość okazała się prostsza, niż sądziłem, a założenia są takie:

  1. Uruchamiam wirtualne środowisko graficzne z Chromium
  2. Selenium zamyka pojawiające się okno dialogowe, bo nasz e-dziennik sugeruje, że powinno się korzystać z Firefoxa. Tu kolejna uwaga dla Mobirega. Na co dzień używam „Liska”, ale myślałem, że czasy sugerowania właściwych przeglądarek dawno minęły (czy ktoś jeszcze pamięta obrazki typu „Ta strona działa poprawnie w Internet Explorer w rozdzielczości 1024×768)”? Tym bardziej, że to nie żadna aplikacja webowa pisana w JavaScriptowym frameworku, a zwykła „statyczna” strona z odnośnikami do podstron generowanych po stronie serwera.
  3. Wyszukiwane są pola loginu i hasła, sterownik symuluje przyciśnięcia klawiszy i wprowadza dane, po czym klika w przycisk. Mam dwoje dzieci, więc program musi wybrać, dla którego dziecka wpisać dane.
  4. Na kolejnej stronie sprawdzana jest ilość nowych wiadomości.
  5. Przechodzimy na stronę z ocenami, a tam odczytywane są wszystkie oceny.
  6. Jeśli są nowe oceny, zapamiętujemy je jako listę „przedmiot:oceny”, a jeśli w dotychczasowych ocenach coś się zmieniło, po prostu informuję o tym słowem „Zmiana”. Niczego więcej mi nie potrzeba.
  7. Wylogowanie z serwisu poprzez kliknięcie w link
  8. Porównanie ocen z poprzednimi wczytanymi z pliku
  9. Stworzenie wiadomości zawierającej zmiany i wysłanie jej – np. przez powiadomienie push na androida, albo e-mail.
  10. Zapisanie nowych ocen do kolejnego porównania.

Cały program uruchamiam przez crontab, żeby uruchamiał się automatycznie na przykład codziennie o 17.00:

ImieDziecka to argument, który po prostu ustawi odpowiednie dane logowania, a xvfb-run uruchamia skrypt w wirtualnym środowisku graficznym. Środowisko te można też odpalić wewnątrz skryptu:

ale tak jest po prostu prościej i nie trzeba obsługiwać różnych problemów, które mogą wyniknąć (środowisko zostaje wtedy w pamięci serwera).

A tu pełny kod, może nie idealny, ale skuteczny. Oceny nie są dokładnie sprawdzane (jeśli nauczyciel doda ocenę na końcu, pojawi się ona w wiadomości, ale jeśli dokona zmian w poprzednich ocenach – będzie tylko komunikat o zmianie. Brakuje też obsługi różnych nieprzewidzianych problemów – dlatego całość dałem w try…finally – żeby w razie czego przede wszystkim wylogować się ze strony bez wykonywania innych czynności.

 

 

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany.