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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2482554a4f10841c8c50bf6c786b9ce7d596e70e782106ffe94c40f6333ef630
|
|
| MD5 |
e85c0e231699765ac373a5209bc154b7
|
|
| BLAKE2b-256 |
a5f7af14ce1229d6a6d95ca9a462860fad6d3a827787c01bcbc9cae5ae79cb5a
|
Provenance
The following attestation bundles were made for ua_generator-2.0.21.tar.gz:
Publisher:
release.yml on iamdual/ua-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ua_generator-2.0.21.tar.gz -
Subject digest:
2482554a4f10841c8c50bf6c786b9ce7d596e70e782106ffe94c40f6333ef630 - Sigstore transparency entry: 928224339
- Sigstore integration time:
-
Permalink:
iamdual/ua-generator@0df91a6ca62fd3353a733962af2c1bb9541a91b9 -
Branch / Tag:
refs/tags/2.0.21 - Owner: https://github.com/iamdual
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0df91a6ca62fd3353a733962af2c1bb9541a91b9 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4ae271cc6df8a95efbd8a64e9daf6312be1e6340ed740306fd54b1ff77a3fd3
|
|
| MD5 |
a9851614d1fa1a5eda96a39b84f0403d
|
|
| BLAKE2b-256 |
2eb63cfdd4885daf26450eccfc5cdb150caf2cab984bb03bf073479f3a4c2ea1
|
Provenance
The following attestation bundles were made for ua_generator-2.0.21-py3-none-any.whl:
Publisher:
release.yml on iamdual/ua-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ua_generator-2.0.21-py3-none-any.whl -
Subject digest:
c4ae271cc6df8a95efbd8a64e9daf6312be1e6340ed740306fd54b1ff77a3fd3 - Sigstore transparency entry: 928224347
- Sigstore integration time:
-
Permalink:
iamdual/ua-generator@0df91a6ca62fd3353a733962af2c1bb9541a91b9 -
Branch / Tag:
refs/tags/2.0.21 - Owner: https://github.com/iamdual
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0df91a6ca62fd3353a733962af2c1bb9541a91b9 -
Trigger Event:
release
-
Statement type: