#!/usr/bin/python3 from sys import argv from os import getenv import requests import json from datetime import datetime from time import sleep from bs4 import BeautifulSoup popr = "https://popr.uni-lj.si/" def prijavi_se(s, event, slotid): form = BeautifulSoup(s.get(popr + "student/events.html?page=booking&id=" + str(event) + "&slotId=" + str(slotid) + "&bookingAction=BOOK").text, features="lxml").find("form") dejta = "_eventId_book=Submit" for inp in form.findAll("input"): try: dejta += "&" + inp.attrs["name"] + "=" + inp.attrs["value"] except KeyError: pass s.post(popr + "student/events.html", data=dejta, headers={"Content-Type": "application/x-www-form-urlencoded"}) def get_event(s, event): s.get(popr + "student/svc/events.html") # session keepalive jwt = s.get(popr + "api/user/token/refresh").text s.headers.update({"Authorization": "Bearer " + jwt}); return json.loads(s.get(popr + "ext/svc/events-api-0-0/events/user/event/slots/" + event + "?locale=en").text)[0]; def main(): if len(argv) < 2: print("Prvi argument naj bo numerični ID dogodka.") return event = argv[1] slot = None if len(argv) >= 3: slot = int(argv[2]) if getenv("COOKIES") == None: print("Okoljska spremenljivka COOKIES naj vsebuje piškotke v obliki ime=vrednost;ime2=vrednost2;... Potrebujete dva piškotka -- GUANXI_GUARD_SERVICE_PROVIDER... in JSESSION") return s = requests.Session() for pair in getenv("COOKIES").split(";"): s.cookies.set(pair.split("=")[0], pair.split("=")[1]); ev = get_event(s, event) slotid = ev["slots"][0]["id"] if len(ev["slots"]) > 1 and slot == None: print("Za izbrani dogodek obstaja več slotov. V drugi argument bi morali napisati številko slota, začenši z 0. Sloti na voljo:"); for sl in range(len(ev["slots"])): print(str(sl) + "\t" + ev["slots"][sl]["start"] + "-" + ev["slots"][sl]["end"] + "\t" + ev["slots"][sl]["location"]["name"]) return if slot != None: slotid = ev["slots"][slot]["id"] else: slot = 0 if "message" in ev["slots"][slot].keys() and "Booking not yet open" in ev["slots"][slot]["message"]: ura = ev["slots"][slot]["message"].split(" ")[-1] datum = ev["slots"][slot]["message"].split(" ")[-3] kdaj = datetime(int(datum.split("-")[2]), ["Nul", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].index(datum.split("-")[1]), int(datum.split("-")[0]), int(ura.split(":")[0]), int(ura.split(":")[1])) print("Prijave na dogodek se odpro " + kdaj.ctime() + ". Do takrat čakam, nato pa bom snajpal prijavo.") while True: if (kdaj-datetime.now()).total_seconds() < 190: break ev2 = get_event(s, event); if ev2 != ev: print("NAPAKA! Dogodek se je spremenil!") print("prejšnji: " + ev) print("trenutni: " + ev2) return sleep(180) sleep((kdaj-datetime.now()).total_seconds()-3) retries = 0 while True: prijavi_se(s, event, slotid) if (kdaj-datetime.now()).total_seconds() < -3: ev = get_event(s, event) if ev["slots"][slot]["booked"] == True: print("Prijavljeni ste.") return else: if ev["slots"][slot]["bookable"] == False: retries += 1 if retries < 10: continue print("NAPAKA! Niste prijavljeni.") return prijavi_se(s, event, slotid) ev = get_event(s, event) if ev["slots"][slot]["booked"] == True: print("Prijavljeni ste.") else: print("NAPAKA! Niste prijavljeni.") main()