[PYTHON] Ich möchte ein SFC-System zur Überwachung des Reservierungssystems für Sportunterricht (β-Version) erstellen.

Einführung

Dieser Artikel wurde für SFC-Studenten der Keio University geschrieben. Ich werde versuchen, die Technologie auf leicht verständliche Weise zu erklären, aber bitte beachten Sie, dass die Erklärung des Sportunterrichtssystems selbst weggelassen wird.

`Darüber hinaus sind wir nicht verantwortlich für Schäden, die durch das unter Bezugnahme auf diesen Artikel erstellte Programm verursacht werden. Machen Sie es daher bitte auf eigenes Risiko, wenn Sie ein ähnliches System erstellen. ``

Da es sich um eine Beta-Version handelt, veröffentliche ich sie mit unendlichen Verbesserungen.

Zweck

Ich möchte schnell reservieren, wenn in der Klasse, die ich mit dem Reservierungssystem für Sportunterricht von SFC belegen möchte, eine Stelle frei ist.

Lesen Sie die Nutzungsbedingungen sorgfältig durch

Es gibt keine Seite im Sportunterrichtssystem, die die Nutzungsbedingungen beschreibt, sondern Nutzungsbedingungen der Keio University Site. Beachten Sie Folgendes in Bezug auf HTML). ** ・ Geben Sie keine Informationen auf der Website an die Öffentlichkeit weiter ** ** ・ Es steht Ihnen frei, einen Link zum Reservierungssystem für den Sportunterricht zu erstellen. Wenn Sie den Link jedoch in ein Site-Element wie ein Bild aufnehmen, geben Sie ihn an. ** ** ・ Übermäßiger Zugriff unterliegt BAN, daher Anfrage im Rahmen des gesunden Menschenverstandes **

Umgebung

・ MacOS Catalina 10.15.5 ・ Python 3.8.0

Verwendete Bibliothek (Link zum offiziellen Dokument)

Anfragen Eine Bibliothek zum Übertragen von Daten zwischen Servern. Es ist gut zu verstehen, dass der Befehl curl einfach zu verwenden ist
bs4 Python-HTML-Parser
lxml Eingeführt, da Xpath nicht allein mit HTML, XML-Parser für Python und bs4 verwendet werden kann. Nicht erforderlich, wenn Sie Xpath nicht verwenden

Wenn Sie die Verwendung von Xpath nicht verstehen, lesen Sie diesen Artikel → Zusammenfassung der Verwendung von Xpath.

pyyaml Eine Bibliothek zum Lesen vertraulicher Informationen, da diese im Yaml-Format gespeichert wurden.
Zeit Wird zur Steuerung des Zugriffsintervalls verwendet.

Andere

LINE-Benachrichtigung Eine praktische offizielle API, mit der Sie Benachrichtigungen an Ihr LINE-Konto senden können

Vorbereiten der LINE-Benachrichtigung

https://notify-bot.line.me/ja/ Melden Sie sich von der oben genannten Website aus bei Ihrem LINE-Konto an und klicken Sie auf den Schalter oben rechts, um zu Meine Seite zu gelangen Am unteren Bildschirmrand befindet sich eine Schaltfläche (siehe unten). Klicken Sie also darauf, um ein Zugriffstoken zu erhalten. スクリーンショット 2020-10-13 17.07.46.png

Quellcode

Dateiorganisation

・ Main.py (Ausführungsdatei) ・ Secrets.yaml (eine Datei, die vertrauliche Informationen sammelt)

main.py


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

#Da unsichereRequestWarning laut ist, löschen Sie sie
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)

#Lesen Sie vertrauliche Informationen aus einer anderen Datei
SECREATS = yaml.load(open('secrets.yaml').read(),Loader=yaml.SafeLoader)

def checkTargetClass(targetClass: str):
    '''
Melden Sie sich an und senden Sie den Reservierungslink für die angegebene Lektion zurück, wenn Platz verfügbar ist
    '''

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

    #Starten Sie eine Sitzung
    session = requests.session()

    #Einloggen
    login_info = {
        'login':SECREATS['user'],
        'password':SECREATS['pass'],
        'submit':'login',
        'page':'top',
        'lang':'ja',
        'mode':'login',
        'semester':'20205'
    }
    
    #Login-Ausführung
    res = session.post(PE_SYSTEM_URL, data=login_info, verify=False)
    res.raise_for_status() #Wenn ein Fehler auftritt, lösen Sie hier eine Ausnahme aus

    #Analysieren Sie in einem Format, das von Xpath durchsucht werden kann
    soup_parsed_data = BeautifulSoup(res.text, 'html.parser')
    lxml_coverted_data = html.fromstring(str(soup_parsed_data))

    #Linkerkennung für Reservierungsseiten&Bewegung
    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))

    #Erhalten Sie eine Liste der verfügbaren Klassen und einen Link zur Reservierungsbestätigungsseite
    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('Ernährungswissenschaft')
        time.sleep(1800)
        

#Benachrichtigung senden
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: 'Anmelde-ID'
pass: 'Passwort'
notify-token: 'Von der LINE-API ausgegebenes Token'

Wie benutzt man

Führen Sie `` `python main.py``` über die Befehlszeile aus und lassen Sie es so wie es ist

Verbesserungspunkte

・ Ich möchte die Datei auf den Server verschieben, da es unpraktisch ist, sie dauerhaft zu belassen. ・ Ich möchte daraus eine Webanwendung machen und sie mit der GUI betreiben ・ Ich stelle die Zugriffsfrequenz alle 1800 Sekunden ein, aber es kann möglich sein, das Intervall etwas zu verkürzen. ・ Wenn Sie den Zeitpunkt ermitteln können, zu dem Stornierungen häufig auftreten, können Sie dies möglicherweise ertragen, indem Sie nur während dieser Zeit häufig darauf zugreifen.

Recommended Posts

Ich möchte ein SFC-System zur Überwachung des Reservierungssystems für Sportunterricht (β-Version) erstellen.
Ich möchte ein Automatisierungsprogramm erstellen!
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich möchte Passungen aus meinem Kopf machen
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Ich möchte Android-Apps auf Android entwickeln (Debug)
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich möchte die Effizienz mit Python auch in experimentellen Systemen verbessern (2) RS232C und pySerial
Ich möchte die Effizienz mit Python auch in einem experimentellen System verbessern. (1) Installieren Sie Anaconda mit Chocolatey
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich möchte eine ISO-8601-Zeichenfolge in japanische Zeit konvertieren
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen