Модуль для ТГ-бота

S
Заказчик
Отзывы фрилансеров: + 2 - 0
Зарегистрирован на сайте 17 лет и 9 месяцев
Бюджет: по договоренности
Исполнитель определен: Артём Новиков  
есть бот в телеграмме (питон + 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]

Теги: Разработка чат-ботов, недорого, FL.ru

Наши партнеры
Сведения об ООО «Ваан» внесены в реестр аккредитованных организаций, осуществляющих деятельность в области информационных технологий. ООО «Ваан» осуществляет деятельность, связанную с использованием информационных технологий, по разработке компьютерного программного обеспечения, предоставлению доступа к программе для ЭВМ и является правообладателем программы для ЭВМ «Платформа FL.ru (версия 2.0)».