Возможность узнать, город по IP-адресу в России.

REST API Dadata — это современный и удобный инструмент для работы с данными, который предоставляет доступ к различным видам информации, включая адреса компаний, почтовые индексы, кадастровые номера и другую полезную информацию.

Основные возможности REST API Dadata:
Работа с адресами компаний: получение информации о регионе, городе, улице, доме и квартире, почтовом индексе, часовом поясе и стоимости квартиры.
Геокодирование: определение координат по адресу и возврат почтового индекса, координат и другой информации об адресе.
Обратное геокодирование: определение адреса по координатам. Определение города по IP-адресу. Получение информации об адресе по кадастровому номеру, коду ФИАС или коду КЛАДР.
Определение кадастрового номера дома или квартиры.
Поиск ближайшего почтового отделения.
Работа с компаниями: поиск компаний по ИНН, КПП, ОГРН, учредителям, руководителям и другой информации.
Аффилированные компании: поиск организаций, связанных с другими компаниями по ИНН учредителей и руководителей.
Работа с электронной почтой: получение информации об организации, которой принадлежит email.
Самозанятые: поиск информации о самозанятых через API налоговой.
Работа с банками: поиск информации о банках по БИК, SWIFT, ИНН, рег. номеру, реквизитам, корр. счёту и статусу.
Работа с ФИО: разбор ФИО из строки, стандартизация, определение пола и склонение по падежам.
Работа с телефонами: проверка телефона по справочнику Россвязи, определение оператора, страны и города.
Работа с паспортами: проверка паспорта по реестру МВД, определение организации, выдавшей паспорт, и ИНН по паспорту.
Работа с email: проверка email на одноразовые адреса, классификация адресов на личные, корпоративные и «ролевые».
Чтобы начать работу с API-DADATA, зарегистрируйтесь и подтвердите почту.
Используем IP-адрес клиента, значение из параметра ip или заголовок X-Forwarded-For. Возвращает детальную информацию о городе, в том числе почтовый индекс. Просто подключить API «город по IP» , бесплатный лимит в 10 000 запросов в сутки.

pip install dadata


from dadata import Dadata

token = "Replace with Dadata API key"
secret = "Replace with Dadata secret key"

dadata = DadataAsync(token, secret)


data = await dadata.iplocate("46.226.227.20")

await dadata.close()


print(data)

{
    "location": {
        "value": "г Краснодар",
        "unrestricted_value": "350000, Краснодарский край, г Краснодар",
        "data": {
            "postal_code": "350000",
            "country": "Россия",
            "country_iso_code": "RU",
            "federal_district": "Южный",
            "region_fias_id": "d00e1013-16bd-4c09-b3d5-3cb09fc54bd8",
            "region_kladr_id": "2300000000000",
            "region_iso_code": "RU-KDA",
            "region_with_type": "Краснодарский край",
            "region_type": "край",
            "region_type_full": "край",
            "region": "Краснодарский",
            "area_fias_id": null,
            "area_kladr_id": null,
            "area_with_type": null,
            "area_type": null,
            "area_type_full": null,
            "area": null,
            "city_fias_id": "7dfa745e-aa19-4688-b121-b655c11e482f",
            "city_kladr_id": "2300000100000",
            "city_with_type": "г Краснодар",
            "city_type": "г",
            "city_type_full": "город",
            "city": "Краснодар",
            ...
        }
    }
}

Если город не удалось определить, ответ будет таким:

{
    "location": null
}

#Для получения ip адреса 

await def get_ip(request: Request) -> str:
    ip =  request.forwarded.get("for", None)
    if not ip:
        ip = request.ip or request.remote_addr
    return ip