How to get a user’s IP address in Python

Last Updated Jan 27, 2021
Emma Jagger

Engineer, maker, Google alumna, CMU grad

Because an IP address uniquely identifies every machine on a network, user IP addresses provide a useful way to track new and repeat visitors to your platform. Additionally, geolocating an IP address provides a way to obtain information on a user's real-world location. This information can be used to improve your marketing by incorporating targeted advertisements and to improve the user experience by customizing your platform to their location.

This blog post covers how to identify a user's IP address using Python.

Get an IP address in Python using the network socket interface

One way to obtain a user's IP address is by using Python's native low-level networking interface, socket. A user's IP address can be obtained by querying the device's host name and then getting the associated IP address:


import socket

# get the hostname of the socket
hostname = socket.gethostname()
# get the IP address of the hostname
ip_address = socket.gethostbyname(hostname)
print('IP Address:{}'.format(ip_address))

Drawbacks to using sockets to get IP addresses in Python

The primary drawback of this method is that its behavior may be platform dependent, since it relies on the operating system's socket APIs. Although it is available on all modern Windows, MacOS, and Unix systems, this method may not work for older operating systems. Additionally, this approach may not work for devices that operate on less common platforms.

This approach also only provides the device's IP address without any additional information from the IP. Although this data can be used to identify unique visitors to a platform, obtaining information about a user's location or Internet provider requires queries to external databases.

Get an IP address in Python using Abstract's Geolocation API

Abstract API offers a free geolocation API that obtains a user's IP address and provides associated location information. A query to this API also provides information relevant to the user's location, such as their timezone, currency, and regional flag. This information makes it possible to customize the user experience across your platform with just a single data call.

To obtain a user's IP address and its associated location info, we can perform a simple call to Abstract's Geolocation API:


import requests
import json

# Your API key, available from your account page
YOUR_GEOLOCATION_KEY = 'your_key'

# URL to send the request to
request_url = 'https://ipgeolocation.abstractapi.com/v1/?api_key=' + YOUR_GEOLOCATION_KEY
response = requests.get(request_url)
result = json.loads(response.content)
print(result)
print('ip_address: {}'.format(result['ip_address']))

This approach provides a variety of geolocation information in addition to the user's IP address. If this data was requested for a user with the IP address 139.130.4.5, the call would return the following information:


{
    'ip_address': '139.130.4.5',
    'city': 'Sydney',
    'city_geoname_id': 2147714,
    'region': 'New South Wales',
    'region_iso_code': 'NSW',
    'region_geoname_id': 2155400,
    'postal_code': '1001',
    'country': 'Australia',
    'country_code': 'AU',
    'country_geoname_id': 2077456,
    'country_is_eu': False,
    'continent': 'Oceania',
    'continent_code': 'OC',
    'continent_geoname_id': 6255151,
    'longitude': 151.209,
    'latitude': -33.8688,
    'security': {
        'is_vpn': False
    },
    'timezone': {
        'name': 'Australia/Sydney',
        'abbreviation': 'AEDT',
        'gmt_offset': 11,
        'current_time': '12:17:29',
        'is_dst': True
    },
    'flag': {
        'emoji': '🇦🇺',
        'unicode': 'U+1F1E6 U+1F1FA',
        'png': 'https://static.abstractapi.com/country-flags/AU_flag.png',
        'svg': 'https://static.abstractapi.com/country-flags/AU_flag.svg'
    },
    'currency': {
        'currency_name': 'Australian Dollars',
        'currency_code': 'AUD'
    },
    'connection': {
        'autonomous_system_number': 1221,
        'autonomous_system_organization': 'Telstra Corporation',
        'connection_type': 'Corporate',
        'isp_name': 'Telstra Internet',
        'organization_name': None
    }
}
Abstract makes IP geolocation in Python simple.
Get started