Project_2. Местоположение с помощью IP-адреса (Python)

Проект, который не отнимет много времени, но даст опыт, да и положительные эмоции.

Описание

С помощью скрипта и IP-адреса вычисляем местоположение. Определить точную геолокацию по IP-адресу невозможно: все сервисы, позволяющие находить информацию по IP, могут определить местоположение только на уровне города. Невозможно вычислить ваш или любой другой точный домашний адрес по IP. Это могут сделать правоохранительные органы только в том случае, если они обратятся к Интернет-провайдеру в случае нарушения вами закона.

Код

Создадим 2 файла, которые будут иметь разный функционал:

Начнём с 1-го файла. Всё ещё импортируем то, что потребуется для реализации проекта.

import requests
import database

Напоминаем, что database — это 2-й файл.

Первая функция — main().

Функция main() используется для разделения блоков кода в программе. Использование функции main() обязательно в таких языках, как Java, потому что это упрощает понимание того, в каком порядке код запускается в программе. В Python функцию main() писать необязательно, но это улучшает читаемость кода.

Функция принимает в виде аргумента строку, которая просит ввести IP-адрес. Затем main() передаёт функции location() данные.

def main(start: str):
    print(start)
    ip = input("IP address: ")
    try:
        new_data = location(ip)
        database.base(new_data)
    except ValueError:
        pass


if __name__ == "__main__":
    main("Enter the IP address")

Вторая функция location() принимает в виде аргумента строку с IP-адресом. Отправляем запрос с помощью метода get.

GET является одним из самых популярных HTTP методов. Метод GET указывает на то, что происходит попытка извлечь данные из определенного ресурса. Для того, чтобы выполнить запрос GET, используется requests.get().

Используя .status_code, можно увидеть код состояния, который возвращается с сервера.

Если будет выведено 404, то значит что-то пошло не так.

Следующий этап — проверка на корректный IP-адрес. Если IP-адрес некорректный, то возвращает функцию main() с новой строкой, где сообщается, что нужно ввести корректный IP-адрес. Если всё хорошо, то создаём пустой список. С помощью цикла выводим все данные, которые необходимы и добавляем в список. Вывод будет выглядеть так.

Enter the IP address
IP address: 185.101.203.42
[Status]: success
[Country]: Болгария
[Countrycode]: BG
[Region]: 22
[Regionname]: Sofia-Capital
[City]: София
[Zip]: 1000
[Lat]: 42.6951
[Lon]: 23.325
[Timezone]: Europe/Sofia
[Isp]: SIA "Singularity Telecom"
[Org]: SIA "Singularity Telecom"
[As]: AS209372 SIA "Singularity Telecom"
[Query]: 185.101.203.42

Возвращаем кортеж с данными.

def location(ip: str):
    response = requests.get(f"http://ip-api.com/json/{ip}?lang=ru")
    if response.status_code == 404:
        print("Oops")
    result = response.json()
    if result["status"] == "fail":
        return main("Enter the correct IP address")

    record = []

    for key, value in result.items():
        record.append(value)
        print(f"[{key.title()}]: {value}")
    return tuple(record)

Теперь переходим ко второму файлу database.py, где будет создана база данных с добавлением новых данных.

Импорт, как всегда, с нами. Для базы данных потребуется библиотека sqlite3.

import sqlite3

Создаём функцию, которая принимает аргумент в виде кортежа.

Во-первых, нам нужно создать новую базу данных и открыть подключение к базе данных, чтобы разрешить sqlite3 работать с ней. Вызов sqlite3.connect()поможет нам в том. Если базы данных database.db не существует, то будет неявно создана.

Чтобы выполнять инструкции SQL и извлекать результаты из SQL-запросов, нам нужно будет использовать курсор базы данных. Вызов con.cursor() в деле.

Теперь, когда у нас есть подключение к базе данных и курсор, мы можем создать таблицы базы данных со столбцами, которые необходимы.

Если в базе данных уже присутствует какой-либо IP-адрес, то выводим «Duplicate ». Если нет, то добавляем в базу новые данные. Вызов conn.commit() зафиксирует транзакцию, скажем так. Так будет выглядеть база данных.

Таблица

Таблица

def base(data: tuple):
    conn = sqlite3.connect("database.db")
    cur = conn.cursor()
    cur.execute("""CREATE TABLE IF NOT EXISTS location(
    Status TEXT,
    Country TEXT,
    Countrycode TEXT,
    Region TEXT,
    Regionname TEXT,
    City TEXT,
    Zip INT,
    Lat REAL,
    Lon REAL,
    Timezone TEXT,
    Isp TEXT,
    Org TEXT,
    Auto_system TEXT,
    Query TEXT);
    """)
    try:
        check = cur.execute(f"SELECT * FROM location WHERE Query=?", (data[-1],))
        if len(list(*check)) == 0:
            cur.execute("INSERT INTO location VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);", data)
            conn.commit()
        else:
            print("Duplicate")
    except TypeError:
        pass

Сценарий

main.py

# Location by IP
# Location search by IP address using Python
import requests
import database


def location(ip: str):
    response = requests.get(f"http://ip-api.com/json/{ip}?lang=ru")
    if response.status_code == 404:
        print("Oops")
    result = response.json()
    if result["status"] == "fail":
        return main("Enter the correct IP address")

    record = []

    for key, value in result.items():
        record.append(value)
        print(f"[{key.title()}]: {value}")
    return tuple(record)


def main(start: str):
    print(start)
    ip = input("IP address: ")
    try:
        new_data = location(ip)
        database.base(new_data)
    except ValueError:
        pass


if __name__ == "__main__":
    main("Enter the IP address")

database.py

import sqlite3


def base(data: tuple):
    conn = sqlite3.connect("database.db")
    cur = conn.cursor()
    cur.execute("""CREATE TABLE IF NOT EXISTS location(
    Status TEXT,
    Country TEXT,
    Countrycode TEXT,
    Region TEXT,
    Regionname TEXT,
    City TEXT,
    Zip INT,
    Lat REAL,
    Lon REAL,
    Timezone TEXT,
    Isp TEXT,
    Org TEXT,
    Auto_system TEXT,
    Query TEXT);
    """)
    try:
        check = cur.execute(f"SELECT * FROM location WHERE Query=?", (data[-1],))
        if len(list(*check)) == 0:
            cur.execute("INSERT INTO location VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);", data)
            conn.commit()
        else:
            print("Duplicate")
    except TypeError:
        pass

Заключение

Некоторые компании специализируются на сборе информации о диапазоне IP-адресов со всего мира. Они продают эту информацию в виде консолидированных баз данных, которые легко интегрируются в любой веб-сервер с целью быстрого поиска информации о стране, регионе, городе или Интернет-провайдере. Точность этих баз данных колеблется от 80 до 99,8%, согласно их собственным утверждениям. Данный проект показал, как можно легко написать маленький скрипт, который будет собирать необходимую информацию с помощью таких баз.

Ссылка на GitHub

© Habrahabr.ru