Dieser Artikel ist der erste Tag des Adventskalenders 2019 der Tokyo City University. https://adventar.org/calendars/4282
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"!
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.
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.
Python v3.7.1 pip 19.1.1 Windows 10 v1903
Tokyo City University Yokohama Campus Student Cafeteria 100 Yen Frühstück Benachrichtigung bot https://github.com/920oj/TCU-YC-Breakfast-Notify-Bot
Eine Benachrichtigung wird jeden Tag um 7:30 Uhr morgens (nur wenn Sie ein 100-Yen-Frühstück haben) so fliegen!
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)
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.
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!
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.
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.
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.
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