Prise de rendez-vous automatique sur Doctolib - COVID 19

Ceci est une expérimentation, et n'est pas encore terminé

But initial

  1. utiliser Selenium et selenium Python pour automatiser l'utilisation du site https://partners.doctolib.fr/hopital-public/perigueux/vaccination-covid?speciality_id=5494&enable_cookies_consent=1,

  2. vérifier si le site a changé, et m'envoyer un SMS si oui.


Premier tutoriel pour prendre en main selenium

Note : je n'avais jamais utilisé selenium ou ce genre de module pour contrôler un navigateur en mode "headless". Ce n'est pas très compliqué, et j'ai trouvé que ce petit tutoriel est bien fait : https://pythonbasics.org/selenium-firefox-headless/ Cette documentation est bien complète, pour le module Python de selenium.

In [1]:
URL = "https://partners.doctolib.fr/hopital-public/perigueux/vaccination-covid?speciality_id=5494&enable_cookies_consent=1"
In [2]:
from selenium import webdriver

try:
    print(f"Downloading '{URL}'...")
    firefoxOptions = webdriver.FirefoxOptions()
    firefoxOptions.headless = True
    browser = webdriver.Firefox(options=firefoxOptions)

    browser.get(URL)
    print(browser.page_source[:500])
finally:
    try:
        browser.close()
    except:
        pass
Downloading 'https://partners.doctolib.fr/hopital-public/perigueux/vaccination-covid?speciality_id=5494&enable_cookies_consent=1'...
<html lang="fr"><head data-country="fr" data-env="production"><meta charset="utf-8"><meta content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" name="viewport"><meta content="noindex" name="robots"><meta content="nofollow" name="robots"><meta content="Trouvez rapidement un spécialiste près de chez vous et prenez rendez-vous gratuitement en ligne en quelques clics" name="description"><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-N

J'ai bien réussi à installer et utiliser Selenium. Ca marche bien !

Solution

J'aurai besoin de ces modules là :

In [3]:
import time
from datetime import datetime
import urllib.request
import subprocess
from selenium import webdriver

Vérifions le contenu de la page, et voir si elle affiche ce message suivant :

En raison d'une forte demande, ce centre n'a plus de disponibilités : 3362 vaccinations vont avoir lieu dans les 28 prochains jours. Réessayez prochainement ou cherchez un autre centre.

In [7]:
print(f"Downloading '{URL}'...")
firefoxOptions = webdriver.FirefoxOptions()
firefoxOptions.headless = True
browser = webdriver.Firefox(options=firefoxOptions)

browser.get(URL)
Downloading 'https://partners.doctolib.fr/hopital-public/perigueux/vaccination-covid?speciality_id=5494&enable_cookies_consent=1'...
<html lang="fr"><head data-country="fr" data-env="production"><meta charset="utf-8"><meta content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" name="viewport"><meta content="noindex" name="robots"><meta content="nofollow" name="robots"><meta content="Trouvez rapidement un spécialiste près de chez vous et prenez rendez-vous gratuitement en ligne en quelques clics" name="description"><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-N
In [11]:
message = "ce centre n'a plus de disponibilités"

if message in browser.page_source:
    print(f"{URL} indique :\n{message}")
else:
    print(f"{URL} n'indique pas :\n{message}\nPeut être qu'il y a des disponibilités désormais !")
    !FreeSMS.py f"{URL} semble indiquer qu'il y a des disponibilités désormais."
https://partners.doctolib.fr/hopital-public/perigueux/vaccination-covid?speciality_id=5494&enable_cookies_consent=1 indique :
ce centre n'a plus de disponibilités

Quand on a fini, on ferme le navigateur :

In [ ]:
browser.close()

Automatisation toutes les 55 minutes

Je ne ferai pas ça dans Python mais avec un simple script bash et un watch

In [71]:
!watch -help
Usage:
 watch [options] commande

Options:
  -b, --beep             émet un bip si la commande sort avec un code non nul
  -c, --color            interprète les séquences de couleurs et de styles ANSI
  -d, --differences[=<permanent>]
                         met en évidence les changements entre mises à jours
  -e, --errexit          termine si la commande sort avec un code non nul
  -g, --chgexit          termine quand la sortie de la commande change
  -n, --interval <sec>   secondes de délai entre mises à jours
  -p, --precise          essaie d'exécuter la commande à intervalles réguliers
  -t, --no-title         masque l'en-tête
  -x, --exec             passe la commande à exec au lieu de « sh -c »

 -h, --help     affiche cette aide et termine
 -v, --version  affiche les informations de version et sort

Pour plus de détails, consultez watch(1).

Conclusion

C'était drôle. C'était une expérimentation. Mais ne vous servez pas de ça !