SHARE
TWEET

Untitled

a guest Jan 22nd, 2020 69 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top