Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.89 KB | None | 0 0
  1. import datetime
  2. import requests
  3. import telebot
  4. from bs4 import BeautifulSoup
  5. from typing import List, Tuple
  6. from telebot import apihelper
  7.  
  8. NUMBER_DAY = {
  9. 'monday': 1,
  10. 'tuesday': 2,
  11. 'wednesday': 3,
  12. 'thursday': 4,
  13. 'friday': 5,
  14. 'saturday': 6,
  15. 'sunday': 7
  16. }
  17.  
  18. RUSSIAN_DAY = ['', 'Понедельник', 'Вторник', 'Среда', 'Четверг',
  19. 'Пятница', 'Суббота', 'Воскресенье']
  20.  
  21. access_token = '1012653263:AAFrIgCuHM6Rbc1MaBHEGcT7Hy2Yt-nFuXQ'
  22. telebot.apihelper.proxy = {'https': 'https://213.183.51.172:3128'}
  23. bot = telebot.TeleBot(access_token)
  24.  
  25.  
  26. def parse_command(message: str) -> Tuple[int, int, str]:
  27. info = message.text.split()
  28. try:
  29. return NUMBER_DAY[info[0][1:]], int(info[1]), info[2]
  30. except:
  31. return NUMBER_DAY[info[0][1:]], 0, info[1]
  32.  
  33.  
  34. def get_page(group: str, week: int = 0) -> str:
  35. if week:
  36. week = str(week % 2 + 1) + '/' # 1 - нечётная, 2 - чётная
  37. url = f'http://www.ifmo.ru/ru/schedule/0/{group}/{week}raspisanie_zanyatiy_{group}.htm'
  38. try:
  39. with open('cache.html', 'r') as f:
  40. date = int(f.readline())
  41. string = f.readline().strip()
  42. except FileNotFoundError:
  43. with open('cache.html', 'w') as f: # создадим файл, если его ещё нет
  44. string = ""
  45.  
  46. now = datetime.date.today().isocalendar()[1]
  47. if string == url and now != date:
  48. with open('cache.html', 'r') as f:
  49. return f.read()
  50. response = requests.get(url)
  51. web_page = response.text
  52. with open('cache.html', 'w') as f:
  53. f.write(f'{now}\n{url}\n{web_page[50000:]}')
  54. return web_page[50000:]
  55.  
  56.  
  57. def parse_schedule(web_page: str, day: int) -> Tuple[List[str], List[str], List[str], List[str]]:
  58. soup = BeautifulSoup(web_page, "html5lib")
  59.  
  60. # Получаем таблицу с расписанием
  61. schedule_table = soup.find("table", attrs={"id": f"{day}day"})
  62. if (schedule_table is None):
  63. return (['Целый день'], ['занятий у группы нет'],
  64. ['\nне забудь посетить индивидуальные'], [''])
  65.  
  66. # Время проведения занятий
  67. times_list = schedule_table.find_all("td", attrs={"class": "time"})
  68. times_list = [time.span.text for time in times_list]
  69.  
  70. # Место проведения занятий
  71. locations_list = schedule_table.find_all("td", attrs={"class": "room"})
  72. locations_list = [room.span.text for room in locations_list]
  73.  
  74. # Аудитория
  75. rooms_list = schedule_table.find_all("td", attrs={"class": "room"})
  76. rooms_list = [room.dd.text for room in rooms_list]
  77.  
  78. # Название дисциплин и имена преподавателей
  79. lessons_list = schedule_table.find_all("td", attrs={"class": "lesson"})
  80. lessons_list = [lesson.text.split('\n\n') for lesson in lessons_list]
  81. lessons_list = [', '.join([info for info in lesson_info if info]) for lesson_info in lessons_list]
  82.  
  83. return times_list, locations_list, rooms_list, lessons_list
  84.  
  85.  
  86. @bot.message_handler(commands=['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'])
  87. def get_schedule(message: str) -> None:
  88. """ Получить расписание на указанный день """
  89.  
  90. try:
  91. day, week, group = parse_command(message)
  92. except:
  93. bot.send_message(message.chat.id, '<b>Используйте:</b> /weekday [week=0] [group]\n' +
  94. '2 - чётная неделя, 1 - нечётная, 0 - обе', parse_mode='HTML')
  95. return
  96.  
  97. get_timetable(message, day, week, group)
  98.  
  99.  
  100. def get_timetable(message: str, day: int, week: int, group: str) -> None:
  101. if len(group) < 5 or not group[0].isalpha() or not group[1:5].isdigit():
  102. bot.send_message(message.chat.id, '<b>Используйте:</b> /weekday [week=0] [group]\n' +
  103. '2 - чётная неделя, 1 - нечётная, 0 - обе', parse_mode='HTML')
  104. return
  105.  
  106. web_page = get_page(group, week)
  107. times_lst, locations_lst, rooms_lst, lessons_lst = parse_schedule(web_page, day)
  108. resp = "<b>{}</b>\n\n".format(RUSSIAN_DAY[day])
  109. for time, location, room, lesson in zip(times_lst, locations_lst, rooms_lst, lessons_lst):
  110. resp += '<i>{}:</i> {}, {} {}\n'.format(time, location, room, lesson)
  111. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  112.  
  113.  
  114. @bot.message_handler(commands=['near'])
  115. def get_near_lesson(message: str) -> None:
  116. """ Получить ближайшее занятие """
  117.  
  118. try:
  119. _, group = message.text.split()
  120. except:
  121. bot.send_message(message.chat.id, '<b>Используйте:</b> /near [group]',
  122. parse_mode='HTML')
  123. return
  124. if len(group) < 5 or not group[0].isalpha() or not group[1:5].isdigit():
  125. bot.send_message(message.chat.id, '<b>Используйте:</b> /near [group]',
  126. parse_mode='HTML')
  127. return
  128.  
  129. week = (datetime.date.today().isocalendar()[1] - 35) % 2
  130. if not week:
  131. week += 2
  132. now_day = datetime.date.today().isocalendar()[2]
  133. day = now_day
  134. now = datetime.datetime.now()
  135. hour = now.hour
  136. minute = now.minute
  137. time_now = hour*60 + minute
  138. web_page = get_page(group, week)
  139. flag = 1
  140. times_lst, locations_lst, rooms_lst, lessons_lst = parse_schedule(web_page, day)
  141. num = 0
  142. while flag:
  143. for time in times_lst:
  144. if not time[0].isalpha():
  145. time_class = int(time[0:2])*60 + int(time[3:5])
  146. if time_class > time_now or now_day < day:
  147. flag = 0
  148. break
  149. num += 1
  150. else:
  151. day += 1
  152. if day > 7:
  153. day = 1
  154. if day == now_day:
  155. bot.send_message(message.chat.id, 'У этой группы занятий нет\n' +
  156. 'Проверьте правильность ввода номера группы', parse_mode='HTML')
  157. return
  158. num = 0
  159. times_lst, locations_lst, rooms_lst, lessons_lst = parse_schedule(web_page, day)
  160. resp = "<b>{}</b>\n\n".format(RUSSIAN_DAY[day])
  161. resp += '<i>{}:</i> {}, {} {}\n'.format(times_lst[num], locations_lst[num],
  162. rooms_lst[num], lessons_lst[num])
  163. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  164.  
  165.  
  166. @bot.message_handler(commands=['tomorrow'])
  167. def get_tomorrow(message: str) -> None:
  168. """ Получить расписание на следующий день """
  169.  
  170. try:
  171. _, group = message.text.split()
  172. except:
  173. bot.send_message(message.chat.id, '<b>Используйте:</b> /tomorrow [group]',
  174. parse_mode='HTML')
  175. return
  176. _, group = message.text.split()
  177. if len(group) < 5 or not group[0].isalpha() or not group[1:5].isdigit():
  178. bot.send_message(message.chat.id, '<b>Используйте:</b> /tomorrow [group]',
  179. parse_mode='HTML')
  180. return
  181.  
  182. week = (datetime.date.today().isocalendar()[1] - 35) % 2
  183. day = datetime.date.today().isocalendar()[2] + 1
  184. if day > 7:
  185. day = 1
  186. week += 1
  187. elif not week:
  188. week += 2
  189. web_page = get_page(group, week)
  190. times_lst, locations_lst, rooms_lst, lessons_lst = parse_schedule(web_page, day)
  191. resp = "<b>{}</b>\n\n".format(RUSSIAN_DAY[day])
  192. for time, location, room, lesson in zip(times_lst, locations_lst, rooms_lst, lessons_lst):
  193. resp += '<i>{}:</i> {}, {} {}\n'.format(time, location, room, lesson)
  194. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  195.  
  196.  
  197. @bot.message_handler(commands=['all'])
  198. def get_all_schedule(message: str) -> None:
  199. """ Получить расписание на всю неделю для указанной группы """
  200.  
  201. info = message.text.split()
  202. if len(info) == 3:
  203. week = info[1]
  204. group = info[2]
  205. elif len(info) == 2:
  206. week = 0
  207. group = info[1]
  208. else:
  209. bot.send_message(message.chat.id, '<b>Используйте:</b> /all [week=0] [group]\n' +
  210. '2 - чётная неделя, 1 - нечётная, 0 - обе', parse_mode='HTML')
  211. return
  212. if len(group) < 5 or not group[0].isalpha() or not group[1:5].isdigit():
  213. bot.send_message(message.chat.id, '<b>Используйте:</b> /all [week=0] [group]\n' +
  214. '2 - чётная неделя, 1 - нечётная, 0 - обе', parse_mode='HTML')
  215. return
  216.  
  217. for i in range(1, 8):
  218. get_timetable(message, i, int(week), group)
  219.  
  220.  
  221. if __name__ == '__main__':
  222. bot.polling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement