Advertisement
Guest User

e-dziekanat

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