Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.66 KB | None | 0 0
  1. import requests
  2. from telebot import *
  3. import config
  4. from bs4 import BeautifulSoup
  5. import time
  6. import datetime
  7. import traceback
  8. from typing import Any
  9.  
  10. bot = TeleBot(config.access_token, threaded=False)
  11. weekdays = ['/monday', '/tuesday', '/wednesday', '/thursday', '/friday', '/saturday', '/sunday']
  12. weekdays_rus = ['понедельник', 'вторник', 'средy', 'четверг', 'пятницy', 'субботy', 'воскресенье']
  13. weeknumber = ['четную', 'нечетную']
  14.  
  15.  
  16. def get_page(group:str='K3140', week:str='') -> str:
  17. if week:
  18. week = str(week) + '/'
  19. url = '{domain}/{group}/{week}raspisanie_zanyatiy_{group}.htm'.format(
  20. domain=config.domain,
  21. week=week,
  22. group=group)
  23. response = requests.get(url)
  24. web_page = response.text
  25. return web_page
  26.  
  27.  
  28. def parse_for_schedule(web_page:str, day:str) -> Any:
  29. soup = BeautifulSoup(web_page, "html5lib")
  30. # Получаем таблицу с расписанием
  31. if day in weekdays:
  32. daynumber = str(weekdays.index(day) + 1) + 'day'
  33. schedule_table = soup.find("table", attrs={"id": daynumber})
  34. if not schedule_table:
  35. return
  36. # Время проведения занятий
  37. times_list = schedule_table.find_all("td", attrs={"class": "time"})
  38. times_list = [time.span.text for time in times_list]
  39.  
  40. # Место проведения занятий
  41. locations_list = schedule_table.find_all("td", attrs={"class": "room"})
  42. locations_list = [room.text.replace('\n', '').replace('\t', '') for room in locations_list]
  43.  
  44. # Название дисциплин и имена преподавателей
  45. lessons_list = schedule_table.find_all("td", attrs={"class": "lesson"})
  46. lessons_list = [lesson.text.replace('\n', '').replace('\t', '') for lesson in lessons_list]
  47.  
  48. return times_list, locations_list, lessons_list
  49.  
  50.  
  51. @bot.message_handler(commands=['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'])
  52. def get_schedule(message) -> None:
  53. """ Получить расписание на указанный день """
  54. try:
  55. a = message.text.split()
  56. except ValueError:
  57. return None
  58.  
  59. if len(a) > 1:
  60. try:
  61. day, group, week = a
  62. except ValueError:
  63. day, group = a
  64. week = ''
  65. else:
  66. day = a[0]
  67. group = 'K3140'
  68. week = ''
  69. if week in ' 12':
  70. pass
  71. else:
  72. bot.send_message(message.chat.id, "четность недели 1 или 2, введена другая")
  73. print(message.text, group)
  74. web_page = get_page(group, week)
  75. day_r = weekdays_rus[weekdays.index(day)]
  76. try:
  77. times_lst, locations_lst, lessons_lst = \
  78. parse_for_schedule(web_page, day)
  79. except TypeError:
  80. bot.send_message(message.chat.id, "данные введены неверно или нет пар")
  81. return None
  82. resp = ''
  83. for time, location, lession in zip(times_lst, locations_lst, lessons_lst):
  84. resp += '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  85. if week == '1':
  86. bot.send_message(message.chat.id, 'расписание на {} для группы {}, на {} неделю'.format(day_r, group, weeknumber[0]), parse_mode='HTML')
  87. elif week == '2':
  88. bot.send_message(message.chat.id, 'расписание на {} для группы {}, на {} неделю'.format(day_r, group, weeknumber[1]), parse_mode='HTML')
  89. else:
  90. bot.send_message(message.chat.id, 'расписание на {} для группы {}, на все недели'.format(day_r, group), parse_mode='HTML')
  91.  
  92. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  93.  
  94.  
  95. @bot.message_handler(commands=['near'])
  96. def get_near_lesson(message):
  97. try:
  98. a = message.text.split()
  99. except ValueError:
  100. return None
  101.  
  102. if len(a) > 1:
  103. group = a[1]
  104. else:
  105. group = 'K3140'
  106.  
  107. if int(datetime.datetime.today().strftime('%U')) % 2 == 1:
  108. week = 1
  109. else:
  110. week = 2
  111. print(message.text, group)
  112. now = (datetime.datetime.now().strftime('%H:%M'))
  113. day = datetime.datetime.now()
  114. day = weekdays[day.weekday()]
  115. web_page = get_page(group, str(week))
  116. n = 0
  117. day_r = weekdays_rus[weekdays.index(day)]
  118. days = day
  119. for i in range(7):
  120. a = parse_for_schedule(web_page, day)
  121. if a:
  122. n += 1
  123. if n == 2:
  124. break
  125. b = a
  126. day1 = day
  127. day = weekdays.index(day) + 1
  128. if day == 7:
  129. day -= 7
  130. day = weekdays[day]
  131. else:
  132. day = weekdays[day]
  133. else:
  134. day = weekdays.index(day) + 1
  135. if day == 7:
  136. day -= 7
  137. day = weekdays[day]
  138. else:
  139. day = weekdays[day]
  140. if n == 0:
  141. bot.send_message(message.chat.id, "данные введены неверно", parse_mode='HTML')
  142. return None
  143. times_lst, locations_lst, lessons_lst = b
  144. resp = ''
  145. for time, location, lession in zip(times_lst, locations_lst, lessons_lst):
  146. if day1 != days:
  147. resp = '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  148. day_r = weekdays_rus[weekdays.index(day1)]
  149. break
  150. elif now < time[0:5]:
  151. resp = '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  152. day_r = weekdays_rus[weekdays.index(day1)]
  153. break
  154. elif time[0:5] < now < time[6:11]:
  155. pass
  156. elif now > time[6:11]:
  157. times_lst, locations_lst, lessons_lst = a
  158. for time, location, lession in zip(times_lst, locations_lst, lessons_lst):
  159. resp = '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  160. day_r = weekdays_rus[weekdays.index(day)]
  161. break
  162. bot.send_message(message.chat.id, 'ближайшая пара для группы {} в {}'.format(group, day_r), parse_mode='HTML')
  163. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  164.  
  165.  
  166. @bot.message_handler(commands=['tomorrow'])
  167. def get_tommorow(message):
  168. """ Получить расписание на следующий день """
  169. try:
  170. day, group = message.text.split()
  171. except ValueError:
  172. group = 'K3140'
  173. if int(datetime.datetime.today().strftime('%U')) % 2 == 1:
  174. week = 1
  175. else:
  176. week = 2
  177. print(message.text, group)
  178. today = datetime.datetime.now() + datetime.timedelta(days=1)
  179. tomorrow = today
  180. if today.weekday() == 7:
  181. tomorrow = today + datetime.timedelta(days=1)
  182. tomorrow = weekdays[tomorrow.weekday()]
  183. web_page = get_page(group, str(week))
  184. day_r = weekdays_rus[weekdays.index(tomorrow)]
  185. try:
  186. times_lst, locations_lst, lessons_lst = \
  187. parse_for_schedule(web_page, tomorrow)
  188. except TypeError:
  189. bot.send_message(message.chat.id, "данные введены неверно или нет пар")
  190. return None
  191. resp = ''
  192. for time, location, lession in zip(times_lst, locations_lst, lessons_lst):
  193. resp += '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  194. bot.send_message(message.chat.id, 'расписание на завтра ({}) для группы {}'.format(day_r, group), parse_mode='HTML')
  195. bot.send_message(message.chat.id, resp, parse_mode='HTML')
  196.  
  197.  
  198. @bot.message_handler(commands=['all'])
  199. def get_all_schedule(message):
  200. """ Получить расписание на всю неделю для указанной группы """
  201. try:
  202. a = message.text.split()
  203. except ValueError:
  204. return None
  205.  
  206. if len(a) > 1:
  207. try:
  208. _, group, week = a
  209. except ValueError:
  210. _, group = a
  211. week = ''
  212. else:
  213. group = 'K3140'
  214. week = ''
  215. if week in ' 12':
  216. pass
  217. else:
  218. bot.send_message(message.chat.id, "четность недели 1 или 2, введена другая")
  219. print(message.text, group)
  220. web_page = get_page(group, str(week))
  221. bot.send_message(message.chat.id, 'расписание на {} неделю для группы {}'.format(week, group), parse_mode='HTML')
  222. n = 0
  223. for day in weekdays:
  224. day_r = weekdays_rus[weekdays.index(day)]
  225. a = parse_for_schedule(web_page, day)
  226. if a:
  227. resp = ''
  228. times_lst, locations_lst, lessons_lst = a
  229. for time, location, lession in zip(times_lst, locations_lst, lessons_lst):
  230. resp += '<b>{}</b>, {}\n --- {}\n'.format(time, location, lession)
  231. bot.send_message(message.chat.id, 'расписание на {}\n {}'.format(day_r, resp), parse_mode='HTML')
  232. n += 1
  233. if n == 0:
  234. bot.send_message(message.chat.id, "данные введены неверно", parse_mode='HTML')
  235. return None
  236.  
  237. @bot.message_handler(commands=["start"])
  238. def start(message):
  239. bot.send_message(message.chat.id, "Ассалам алейкумы")
  240.  
  241. @bot.message_handler(commands=["help"])
  242. def help(message):
  243. bot.send_message(message.chat.id, "/start для выхода в меню \n /tomorrow для просмотра расписания на завтра \n /all для просотра расписания на всю неделю \n /near для простотра ближайшей пары")
  244.  
  245. if __name__ == '__main__':
  246. try:
  247. bot.polling(none_stop=True)
  248.  
  249. except:
  250. traceback.print_exc()
  251. time.sleep(15)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement