Skip to main content

A random user-agent generator

Project description

ua-generator

A random user-agent generator for Python >= 3.9

Features

  • No dependency.
  • No external user-agent list, no downloads.
  • User-agent versions are hardcoded into the code.
  • Platform and browser versions are based on real releases.
  • Client Hints (Sec-CH-UA fields).
  • Easy to integrate into HTTP libraries.

Install & upgrade

pip install -U ua-generator

Note: Upgrade ua-generator periodically to keep user-agent versions up to date.

Basic usage

import ua_generator

ua = ua_generator.generate()
print(ua) # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/15.2 Safari/604.1.38

Customization

It takes three different parameters to customize the user-agent.

device = ['desktop', 'mobile']
platform = ['windows', 'macos', 'ios', 'linux', 'android']
browser = ['chrome', 'edge', 'firefox', 'safari']

Note: All parameters are optional and multiple types can be specified using a list (or tuple).

Customized user-agent generation:

import ua_generator

# Example 1:
ua = ua_generator.generate(device='desktop', browser=['chrome', 'edge'])
print(ua.text) # Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
print(ua.platform) # windows
print(ua.browser) # chrome
print(ua.ch.brands) # "Not A(Brand";v="99", "Chromium";v="129", "Google Chrome";v="129"
print(ua.ch.brands_full_version_list) # "Not A(Brand";v="99.0.0.0", "Chromium";v="129.0.6668.116", "Google Chrome";v="129.0.6668.116"
print(ua.ch.mobile) # ?0
print(ua.ch.platform) # "Windows"
print(ua.ch.platform_version) # "13.0.0"
print(ua.ch.browser_version) # "129"
print(ua.ch.browser_full_version) # "129.0.6668.116"
print(ua.ch.bitness) # "64"
print(ua.ch.architecture) # "x86"
print(ua.ch.wow64) # "?1"

# Example 2:
ua = ua_generator.generate(platform=['ios', 'macos'], browser='edge')
print(ua.text) # Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/117.0.2045.73 Version/18.0 Mobile/15E148 Safari/604.1
print(ua.platform) # ios
print(ua.browser) # edge
print(ua.ch.brands) # "Not A(Brand";v="99", "Chromium";v="117", "Microsoft Edge";v="117"
print(ua.ch.brands_full_version_list) # "Not A(Brand";v="99.0.0.0", "Chromium";v="117.0.2045.73", "Microsoft Edge";v="117.0.2045.73"
print(ua.ch.mobile) # ?1
print(ua.ch.platform) # "iOS"
print(ua.ch.platform_version) # "18.6.1"
print(ua.ch.browser_version) # "117"
print(ua.ch.browser_full_version) # "117.0.2045.73"
print(ua.ch.bitness) # "64"
print(ua.ch.architecture) # arm
print(ua.ch.wow64) # ?0

Headers

ua = ua_generator.generate(browser=['chrome', 'edge'])

# This will return a dictionary containing the generated user-agent:
print(ua.headers.get())
{
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.43 Safari/537.36',
    'sec-ch-ua': '"Not A(Brand";v="99", "Chromium";v="103", "Google Chrome";v="103"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"'
}

# Extending the "Client Hints" by a value of the "Accept-CH" header:
ua.headers.accept_ch('Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List')
print(ua.headers.get())
{
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.94 Safari/537.36',
    'sec-ch-ua': '"Not A(Brand";v="99", "Chromium";v="122", "Google Chrome";v="122"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-ch-ua-platform-version': '"14.1.0"',
    'sec-ch-ua-full-version-list': '"Not A(Brand";v="99.0.0.0", "Chromium";v="122.0.6261.94", "Google Chrome";v="122.0.6261.94"'
}

Integrating into the requests:

import requests
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
r = requests.get('https://httpbin.org/get', headers=ua.headers.get())

Integrating into the httpx:

import httpx
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
r = httpx.get('https://httpbin.org/get', headers=ua.headers.get())

Integrating into the urllib:

import urllib.request
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
request = urllib.request.Request('https://httpbin.org/get', headers=ua.headers.get())
handler = urllib.request.urlopen(request)
response = handler.read().decode('utf-8')

Integrating into the Selenium:

import time
from selenium import webdriver
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'], device=['desktop'])
driver = webdriver.Chrome()
driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', {'headers': ua.headers.get()})
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
    'userAgent': ua.text,
    'userAgentMetadata': ua.navigator.get()
})
driver.get('https://browserleaks.com/client-hints')
time.sleep(1000)

Options

You can define options using the "options" parameter for further customization.

weighted_versions

To increase the probability of the latest versions being chosen. Default is False.

import ua_generator
from ua_generator.options import Options

# Enabling weighted versions
options = Options()
options.weighted_versions = True
ua = ua_generator.generate(browser=['chrome', 'edge'], options=options)

version_ranges

To choose only versions within specified ranges. Default is None.

import ua_generator
from ua_generator.options import Options
from ua_generator.data.version import VersionRange

# Choosing only versions within specified ranges
options = Options()
options.version_ranges = {
    'chrome': VersionRange(125, 129),  # Choose version between 125 and 129
    'edge': VersionRange(min_version=120),  # Choose version 120 minimum
}
ua = ua_generator.generate(browser='chrome', options=options)

Note: If there is no valid version within the range you set, the filter will just skip it and return a random valid version instead.

tied_safari_version

To make Safari version tied to macOS/iOS version. Default is False.

Issues

You can create an issue from here if you are experiencing a problem.

Contributing

Pull requests are welcome. Don't forget to run tests.

Contributors

Ekin Karadeniz (@iamdual) and the GitHub community.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ua_generator-2.0.21.tar.gz (28.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ua_generator-2.0.21-py3-none-any.whl (32.4 kB view details)

Uploaded Python 3

File details

Details for the file ua_generator-2.0.21.tar.gz.

File metadata

  • Download URL: ua_generator-2.0.21.tar.gz
  • Upload date:
  • Size: 28.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ua_generator-2.0.21.tar.gz
Algorithm Hash digest
SHA256 2482554a4f10841c8c50bf6c786b9ce7d596e70e782106ffe94c40f6333ef630
MD5 e85c0e231699765ac373a5209bc154b7
BLAKE2b-256 a5f7af14ce1229d6a6d95ca9a462860fad6d3a827787c01bcbc9cae5ae79cb5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ua_generator-2.0.21.tar.gz:

Publisher: release.yml on iamdual/ua-generator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ua_generator-2.0.21-py3-none-any.whl.

File metadata

  • Download URL: ua_generator-2.0.21-py3-none-any.whl
  • Upload date:
  • Size: 32.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ua_generator-2.0.21-py3-none-any.whl
Algorithm Hash digest
SHA256 c4ae271cc6df8a95efbd8a64e9daf6312be1e6340ed740306fd54b1ff77a3fd3
MD5 a9851614d1fa1a5eda96a39b84f0403d
BLAKE2b-256 2eb63cfdd4885daf26450eccfc5cdb150caf2cab984bb03bf073479f3a4c2ea1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ua_generator-2.0.21-py3-none-any.whl:

Publisher: release.yml on iamdual/ua-generator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page