Advertisement
Guest User

Untitled

a guest
Feb 12th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. import bs4 as bs
  2. import requests
  3. import json
  4. import time
  5. from itertools import groupby
  6.  
  7. class DsbException(Exception):
  8. pass
  9.  
  10. class InvalidKeyException(DsbException):
  11. pass
  12.  
  13. def timetable(table):
  14. if table["timetablegroupname"] == "VP morgen mobile":
  15. return True
  16. else:
  17. return False
  18.  
  19. def login():
  20. user = '266761'
  21. password = 'vp201617'
  22. key_url = f'https://iphone.dsbcontrol.de/(S(olrkigwsbotu2b1j2zjnqbso))/iPhoneService.svc/DSB/authid/{user}/{password}'
  23.  
  24. key = requests.get(key_url).json()
  25.  
  26. if key == '00000000-0000-0000-0000-000000000000':
  27. raise InvalidKeyException("Invalid Key received from dsbcontrol")
  28.  
  29. table_url = f'https://iphone.dsbcontrol.de/(S(wfyybef2cruzx3kmopg21u2u))/iPhoneService.svc/DSB/timetables/{key}'
  30. tables = requests.get(table_url).json()
  31. return tables
  32.  
  33. def soup(tables):
  34.  
  35. vertretungspläne = [] #html codes aller vertretungspläne des "VP morgen"
  36.  
  37. tablelist = list(filter(timetable, tables)) # Liste aller Listen des "VP morgen"
  38.  
  39. for i in tablelist:
  40. timetabledate = i["timetabledate"]
  41. r = requests.get(i["timetableurl"])
  42. vertretungspläne.append(bs.BeautifulSoup(r.content, "lxml"))
  43. return vertretungspläne, timetabledate
  44.  
  45. def inhalt(vertretungspläne):
  46.  
  47. vpinhalt = []
  48.  
  49. for i in vertretungspläne:
  50. table_rows = i.find_all('tr')
  51. rows = []
  52. for tr in table_rows:
  53. td = tr.find_all('td')
  54. columns = []
  55. for b in td:
  56. data = b.text.split()
  57. columns.append(data)
  58. rows.append(columns)
  59. vpinhalt.extend(rows)
  60. return vpinhalt
  61.  
  62. def gruppierung(vpinhalt):
  63.  
  64. klassen = []
  65. infos = []
  66. itera = groupby(vpinhalt, key=lambda x: len(x) <= 2)
  67. next(itera)
  68.  
  69. for i, group in itera:
  70. if i:
  71. klassen.append(list(group))
  72. else:
  73. infos.append(list(group))
  74. return klassen, infos
  75.  
  76. def sortierung(klassen, infos, zielklasse):
  77.  
  78. for i, info in zip(klassen, infos):
  79. if i[-1][-1][0] == zielklasse:
  80. return info
  81. return None
  82.  
  83.  
  84. def date(vertretungspläne):
  85. date = vertretungspläne[0].find('div', class_='mon_title').text.split()
  86. datum = (f"Am {date[1]} den {date[0]}")
  87. return datum
  88.  
  89. def nachrichten(info, datum):
  90. newsliste = []
  91.  
  92. for i in info:
  93. op = i[0][0]
  94. kurs = i[3][0]
  95. raum = i[6][0]
  96. stunde = i[1]
  97. if len(stunde) <= 2:
  98. stunde = i[1][0]
  99. elif len(stunde) == 3:
  100. stunde = i[1][0] + i[1][1] + i[1][2]
  101.  
  102. if op == "Raumtausch":
  103. raum_alt = raum[:3]
  104. raum_neu = raum[4:7]
  105. news = f'{datum} ist der Kurs "{kurs}" in der {stunde}. Stunde anstatt im Raum {raum_alt} nun im {raum_neu}!'
  106. elif op == "Entfall":
  107. news = f'{datum} fällt der Kurs "{kurs}" in der {stunde}. Stunde aus!'
  108. elif op == "Vertretung":
  109. news = f'{datum} wird der Kurs "{kurs}" in der {stunde}. Stunde im Raum {raum} vertreten!'
  110. elif op == "Betreuung":
  111. news = f'{datum} wird der Kurs "{kurs}" in der {stunde}. Stunde betreut!'
  112. elif op == "Verlegung":
  113. news = f'{datum} steht eine Kursverlegung an! Bitte auf den DSB schauen und gegebenenfalls beim zuständigen Lehrer erkundigen!'
  114. elif op == "Tausch":
  115. news = f'{datum} steht ein Kurstausch an! Bitte auf den DSB schauen und gegebenenfalls beim zuständigen Lehrer erkundigen!'
  116. else:
  117. news = f'Achtung! {datum} steht eine dem DSB-Analyseprogramm unbekannte Änderung an! Bitte auf den DSB schauen und gegebenenfalls beim zuständigen Lehrer erkundigen!'
  118. newsliste.append(news)
  119. return newsliste
  120.  
  121.  
  122.  
  123. def main():
  124. zielklasse = "10A"
  125.  
  126. tables = login()
  127. vertretungspläne, timetabledate = soup(tables) #html codes aller vertretungspläne des "VP morgen" und Änderungsdatum
  128. vpinhalt = inhalt(vertretungspläne) #Inhalt aller Vertretungspläne des "VP morgen"
  129. klassen, infos = gruppierung(vpinhalt) #Inhalt gruppiert nach Klassen und Infos (infos[0] enthält die infos von klassen[0])
  130. info = sortierung(klassen, infos, zielklasse) #VP Info zur Zielklasse (Wenn kein Inhalt: None)
  131. datum = date(vertretungspläne) #Generiert Satz zum Datum des "VP morgen"
  132. newsliste = nachrichten(info, datum) #Generiert Sätze zu den jeweiligen NEWS des VP der Zielklasse und speichert diese in einer Liste
  133. print(newsliste)
  134.  
  135.  
  136.  
  137. if __name__ == '__main__':
  138. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement