N
N
nasdi2018-02-08 21:50:13
Python
nasdi, 2018-02-08 21:50:13

Rate the first project?

Hello everyone, I recently completed my first project, it turned out to be a bot answering people in VK. I want to know from more experienced specialists the opinion about it, as well as its errors or shortcomings that can be improved / redone

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)

Answer the question

In order to leave comments, you need to log in

5 answer(s)
S
sim3x, 2018-02-08
@nasdi

Many global variables
u'in python3 are not used
Variable names in transliteration
Many magic numbers
passare used without understanding why it is
Not all errors are handled
No logging It is
worth learning functional programming paradigms - it will be easier to write code
Endless loop inside the script is bad, it is better to let systemd run it
For the first project - excellent

D
Dimonchik, 2018-02-08
@dimonchik2013

well done! but better on github

C
cybernoob, 2018-02-08
@cybernoob

Great, hammer, keep developing!

A
asd111, 2018-02-08
@asd111

Quite normal. Unless while trueI would separate the cycle into a function so that the cycle has some kind of understandable name. And it is desirable to call the functions so that it is clear that they do something, i.e. for example not otmazkibut get_random_otmazkaand instead weatheris possible get_weather_in_user_city. It is desirable that the name of the function be a verb, not a noun - so it is clearer that this is a function.
And yet this should be called somehow, for example, make a mini function so that it is clear what is happening here:

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

R
Rampages, 2018-03-10
@Rampages

Eh, something reminded me of irc bots with their quizzes...
to expand the functionality or other projects, you can look at scripts like kaurix.narod.ru/tcl.html or https://webcriminal.ru/threads/irc-boty.5760 /
good old eggdrop... by the way it's written in python: https://github.com/eggheads/eggdrop

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question