есть бот в телеграмме (питон + aiogram + FSMContext)
ОБЩЕЕ ОПИСАНИЕ
нужно разработать модуль, который:
шаг1. позволяет пользователю ввести свой город рождения на русском языке (использовать базу городов), и если такого города нет в базе,
то прежложить ввести пользователю название города руками (ближайший крупный город)
далее по выбранному городу должна быть вычислена тайм-зона этого города, поэтому идеально чтобы база содержала latitude longitude выбранного города
шаг 2. позволяет ввести свой город проживания, с такой же логикой, как выше
сохранить данные в системе
ТЕХНИЧЕСКИЕ ДЕТАЛИ
1. функция поиска города работает с локальным json использует cities.json формата
{
"name": "Chakari",
"lat": "-18.06294",
"lng": "29.89246",
"country": "ZW",
"admin1": "05",
"admin2": ""
},
CITIES_PATH = Path(__file__).resolve().parent.parent / "data" / "cities.json"
with CITIES_PATH.open(encoding="utf-8") as f:
CITIES = json.load(f) # list[dict{name,country,lat,lng}]
def find_city(query: str) -> Dict | None:
q = query.strip().lower()
exact = [c for c in CITIES if c["name"].lower() == q]
if exact:
return exact[0]
starts = [c for c in CITIES if c["name"].lower().startswith(q)]
if starts:
return starts[0]
any_ = [c for c in CITIES if q in c["name"].lower()]
return any_[0] if any_ else None
используется и для web (автоподстановка в поле) и для тг бота.
должна быть изменена на работу с русскими названиями (или локальный json или GeoNames free api или любая free api c количеством городов не меньше 100000)
2. функция
@router.message(Form.birth_city)
async def input_birth_city(m: Message, state: FSMContext):
city = find_city(m.text)
if not city:
await m.answer("❌ Город не найден, попробуйте ещё раз.")
return
await state.update_data(
birth_city=f"{city['name']}, {city['country']}",
lat=str(city["lat"]),
lon=str(city["lng"]),
)
data = await state.get_data()
if data["chart"] in ("day", "week"):
await state.set_state(Form.resid_city)
await m.answer("🏘️ Город проживания (англ!)")
else:
await produce_chart(m, state, data)
при ненахождении введенного города должна предложить ввести ближайший более крупный город и продолжать спрашивать пока город и его данные не будут получены из базы
результат нужен в виде куска кода, который можно будет встроить в проект
Разделы:
Опубликован:
20.06.2025 | 14:03 [поднят: 20.06.2025 | 14:03]