@nasdi

Оцените первый проект?

Всем привет, я недавно доделал свой первый проект им оказался бот отвечающий людям в вк. Хочу узнать у более опытных специалистов мнение о нем, также ошибки или недостатки его которые можно улучшить/переделать
import time
import vk_api
import datetime
import random
from translate_lib import get_translation
import requests
dict_nechet = {  # расписание
    'понедельник': 'нечетный понедельник у нас\n1 пара - русский язык/литература\n'
                   '2 пара - индивидуальный проект\n3 пара - русский язык/литература \n4 пара - пусто',
    'вторник':     'В нечетный вторник у нас \n1 пара - пусто \n2 пара - физ-ра \n3 пара - информатика \n'
                   '4 пара - математика \n5 пара - история ',
    'среда':       'В нечетную среду у нас \n 1 пара русский язык/литература \n'
                   '2 пара - английский \n 3 пара - математика',
    'четверг':     'В нечетный четверг у нас \n1 пара - пусто \n2 пара - химия\n'
                   '3 пара - физ-ра\n4 пара - обществознание',
    'пятница':     'В четную пятницу у нас \n1 пара - ОБЖ \n2 пара - российское казачество \n'
                   '3 пара - математика',  # учителя
    'история':     'Куропаткина Ирина Владимировна 24 кабинет',
    'ип': 	      'Гусева Елена Львовна 107 кабинет ВЦ или 25 кабинет',
    'английский':  'Маркова Виктория Юрьевна 27кабинет\nПономарева Любовь Владимировна 44 кабинет',
    'математика':  'Сорокин Юрий Сергеевич 31 кабинет',
    'физ-ра':      'Надаева Нина Владимировна\nВоедилова Татьяна Сергнеевна',
    'литра':       'Елена Анатольевна Тарасова 23 кабинет',
    'общество':    'Соколова Тамара Ивановна 121 кабинет',
    'казачество':  'Самойлова Екатерина Никитична 44 кабинет',
    'химия':       'Куантаева Татьяна Юрьевна 32 кабинет',
    'обж':         'Куантаева Татьяна Юрьевна 32 кабинет',
    'информатика': 'Биткина Елена Сергеевна 27 кабинет',  # help
    'обед':        '1 смена: 11.50-12.10 - 1,2 этажи старого здания\n'
                   '2 смена: 12.30-12.50 - 1 этаж нового здания, 3 этаж старого здания\n'
                   '3 смена: 13.20-13.40 - 3,4 этажи нового здания, 4 этаж старого здания\n',
    'команды':     '1)Для получения расписания на определенный день: \n'
                   'Пишите день недели: понедельник \n'
                   '2)Чтобы узнать имя преподователя, пишите имя + предмет: имя обж\n'
                   '3)Команда "погода название города" выводит прогноз погоды в выбранном существующем городе городе\n'
                   '4)Команда "лень" помогает придумать отмазку\n'
                   }


dict_chet = {  # расписание
    'понедельник': 'четный понедельник у нас\n1 пара - пусто\n2 пара - индивидуальный проект\n '
                   '3 пара - русский язык/литература \n4 пара - обществознание',
    'вторник':     'В четный вторник у нас \n1 пара - пусто \n2 пара - физ-ра \n3 пара - информатика \n'
                   '4 пара - математика \n5 пара - история ',
    'среда':       'В четную среду у нас \n 1 пара русский язык/литература \n'
                   '2 пара - английский \n 3 пара - математика',
    'четверг':     'В четный четверг у нас \n1 пара - история \n2 пара - химия\n'
                   '3 пара - Английский\n4 пара - обществознание',
    'пятница':     'В нечетную пятницу у нас \n1 пара - ОБЖ \n2 пара - российское казачество \n'
                   '3 пара - математика',  # учителя
    'история':     'Куропаткина Ирина Владимировна 24 кабинет',
    'ип':          'Гусева Елена Львовна 107 кабинет ВЦ или 25 кабинет',
    'английский':  'Маркова Виктория Юрьевна 27кабинет\nПономарева Любовь Владимировна 44 кабинет',
    'математика':  'Сорокин Юрий Сергеевич 31 кабинет',
    'физ-ра':      'Надаева Нина Владимировна\nВоедилова Татьяна Сергнеевна',
    'литра':       'Елена Анатольевна Тарасова 23 кабинет',
    'общество':    'Соколова Тамара Ивановна 121 кабинет',
    'казачество':  'Самойлова Екатерина Никитична 44 кабинет',
    'химия':       'Куантаева Татьяна Юрьевна 32 кабинет',
    'обж':         'Куантаева Татьяна Юрьевна 32 кабинет',
    'информатика': 'Биткина Елена Сергеевна 27 кабинет',  # help
    'обед':        '1 смена: 11.50-12.10 - 1,2 этажи старого здания\n'
                   '2 смена: 12.30-12.50 - 1 этаж нового здания, 3 этаж старого здания\n'
                   '3 смена: 13.20-13.40 - 3,4 этажи нового здания, 4 этаж старого здания\n',
    'команды':     '1)Для получения расписания на определенный день: \n'
                   'Пишите день недели: понедельник \n'
                   '2)Чтобы узнать имя преподователя, пишите имя + предмет: имя обж\n'
                   '3)Команда "погода название города" выводит прогноз погоды '
                   'в выбранном существующем городе городе\n'
                   '4)Команда "лень" помогает придумать отмазку\n'
                   }


def otmazki():
    otvet = ['Не сегодня', 'Каждая лень имеет свою причину. Займись чем-то примитивным.',
             'Чтобы обленить тело, надо как можно меньше пользоваться умом и жить только здесь и сейчас.',
             'Насладиться ленью по-настоящему может лишь тот, у кого есть куча совершенно неотложных дел.'
             ' С каждой секундой наслаждение растет.',
             'Завтра', 'Лучше отдохнуть', 'Работа не волк', 'Еще куча времени', 'Это не так важно',
             'Зачем себя пересиливать', 'Тебе это не нужно на самом деле', 'Полежать всегда лучше',
             'Ютуб сам себя не посмотрит', 'Всё равно все тлен', 'Ещё успееться',
             'Расслабься - стресса хватит на всех',
             'От трудной работы еще никто не умирал. Но зачем испытывать судьбу?',
             'Не спеши выполнять приказ — его могут отменить.',
             'Если отложить дело надолго, то его либо выполнит кто-нибудь другой, '
             'либо оно вообще перестанет быть нужным.',
             'Тому, кто сам ничего не делает, все кажется по плечу', 'Работа – это разновидность невроза',
             'Лучше пузо от пива, чем горб от работы',
             'В настоящее время те, кто выполняет самую тяжелую работу, оплачиваются ниже всего; '
             'у тех, чья работа полегче, и вознаграждение побольше. '
             'Однако больше всего получают те, кто ничего не делает']
    write_msg(item[u'chat_id'], random.choice(otvet))


def weather():
    try:
        gorod = userMessage[7:]
        temp = get_translation(gorod, 'en')
        s_city = str(temp['text'][0])
        s_city = s_city.lower()
        city_id = 0
        appid = "e794afc97e1f4dfa762338e2036891fe"
        res = requests.get("http://api.openweathermap.org/data/2.5/find",
                           params={'q': s_city, 'type': 'like', 'units': 'metric', 'APPID': appid})
        data = res.json()
        cities = ["{}".format(d['name'])
                  for d in data['list']]
        city_id = data['list'][0]['id']
    except Exception as e:
        print("Exception (find):", e)
        pass
    try:
        res = requests.get("http://api.openweathermap.org/data/2.5/weather",
                           params={'id': city_id, 'units': 'metric', 'lang': 'ru', 'APPID': appid})
        data = res.json()

    except Exception as e:
        print("Exception (weather):", e)
        pass
    try:
        temp2 = str(temp['text'][0])
        temp2 = temp2.lstrip().title().lower()
        if temp2 == cities[0].lower():
            write_msg(item[u'chat_id'], u'Погодные условия:' + str(data['weather'][0]['description']) +
                      '\nСредняя температура в городе       ' + gorod.title() + ' : ' + str(data['main']['temp']))
        else:
            write_msg(item[u'chat_id'], u'город не найден или неправильно задан')

    except Exception as e:
        print(e)
        write_msg(item[u'chat_id'], u'город не найден возможна возникла ошибка попробуйте ещё раз')
        pass


def translate():
    word = str(userMessage[9:])
    temp = get_translation(word, 'ru')
    wordtranslate = temp['text'][0]
    if word == wordtranslate:
        write_msg(item[u'chat_id'], 'неперводимый текст')
    else:
        write_msg(item[u'chat_id'], wordtranslate)


vk = vk_api.VkApi(login='логин', password='пароль')
vk.auth()
values = {'out': 0, 'count': 1, 'time_offset': 10}


def write_msg(chat_id, s):
    vk.method('messages.send', {'chat_id': chat_id, 'message': s})


while True:

    now = datetime.datetime.now()
    date = datetime.datetime.today()
    week = int(date.strftime('%W'))

    if now.weekday() == 5 or now.weekday() == 6:
        week = week + 1
    response = vk.method('messages.get', values)

    if response['items']:
        values['last_message_id'] = response['items'][0]['id']
    for item in response['items']:
        userMessage = str(response['items'][0]['body'])
        userMessage = userMessage.lower()
        if week % 2 == 0:
            try:
                write_msg(item[u'chat_id'], dict_nechet[userMessage])
            except KeyError:
                pass
        else:
            try:
                write_msg(item[u'chat_id'], dict_chet[userMessage])
            except KeyError:
                pass
        if ('лень' or ' помоги придумать отмазку') in userMessage:
            otmazki()
        elif 'погода' in userMessage and len(userMessage) > 8:
            weather()
        elif 'переведи' in userMessage and userMessage[:8] == 'переведи':
            translate()
        time.sleep(5)
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
  • sim3x
    @sim3x
    Много глобальных переменных
    u' в питоне3 не используется
    Имена переменных в транслите
    Много магических чисел
    pass используете без понимания зачем он
    Не все ошибки обрабатываются
    Нет логирования
    Стоит изучить парадигмы функционального программирования - так будет проще писать код
    Бесконечный цикл внутри скрипта - плохо, лучше пусть запуском занимается systemd

    Для первого проекта - отлично
    Ответ написан
Пригласить эксперта
Ответы на вопрос 3
  • @asd111
    Вполне норм. Разве что цикл while true я бы выделил в функцию чтобы у цикла было какое то понятное название. И функции желательно называть так чтобы было понятно что они что то делают т.е. например не otmazki а get_random_otmazka и вместо weather можно get_weather_in_user_city. Желательно чтобы название функции было глаголом, а не существительным - так понятнее что это функция.
    И ещё вот это надо как нибудь назвать, например сделать мини функцию, чтобы было понятно что здесь происходит:
    vk = vk_api.VkApi(login='логин', password='пароль')
    vk.auth()
    values = {'out': 0, 'count': 1, 'time_offset': 10}
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы