[PYTHON] Je veux faire un système de surveillance du système de réservation d'éducation physique SFC (version β)

introduction

Cet article a été écrit pour les étudiants du SFC de l'Université Keio. Je vais essayer d'expliquer la technologie d'une manière facile à comprendre, mais veuillez noter que l'explication du système d'éducation physique lui-même est omise.

`De plus, nous ne sommes pas responsables des dommages causés par le programme créé en se référant à cet article, veuillez donc le faire à vos propres risques lors de la création d'un système similaire. ''

Puisqu'il s'agit d'une version bêta, je la poste avec des améliorations infinies.

Objectif

Je souhaite faire une réservation rapide lorsqu'il y a un poste vacant dans la classe que je souhaite prendre avec le système de réservation d'éducation physique de SFC.

Lisez attentivement les conditions d'utilisation

Il n'y a pas de page dans le système d'éducation physique qui décrit les conditions d'utilisation, mais [Conditions du site de l'Université Keio](https://www.students.keio.ac.jp/com/other/contact/about-this-site. Notez ce qui suit en référence au HTML). ** ・ Ne divulguez pas d'informations sur le site au public extérieur ** ** ・ Vous êtes libre de créer un lien vers le système de réservation d'éducation physique, mais si vous incluez le lien dans un élément du site tel qu'une image, spécifiez-le. ** ** ・ L'accès excessif est sujet à BAN, donc demandez dans les limites du bon sens **

environnement

・ MacOS Catalina 10.15.5 ・ Python 3.8.0

Bibliothèque utilisée (lien vers le document officiel)

requêtes Une bibliothèque pour le transfert de données entre serveurs. Il est bon de comprendre que la commande curl est facile à utiliser
bs4 analyseur HTML python
lxml Introduit car Xpath ne peut pas être utilisé avec HTML, l'analyseur XML pour python et bs4 seul. Non requis si vous n'utilisez pas Xpath

Si vous ne comprenez pas comment utiliser Xpath, reportez-vous à cet article → Résumé de l'utilisation de Xpath

pyyaml Une bibliothèque pour lire des informations confidentielles car elles ont été enregistrées au format yaml.
time Utilisé pour contrôler l'intervalle d'accès.

Autre

LINE Notify Une API officielle pratique qui vous permet d'envoyer des notifications à votre compte LINE

Préparation de LINE Notify

https://notify-bot.line.me/ja/ Connectez-vous à votre compte LINE à partir du site ci-dessus et cliquez sur le bouton en haut à droite pour accéder à Ma page Il y a un bouton en bas de l'écran comme indiqué ci-dessous, alors cliquez dessus pour obtenir un jeton d'accès. スクリーンショット 2020-10-13 17.07.46.png

Code source

organisation des fichiers

・ Main.py (fichier d'exécution) ・ Secrets.yaml (un fichier qui recueille des informations confidentielles)

main.py


import requests
import yaml
from lxml import html
from bs4 import BeautifulSoup
import time

#Comme insecureRequestWarning est bruyant, supprimez-le
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)

#Lire les informations confidentielles d'un autre fichier
SECREATS = yaml.load(open('secrets.yaml').read(),Loader=yaml.SafeLoader)

def checkTargetClass(targetClass: str):
    '''
Connectez-vous et renvoyez le lien de réservation pour la leçon spécifiée s'il y a de la place disponible
    '''

    PE_SYSTEM_URL = 'https://wellness.sfc.keio.ac.jp/v3/' 

    #Démarrer une session
    session = requests.session()

    #S'identifier
    login_info = {
        'login':SECREATS['user'],
        'password':SECREATS['pass'],
        'submit':'login',
        'page':'top',
        'lang':'ja',
        'mode':'login',
        'semester':'20205'
    }
    
    #Exécution de la connexion
    res = session.post(PE_SYSTEM_URL, data=login_info, verify=False)
    res.raise_for_status() #S'il y a une erreur, soulevez une exception ici

    #Analyser dans un format qui peut être recherché par Xpath
    soup_parsed_data = BeautifulSoup(res.text, 'html.parser')
    lxml_coverted_data = html.fromstring(str(soup_parsed_data))

    #Détection du lien de la page de réservation&Bouge toi
    reservePageTag = lxml_coverted_data.xpath('//*[@id="sidenav"]/ul/li[4]/a')
    reservePageLink = reservePageTag[0].get('href')
    res = session.get(PE_SYSTEM_URL+reservePageLink)
    res.raise_for_status()

    #Perth
    soup_parsed_data = BeautifulSoup(res.text, 'html.parser')
    lxml_coverted_data = html.fromstring(str(soup_parsed_data))

    #Obtenez une liste des cours disponibles et un lien vers la page de confirmation de réservation
    targetElemChunk = lxml_coverted_data.xpath('//*[@id="maincontents"]/div[6]/table/tbody/tr')
    classInfoList = []
    for classInfoRow in targetElemChunk:
        className = classInfoRow[7].text
        reseveConfirmPageLink = classInfoRow[9].find('a').get('href')
        if targetClass in className:
            notify(className+PE_SYSTEM_URL+reseveConfirmPageLink)
        classInfo = [className, reseveConfirmPageLink]
        classInfoList.append(classInfo)

def watch():
    while True:
        checkTargetClass('Science diététique')
        time.sleep(1800)
        

#Envoyer une notification
def notify(message):
    LINE_NOTIFY_URL = 'https://notify-api.line.me/api/notify'
    TOKEN = SECREATS['notify-token']
    headers = {'Authorization': f'Bearer {TOKEN}'}
    data = {'message': f'message: {message}'}
    requests.post(LINE_NOTIFY_URL, headers = headers, data = data)

def main():
    watch()

if __name__ == "__main__":
    main()

secrets.yaml


user: 'Identifiant de connexion'
pass: 'mot de passe'
notify-token: 'Jeton émis par l'API LINE'

Comment utiliser

Exécutez python main.py``` à partir de la ligne de commande et laissez-le tel quel

Points d'amélioration

・ Je souhaite déplacer le fichier vers le serveur car il n'est pas pratique de le laisser définitivement. ・ Je veux en faire une application Web et l'utiliser avec l'interface graphique ・ Je règle la fréquence d'accès toutes les 1800 secondes, mais il peut être possible de raccourcir un peu l'intervalle. ・ Ou, si vous pouvez identifier le moment où les annulations se produisent fréquemment, vous pourrez peut-être le supporter en accédant fréquemment uniquement pendant cette période.

Recommended Posts

Je veux faire un système de surveillance du système de réservation d'éducation physique SFC (version β)
Je veux faire un programme d'automatisation!
Je veux faire un jeu avec Python
Je veux être OREMO avec setParam!
Je veux faire des crises de ma tête
Je veux créer du code C ++ à partir de code Python!
Je veux convertir une image en WebP avec sucette
Je souhaite développer des applications Android sur Android (débogage)
[Python] Je veux faire d'une liste imbriquée un taple
J'ai essayé de créer une application OCR avec PySimpleGUI
Je souhaite améliorer l'efficacité avec Python même dans les systèmes expérimentaux (2) RS232C et pySerial
Je souhaite améliorer l'efficacité avec Python même dans un système expérimental (1) Installer Anaconda avec Chocolatey
Je souhaite spécifier une autre version de Python avec pyvenv
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux faire une macro de clic avec pyautogui (désir)
Je veux faire une macro de clic avec pyautogui (Outlook)
Je souhaite convertir une chaîne de caractères ISO-8601 en heure japonaise
Je veux ajouter un joli complément à input () en python