Advertisement
KsaneK

e-dziekanat pobieranie planu

Oct 14th, 2017
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.64 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import codecs
  4. from bs4 import BeautifulSoup as bs
  5. from requests.packages.urllib3.exceptions import InsecureRequestWarning
  6. from time import sleep
  7. import json
  8. import datetime
  9. from sys import exit
  10.  
  11. requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  12. URL = "https://s1.wcy.wat.edu.pl/ed/"
  13.  
  14. class eDziekanat:
  15.     def __init__(self, login, passwd, output):
  16.         self.timetable = {}
  17.         self.output_dir = output
  18.         # parametry formularza logowania
  19.         self.params = {
  20.             "default_fun": 1,
  21.             "formname": "login",
  22.             "userid": login,
  23.             "password": passwd
  24.             }
  25.         # utworzenie sesji
  26.         self.session = requests.session()
  27.     def login(self):
  28.         """Funkcja najpierw getem pobiera id sesji, a po tym wysyła posta z danymi logowania"""
  29.         response = self.session.get(URL, verify=False)
  30.         response.encoding = "utf-8"
  31.         soup = bs(response.text, 'html.parser')
  32.         self.login_form = soup.find("form")
  33.         self.ssid = self.login_form.attrs['action'].replace('index.php?sid=', '')
  34.  
  35.         # czasami e-dziekanat jest przeciążony lub nie działa
  36.         # w takim wypadku strona nie generuje nam id sesji
  37.         if not self.ssid:
  38.             print("Nie udało się uzyskać ssid.\nKończenie programu")
  39.             exit()
  40.  
  41.         print("SSID: %s" % self.ssid)
  42.         self.session.post(
  43.             "%s%s" % (URL, self.login_form.attrs['action']),
  44.             data = self.params,
  45.             verify = False
  46.         )
  47.     def get_timetable(self, group):
  48.         """Pobranie planu zajęć grupy"""
  49.         t = URL + "logged.php?sid=%s&mid=328&iid=20171&vrf=32820171&rdo=1&pos=0&exv=%s&opr=DTXT" % (self.ssid, group)
  50.         timetable_req = self.session.get(t, verify=False)
  51.         # próby pobrania zawartości pliku
  52.         # e-dziekanat był robiony dawno temu i nie wszystko działa jak powinno :D
  53.         for i in range(10):
  54.             print("Pobieranie planu grupy %s, próba %d" % (group, i+1), end='')
  55.             sleep(5)
  56.             try:
  57.                 timetable_req = self.session.get(t, verify=False)
  58.                 content = timetable_req.content.decode("iso-8859-2")
  59.             except ConnectionError as e:
  60.                 print(e)
  61.                 exit()
  62.             if content and "\x00" not in content:
  63.                 print("\t\t[OK]")
  64.                 self.parse(content.split("\r\n"))
  65.                 break
  66.             else:
  67.                 print("\t\t[FAIL]")
  68.     def parse(self, lessons):
  69.         """Przetwarzanie planu pobranego z e-dziekanatu i zapisanie go do zmiennej"""
  70.         # zamiany godziny rozpoczęcia zajęć na numer bloku
  71.         print("Przetwarzanie danych... ", end='')
  72.         hours = {
  73.             "08:00": "0",
  74.             "09:50": "1",
  75.             "11:40": "2",
  76.             "13:30": "3",
  77.             "15:45": "4",
  78.             "17:35": "5",
  79.             "19:25": "6"
  80.         }
  81.         # wyrzucamy pierwszy i ostatni element
  82.         # pierwszy to etykiety, ostatni jest pusty
  83.         lessons = lessons[1:-1]
  84.         startday = lessons[0].split(",")[2]
  85.         endday = lessons[-1].split(",")[2]
  86.         startday = datetime.datetime.strptime(startday, "%Y-%m-%d")
  87.         endday = datetime.datetime.strptime(endday ,"%Y-%m-%d")
  88.         self.startday = startday - datetime.timedelta(days=startday.weekday())
  89.         self.endday = endday + datetime.timedelta(days=4-endday.weekday())
  90.  
  91.         for lesson in lessons:
  92.             l = lesson.split(",")
  93.             l[3] = hours[l[3]]
  94.             # index końca nazwy przedmiotu
  95.             index_of_lesson_type = l[0].index(" (")
  96.             # zapisanie typu zajęć(w/ć/L) do zmiennej
  97.             l_type = l[0][index_of_lesson_type+2:index_of_lesson_type+3]
  98.  
  99.             l[0] = l[0][:index_of_lesson_type]
  100.             # dodanie typu zajęć do listy
  101.             l.insert(1, l_type)
  102.             if not l[3] in self.timetable:
  103.                 #jeżeli slownik nie posiada klucza dla danego dnia to go tworzymy
  104.                 self.timetable[l[3]] = [[] for i in range(7)]
  105.             # wpisanie bloku zajęć w odpowiednie miejsce na liście
  106.             self.timetable[l[3]][int(l[4])] = [l[0], l[1], l[2]]
  107.         print("\t\t\t[OK]")
  108.     def export_to_json(self, group):
  109.         with codecs.open("%s/%s.json" % (self.output_dir, group), "w", "utf-8") as f:
  110.             print("LENGTH: %d" % len(self.timetable))
  111.             json.dump(self.timetable, f)
  112.         with open("%s/%s_daterange.txt" % (self.output_dir, group), "w") as f:
  113.             f.write(self.startday.strftime("%Y-%m-%d"))
  114.             f.write("\n")
  115.             f.write(self.endday.strftime("%Y-%m-%d"))
  116.  
  117.  
  118. if __name__ == "__main__":
  119.     with open("/home/debian/ed/dane.txt", "r") as f:
  120.         username = f.readline().replace("\n","").replace("\r","").split("=")[1]
  121.         password = f.readline().replace("\n","").replace("\r","").split("=")[1]
  122.         output = f.readline().replace("\n","").replace("\r","").split("=")[1]
  123.         groups = f.readline().replace("\n","").replace("\r","").split("=")[1]
  124.         groups = groups.split(",")
  125.     ed = eDziekanat(username, password, output)
  126.     ed.login()
  127.     for group in groups:
  128.         ed.get_timetable(group)
  129.         ed.export_to_json(group)
  130.         ed.timetable = {}
  131.     with open("%s/lastup.txt" % ed.output_dir, "w") as f:
  132.         f.write((datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement