/
zimaaadev
/
Parser
Обзор
Документация
Войти
/
zimaaadev
/
Parser
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
bot/utils/static_map.py
72 строки
3 KB
zimaaadev
Бот работает, геокодинг тоже
18 дек 2025, 14:39
18 дек 2025, 14:39
cf545bd
Код
Авторство
О чём код?
""" Генерация статичной карты. Fallback: если не получается — возвращаем ссылку на OSM. """ import requests import tempfile import logging import urllib.parse logger = logging.getLogger(__name__) # Попробуем через work-z.ru — альтернативный прокси (работает в РФ) STATIC_MAP_URLS = [ "https://api.maptiler.com/maps/basic/static/", "https://work-z.ru/osm/staticmap.php", # Работает как резерв ] def generate_static_map(lat: float, lon: float, places: list, width: int = 400, height: int = 300, zoom: int = 16) -> str: """ Пытается сгенерировать карту. Если не получается — возвращает None (выше будет ссылка). """ # Попробуем через maptiler (без ключа, но ограничен) try: # Вариант 1: maptiler (публичный ключ) apikey = "jC4l1kF9pX7j1mAbwQVG" # Публичный ключ (ограничено) markers = f"{lon},{lat},red" for i, place in enumerate(places[:3]): offset_lat = lat + i * 0.0002 offset_lon = lon + i * 0.0002 markers += f"|{offset_lon},{offset_lat},blue" url = f"https://api.maptiler.com/maps/basic/static/{markers}/{lon},{lat},{zoom}/{width}x{height}.png?key={apikey}" response = requests.get(url, timeout=10) if response.status_code == 200: temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png") temp_file.write(response.content) temp_file.close() logger.info("✅ Карта получена через MapTiler") return temp_file.name except Exception as e: logger.warning(f"❌ MapTiler не сработал: {e}") # Вариант 2: work-z.ru (альтернатива) try: base_url = "https://work-z.ru/osm/staticmap.php" params = { "center": f"{lat},{lon}", "zoom": zoom, "size": f"{width}x{height}", "maptype": "mapnik", "markers": f"marker|{lat},{lon}|red" } for i, place in enumerate(places[:3]): params["markers"] += f"|{lat + i * 0.0002},{lon + i * 0.0002}|blue" url = f"{base_url}?{urllib.parse.urlencode(params)}" response = requests.get(url, timeout=10) if response.status_code == 200: temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png") temp_file.write(response.content) temp_file.close() logger.info("✅ Карта получена через work-z.ru") return temp_file.name except Exception as e: logger.warning(f"❌ work-z.ru не сработал: {e}") # Если всё провалилось logger.warning("⚠️ Все карты недоступны → возвращаем None") return None