while True: # бесконечный цикл
x_str = input('Введите x:') # вводим число
try: # внутри блока try мы будем отлавливать ошибки - исключения
x = float(x_str) # пробуем преобразовать строку в число
except ValueError: # в случае чего float() выкинет исключение ValueError
print(x_str, 'это не число. Попробуйте ещё раз.') # сообщаем пользователю
else: # если ошибки не было
break # то прерываем цикл, у нас в x лежит нужное значение
# мы делаем break только в ветке else - значит, пока отрабатывает ветка except, цикл продолжится
except ValueError:
print(x_str, 'это не число. У вас есть ещё одна попытка') # сообщаем пользователю
x_str = input('Введите x: ')
x = float(x_str)
File "C:\Users\Maks\PycharmProjects\pythonProject7\main.py", line 57, in check_news_update
news_dict = json.load(file)
with open('news_dict.json') as file: # где encoding? где режим открытия?
news_dict = json.load(file)
with open("news_dict.json", "w",encoding="utf-8") as file: # а тут всё правильно
json.dump(news_dict, file, indent=4, ensure_ascii=False)
send_message(...)
reply_markup (telebot.types.InlineKeyboardMarkup or telebot.types.ReplyKeyboardMarkup or telebot.types.ReplyKeyboardRemove or telebot.types.ForceReply) – Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user.
[клиент] --> [решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[клиент] --> [решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[клиент --> решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[Генератор и хостинг для PAC-файла]
^
|
[клиентский браузер] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
@bot.callback_query_handler(func=lambda call: True)
dict_data_user = await state.get_data()
list_data_user = [] # сначала список пуст
for k, v in dict_data_user.items(): # начинаем цикл, первая итерация
list_data_user.append(v) # добавляем в список элемент. Длина списка равна 1.
user_id = message.from_user.id
id_product = list_data_user[0] # читаем из списка элемент с индексом 0. ОК, он есть, мы его только что добавили
full_name = list_data_user[1] # откуда бы взяться элементу с индексом 1 в списке из одного элемента?!
index_adress = list_data_user[2]
number_phon = list_data_user[3]
user_db.add_user(id_product=id_product, user_id=user_id, full_name=full_name,
index_adress=index_adress, number_phon=number_phon)
await state.clear()
# словарь, где ключ - строка с названием пунка отправления, а значение - ещё словарь,
# где ключ - строка с названием пункта назначения, а значение - список,
# где элементы - пары строк ("время отправления", "время прибытия")
# Тогда с таким словарём можно будет работать так:
bus_timetable: dict[str, dict[str, list[tuple[str, str]]]] = {
# ты словарь заполняешь по результатам парсинга, ну и то хорошо
# я для примера запишу прямо так
'Владимир' : {
'Муром': [
('8:00', '11:00'),
('9:00', '12:00'),
('10:00', '13:00'),
],
},
}
point_from = 'Владимир'
point_to = 'Муром'
# для примера вывожу в консоль, для бота перепишешь сам
print(f'Автобус из {point_from} в {point_to}')
for departure, arrival in bus_timetable[point_from][point_to]:
print(f'Отходит в {departure}, прибывает в {arrival}')
kbd_from = types.ReplyKeyboardMarkup(resize_keyboard=True)
buttons = [types.KeyboardButton(point_from) for point_from in bus_timetable] # список кнопок
kbd_from.add(*buttons) # если надо добавить все кнопки сразу
@bot.message_handler(content_types=['text'])
def first_message_handler(message):
if message.text in bus_timetable: # назвали известный город? Это пункт отправления
kbd = ... # тут определяешь клавиатуру, опираясь на города в bus_timetable[message.text]
response = bot.reply_to(message, "А теперь назовите пункт назначения", reply_markup=kbd)
# обрати внимание: все параметры после указания функции second_message_handler будут
# переданы в эту функцию при её вызове. А вызвана она будет, когда пользователь ответит.
bot.register_next_step_handler(response, second_message_handler, message.text)
elif ... # нам назвали не город - тут можно проверить другие команды
def second_message_handler(message, point_from):
# а эта функция будет вызвана только когда пользователь уже назвал пункт отправления
# point_from будет содержать название города, отправленное пользователем.
if message.text in bus_timetable[point_from]: # нам назвали допустимый пункт назначения
bus_rides = bus_timetable[point_from][message.text] # список рейсов
... # дальше перебираем список bus_rides и выводим его пользователю
else: # пользователь назвал что-то другое
... # говорим пользователю, что он дурак