Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht

Dieser Artikel ist der erste Tag des Adventskalenders 2019 der Tokyo City University. https://adventar.org/calendars/4282

Einführung

Hallo! Mein Name ist Ojie (@ 920oj) und ich studiere Informationssysteme an einer Universität namens Tokyo City University. Dieses Mal habe ich einen Adventskalender von Stadtgröße gebaut, also ich selbst Ich werde schreiben "Die Geschichte, wie man einen LINE-Bot macht, der Sie über ein 100-Yen-Frühstück an der Universität mit Python informiert"!

Hintergrund

Unsere Schule hat ein sehr profitables System, in dem Sie für 100 Yen frühstücken können. Da ich alleine in Tokio aus einer ländlichen Gegend lebe, ist es außerdem perfekt, wenn mir das Geld ausgeht.

image.png

Das sind 100 Yen

Dieses Menü wird jeden Morgen auf der Cafeteria-Website veröffentlicht, aber diese Website ist ein Songwriter und Sie müssen die App oder die Schulportal-Website durchgehen, um darauf zuzugreifen.

Aus diesem Grund habe ich beschlossen, die Cafeteria-Website jeden Morgen automatisch zu durchsuchen und eine LINE-Benachrichtigung zu erstellen, die LINE über das 100-Yen-Frühstück des Tages informiert.

Autorenumgebung

Python v3.7.1 pip 19.1.1 Windows 10 v1903

Was wurde gemacht

Tokyo City University Yokohama Campus Student Cafeteria 100 Yen Frühstück Benachrichtigung bot https://github.com/920oj/TCU-YC-Breakfast-Notify-Bot

image.png

Eine Benachrichtigung wird jeden Tag um 7:30 Uhr morgens (nur wenn Sie ein 100-Yen-Frühstück haben) so fliegen!

Denken Sie an die Implementierung

Holen Sie sich zuerst die Website für Schulspeisen mit Beautiful Soup. Da Sie sich anmelden müssen, um die Website für Schulspeisen zu durchsuchen, haben wir eine Richtlinie festgelegt, nach der Sie einen POST einmal auslösen müssen, um sich zu authentifizieren und dann mit der Sitzungs-ID zu kneten.

Bei genauerem Hinsehen gab es jedoch keine Authentifizierung, und ich hatte das Gefühl, mich zu authentifizieren, indem ich die ID und das Kennwort im Cookie im Klartext schrieb. (Ist es okay?)

(Ursprünglich ist die Sitzungs-ID nach der Authentifizierung (POST) mit der Tatsache verknüpft, dass die Authentifizierung bestanden wurde und die nachfolgenden Anforderungen bestanden wurden. Aus irgendeinem Grund funktioniert sie jedoch ohne POST. Es ist gut, weil es gut ist) (Es ist ursprünglich nicht gut)

Sitzungsbeziehung

Wenn Sie zur Anmeldeseite gehen, scheinen vorerst ein "Sitzungsschlüssel" und eine "Sitzungs-ID" angegeben zu sein.

def get_sessionid():
    #Erster Cookie-Erfassungsprozess
    r = requests.get('https://livexnet.jp/local/default.asp')
    first_access_cookie = str(r.headers['Set-Cookie'])
    
    # "ASPSESSIONID+Beliebige 8-stellige englische Hauptstadt"(24 alphabetische Zeichen)Erhalten
    asp_session = str(first_access_cookie[first_access_cookie.find("ASPSESSIONID"):first_access_cookie.find("; secure")])
    asp_session_key = str(asp_session[0:asp_session.find("=")])
    asp_session_id = str(asp_session[asp_session.find("="):].replace('=',''))
    return asp_session_key, asp_session_id

Das Framework ähnelt ASP.NET. Was ASPSESSIONID betrifft, so scheint es, dass am Ende ein 8-stelliger Großbuchstabe hinzugefügt wird. Der Rückgabewert dieser Funktion ist asp_session_key und asp_session_id, und es werden zwei Typen zurückgegeben.

Stellen Sie Cookie-Scraping ein

def get_breakfast_info(key,id):
    #Cookies vorbereiten (Informationen können sich in Zukunft ändern)
    site_cookies = {
        key: id, 
        'KCD': '02320', 
        'company_id': SITE_ID, 
        'company_pw': SITE_PASS, 
        'wrd': 'jp', 
        'dip': '0', 
        'ink': 'a', 
        'bcd': '02320', 
        'val': 'daily'
    }
    
    #Zugriff auf Menü / Ernährungstabellenseite
    url = 'https://reporting.livexnet.jp/eiyouka/menu.asp?val=daily&bcd=02320&ink=a&col=&str=' + today_data
    r = requests.get(url, cookies=site_cookies)
    r.encoding = r.apparent_encoding
    
    #HTML-Analyse
    all_html = r.text.replace('<br>','')
    souped_html = BeautifulSoup(all_html, 'lxml')
    
    try:
        breakfast = souped_html.find('p', class_="img_comment6").string
        return breakfast
    except:
        return False

Verwenden Sie die Entwicklertools von Chrome, um zu sehen, welche Cookies gesetzt werden.

Bereiten Sie nach dem Überprüfen einen entsprechenden Cookie vor und laden Sie ihn in die schöne Suppe. Bereiten Sie also ein Wörterbuch vor.

Der Schlüssel ist der zuvor erhaltene Sitzungsschlüssel, und die ID ist die Sitzungs-ID. (Dies ist nicht der Name der Variablen. Lassen Sie es uns aussagekräftiger machen.)

Wie bereits erwähnt, scheinen die Authentifizierungs-ID und das Kennwort im Klartext mit SITE_ID und SITE_PASS (?) Gelesen zu werden. Geben Sie dies also so an, wie es ist.

(Ist es nicht sinnlos, diese Sitzungs-ID zu erhalten ...? Bitte lassen Sie mich wissen, wenn Sie Details haben.)

Alles was Sie tun müssen, ist es in lxml zu laden, das HTML analysiert, und das Klassenelement "img_comment6" daraus zu extrahieren!

image.png

Fliegen Sie zu LINE (LINE Notify)

def post_line(result):
    post_data = 'heute(' + today_data + ')100 Yen Frühstück' + result + 'ist.'
    
    line_api_headers = {"Authorization" : "Bearer "+ LINE_TOKEN}
    line_payload = {"message" :  post_data}
    
    r = requests.post(LINE_API_URL ,headers = line_api_headers ,params=line_payload)
    return r.status_code

Alles, was Sie tun müssen, ist zu LINE Notify zu springen. Mit LINE Notify können Sie die Authentifizierungsinformationen und den Nachrichteninhalt in den Header einfügen und POST an den Endpunkt der API senden, um die Informationen an das voreingestellte Gespräch zu senden.

Schreiben Sie den Hauptprozess

def main():
    print('Tokyo City University 100 Yen Frühstücksmenü-Anzeigeprogramm von 920OJ')
    print('heute' + today_data + 'ist.')
    
    session = get_sessionid()
    session_key = session[0]
    session_id = session[1]
    
    print('Erste Anmeldeinformationen erhalten.' + session_key + 'Ist' + session_id + 'ist. Warten Sie 3 Sekunden ...')
    sleep(3)
    
    result = get_breakfast_info(session_key,session_id)
    
    if not result:
        print('Informationen konnten nicht erhalten werden. 100 Yen Frühstück ist möglicherweise nicht verfügbar.')
        sys.exit()

    print('Das heutige 100-Yen-Frühstück ist' + result + 'ist. Senden Sie eine Benachrichtigung an LINE.')
    
    post_status = post_line(result)
    if post_status == 200:
        print('Die LINE-Benachrichtigung war erfolgreich. Beenden Sie das Programm.')
    else:
        print('LINE-Benachrichtigung fehlgeschlagen. Die Antwort ist' + str(post_status) + 'ist. Beenden Sie das Programm.')
    
if __name__ == "__main__":
    main()

Danach schreibe ich den Hauptprozess auf die gleiche Weise wie das Zusammenstellen der zuvor erstellten Funktion.

Schreiben Sie abschließend "if name ==" main ":", um zu verhindern, dass der Prozess willkürlich ausgeführt wird, wenn dieses Programm irgendwo importiert wird. Ich habe noch nie von einem Mechanismus gehört, der die Funktion main () aufruft, wenn die Namen der ausgeführten Dateien übereinstimmen.

arbeiten

Ich hoste es auf meinem geliehenen Lightsail (VPS) und lasse es regelmäßig mit cron laufen. Sobald ich es betreibe, gehe ich für den Tag zum Frühstück, also laufe ich jeden Morgen um 7:30 Uhr cron, um die regelmäßige Ausführung zu realisieren.

Schließlich

Um die Wahrheit zu sagen, dieser Code wurde im April erstellt. Wenn ich ihn mir jetzt anschaue, gibt es Stellen, an denen die Variablennamen nicht korrekt sind und die Implementierung nicht eindeutig ist. Ich möchte den Code neu schreiben, wenn ich etwas mehr Freizeit habe.


Morgen ist ein Artikel von Herrn K (@ ke_odakyu9000)! Freut mich, dich kennenzulernen! https://adventar.org/calendars/4282

Recommended Posts

Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Die Geschichte der Implementierung des Themas Facebook Messenger Bot mit Python
Die Geschichte der Verarbeitung A von Blackjack (Python)
2016 Todai Mathematik mit Python gelöst
Erstellen Sie mit Minette für Python einen LINE BOT
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Die Geschichte eines Mel-Icon-Generators
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[Super einfach] Machen wir einen LINE BOT mit Python.
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
[Python] Eine Geschichte über das Erstellen eines LINE-Bots mit einer praktischen bemannten Funktion ohne Verwendung von Salesforce [Messaging-API]
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte des Exportierens eines Programms
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Der 14. März ist der Tag des Umfangsverhältnisses. Die Geschichte der Berechnung des Umfangsverhältnisses mit Python
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Die Idee, die Konfigurationsdatei mit einer Python-Datei anstelle von yaml zu füttern
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Überprüfen Sie die Existenz der Datei mit Python
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Die Geschichte einer unveränderlichen Form
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
Die Geschichte der Manipulation globaler Python-Variablen
[Python] [Meta] Ist der Python-Typ ein Typ?
Machen wir einen Twitter-Bot mit Python!
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B- und C-Probleme von ABC182 mit Python!
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Berechnen Sie die Wahrscheinlichkeit, eine Tintenfischmünze zu sein, mit dem Bayes-Theorem [Python]
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap