[![Test & Deploy fake-useragent](https://github.com/fake-useragent/fake-useragent/actions/workflows/action.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/action.yml?query=branch%3Amain)
[![Ruff linter](https://github.com/fake-useragent/fake-useragent/actions/workflows/ruff.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/ruff.yml?query=branch%3Amain)
[![CodeQL](https://github.com/fake-useragent/fake-useragent/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/codeql.yml?query=branch%3Amain)
# fake-useragent
Up-to-date simple useragent faker with real world database.
## Features
- Data is pre-downloaded from [https://user-agents.net/](https://user-agents.net/download) and the data is part of the package
- The data consists of the current browser versions or one version lower
- Retrieves user-agent strings locally (both desktop and mobile UAs)
- Retrieve user-agent Python dictionary
- Supports Python 3.x
### Installation
```sh
pip install fake-useragent
```
Or if you have multiple Python / pip versions installed, use `pip3`:
```sh
pip3 install fake-useragent
```
### Usage
Simple usage examples below, see also next chapters in this readme for more advanced usages:
```py
from fake_useragent import UserAgent
ua = UserAgent()
# Get a random browser user-agent string
print(ua.random)
# Or get user-agent string from a specific browser
print(ua.chrome)
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
print(ua.google)
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13
print(ua['google chrome'])
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36
print(ua.firefox)
# Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
print(ua.ff)
# Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
print(ua.safari)
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Safari/605.1.15
```
#### Additional usage
Additional features that fake-useragent now offers since v1.2.0.
If you want to specify your own browser list, you can do that via the `browsers` argument (default is: `["chrome", "edge", "firefox", "safari"]`).
This example will only return random user-agents from Edge and Chrome:
```py
from fake_useragent import UserAgent
ua = UserAgent(browsers=['edge', 'chrome'])
ua.random
```
_Note:_ Fakeuser-agent knowns about: Chrome, Edge, Firefox and Safari. Other browsers are not popular enough and aren't part of our dataset we use.
---
If you want to specify your own operating systems, you can do that via the `os` argument (default is: `["windows", "macos", "linux"]`).
In this example you will only get Linux user-agents back:
```py
from fake_useragent import UserAgent
ua = UserAgent(os='linux')
ua.random
```
---
You can also specify the type of platforms you want to use, you can do that via the `platforms` argument (default is `["pc", "mobile", "tablet"]`.
This example will only return random user-agents from a mobile device:
```py
from fake_useragent import UserAgent
ua = UserAgent(platforms='mobile')
ua.random
```
---
If you want to return more recent user-agent strings, you can play with the `min_version` argument (default is: `0.0`, meaning all user agents will match).
In this example you get only user agents that have a minimum version of 120.0:
```py
from fake_useragent import UserAgent
ua = UserAgent(min_version=120.0)
ua.random
```
---
For backwards compatibility, a minimum usage percentage can still be specified with the `min_percentage` argument. However, the current list of user agents does
not contain this statistic. Therefore all of the user-agents will match.
---
_Hint:_ Of-course you can **combine all those arguments** to you liking!
#### User-agent Python Dictionary
Since version 1.3.0 we now also offer you the following "get" properties which return the whole Python dictionary of the UA, instead of only the user-agent string:
> **Warning**
> Raw JSON objects (in a Python dictionaries) are returned "as is".
> Meaning, this data structure could change in the future!
>
> Be aware that these "get" properties below might not return the same key/value pairs in the future.
> Use `ua.random` or alike as mentioned above, if you want to use a stable interface.
```py
from fake_useragent import UserAgent
ua = UserAgent()
# Random user-agent dictionary (object)
ua.getRandom
# {'percent': 0.8, 'useragent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76', 'system': 'Edge 116.0 Win10', 'browser': 'edge', 'version': 116.0, 'os': 'win10'}
# More get properties:
ua.getFirefox
# {'percent': 0.3, 'useragent': 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/118.0', 'system': 'Firefox 118.0 Win10', 'browser': 'firefox', 'version': 118.0, 'os': 'win10'}
ua.getChrome
ua.getSafari
ua.getEdge
# And a method with an argument.
# This is exactly the same as using: ua.getFirefox
ua.getBrowser('firefox')
```
### Notes
You can override the fallback string using the `fallback` parameter, in very rare cases something failed:
```py
import fake_useragent
ua = fake_useragent.UserAgent(fallback='your favorite Browser')
# in case if something went wrong, one more time it is REALLY!!! rare case
ua.random == 'your favorite Browser'
```
If you will try to get unknown browser:
```py
from fake_useragent import UserAgent
ua = UserAgent()
print(ua.unknown)
#Error occurred during getting browser: randm, but was suppressed with fallback.
#Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
```
If you need to safe some attributes from overriding them in UserAgent by `__getattr__` method
use `safe_attrs` you can pass there attributes names.
At least this will prevent you from raising FakeUserAgentError when attribute not found.
For example, when using fake*useragent with `injections <https://github.com/tailhook/injections>`* you need to:
```py
import fake_useragent
ua = fake_useragent.UserAgent(safe_attrs=('__injections__',))
```
Please, do not use if you don't understand why you need this.
This is magic for rarely extreme case.
### Experiencing issues?
Make sure that you using latest version!
```sh
pip install --upgrade fake-useragent
```
Or if that isn't working, try to install the latest package version like this (`1.5.1` is an example, check what the [latest version is on PyPi](https://pypi.org/project/fake-useragent/#history)):
```sh
pip install fake-useragent==1.5.1
```
Check version via the Python console:
```py
import fake_useragent
print(fake_useragent.VERSION)
```
And you are always welcome to post [issues](https://github.com/fake-useragent/fake-useragent/issues).
Please do not forget to mention the version that you are using.
### For Developers
Since GitHub Actions is unable to reach willshouse.com and has Cloudflare protection. We can run the script below to automatically scrape the user-agent strings from the external data source. The script will copy the [JSONlines](https://jsonlines.org/) file to the `src/fake_useragent/data` directory. Execute:
```sh
./update_data_file.sh
```
The data JSON file is part of the Python package, see [pyproject.toml](pyproject.toml). Read more about [Data files support](https://setuptools.pypa.io/en/latest/userguide/datafiles.html).
### Python Virtual Environment
We encourage to use Python virtual environment before installing Pip packages, like so:
```sh
python -m virtualenv env
source env/bin/activate
```
#### Tests
```sh
pip install -r requirements.txt
tox
```
#### Linting
To fix imports using ruff:
```sh
pip install -r requirements.txt
ruff check --select="I" --fix .
```
Fix black code formatting errors:
```sh
pip install -r requirements.txt
black .
```
_Note:_ When ruff v1.0 releases, we most likely move fully towards `ruff` instead of `black`.
### Changelog
- 1.5.1 March 16, 2024
- Remove trailing spaces in user agent strings
- 1.5.0 March 8, 2024
- Migrated to new user-agent data source (thanks @BoudewijnZwart), backwards compatible API.
- Update all pip package dependencies to latest stable versions
- 1.4.0 November 24, 2023
- Update all PIP packages
- Support Python 3.12 (thanks @vladkens)
- Fix package conflict in cache scraper
- Improve ruff CLI calls
- 1.3.0 October 2, 2023
- Introducing new `ua.getRandom`, `ua.getFirefox`, `ua.getChrome`, `ua.getSafari`. And a generic method: `ua.getBrowser(..)` (eg. `getBrowser('firefox')`)
- These new properties above allows you to retrieve the whole raw Python dictionary, instead of only the UA string.
- These properties might return different key/values pairs in the future!
- Fix the `os` argument 'windows' to check for both `win10`and `win7` values (previously only checking on `win10`), thus returning more UAs
- Improved user-agent scraper (now also containing Safari browser again)
- Updated browsers.json data file
- 1.2.1 August 2, 2023
- Small improvements in the `min_percentage` check
- Update all Pip package dependencies
- 1.2.0 August 2, 2023
- Updated browser useragent data
- Allow filters on browser, OS and usage percentage
- Update the cache scraper to scape the new data source for user-agent strings
- Adapted the code to work with the new JSON data format
- Parameter `use_external_data=True` and `verify_ssl` are **removed**. If you use those parameters, just remove it in your code!
- 1.1.3 March 20, 2023
- Update dependencies
- 1.1.2 February 8, 2023
- Security fixes
- 1.1.1 December 4, 2022
- Remove whitespaces from user agent strings, this is a patch release
- 1.1.0 November 26, 2022
- Add `pkg_resource` as fallback mechanism in trying to retrieve the local JSON data file
- 1.0.1 November 10, 2022
- Add `importlib-metadata` & `importlib-resources` as dependencies
- Check on specific Python version regarding the importlib resources (python v3.10 or higher) in order to have `files()` working
- `importlib_metadata` should now also work on Python version before 3.8
- Remove obsolete `MANIFEST.in` file
- 1.0.0 November 17, 2022
- Make the JSON Lines data file part of the Python package, data is retrieved locally
- Extend the `myproject.toml` file with `package-data` support
- Remove centralized caching server implementation
- Make real unit-tests which should run reliable, fast, independent and without Internet connection
- 0.1.14 November 5, 2022
- Improve code quality standards using modern Python >=3.7 syntax
- Migrated to `pyproject.toml` build system format + syntax check
- Add additional classifiers to the toml file
- Improved `tox.ini` file
- Improved GitHub Actions job using pip cache
- And various small fixes
- 0.1.13 October 21, 2022
- Implement `browsers` argument, allowing you to override the browser names you want to use
- Fix browser listing of Internet Explorer and Edge
- Don't depend on w3schools.com anymore
- Clean-up data (temp) file format
- Update fallback cache server URL / use JSON Lines as file format
- Move to GitHub Actions instead of Travis
- Using [`black`](https://pypi.org/project/black/) Python formatter in favour of Flake
- 0.1.12 March 31, 2022
- forked
- 0.1.11 October 4, 2018
- moved `s3 + cloudfront` fallback to `heroku.com`, cuz someone from Florida did ~25M requests last month
- 0.1.10 February 11, 2018
- Minor fix docs `cloudfront` url
- 0.1.9 February 11, 2018
- fix `w3schools.com` renamed `IE/Edge` to `Edge/IE`
- moved `heroku.com` fallback to `s3 + cloudfront`
- stop testing Python3.3 and pypy
- 0.1.8 November 2, 2017
- fix `useragentstring.com` `Can't connect to local MySQL server through socket`
- 0.1.7 April 2, 2017
- fix broken README.rst
- 0.1.6 April 2, 2017
- fixes bug `use_cache_server` do not affected anything
- `w3schools.com <https://www.w3schools.com/browsers/browsers_stats.asp>`\_ moved to `https`
- `verify_ssl` options added, by default it is `True` (`urllib.urlopen` ssl context for Python 2.7.9- and 3.4.3- is not supported)
- 0.1.5 February 28, 2017
- added `ua.edge` alias to Internet Explorer
- w3schools.com starts displaying `Edge` statistic
- Python 2.6 is not tested anymore
- `use_cache_server` option added
- Increased `fake_useragent.settings.HTTP_TIMEOUT` to 5 seconds
- 0.1.4 December 14, 2016
- Added custom data file location support
- Added `fallback` browser support, in case of unavailable data sources
- Added alias `fake_useragent.FakeUserAgent` for `fake_useragent.UserAgent`
- Added alias `fake_useragent.UserAgentError` for `fake_useragent.FakeUserAgentError`
- Reduced `fake_useragent.settings.HTTP_TIMEOUT` to 3 seconds
- Started migration to new data file format
- Simplified a lot 4+ years out of date code
- Better thread/greenlet safety
- Added verbose logging
- Added `safe_attrs` for prevent overriding by `__getattr__`
- 0.1.3 November 24, 2016
- Added hosted data file, when remote services is unavailable
- Raises `fake_useragent.errors.FakeUserAgentError` in case when there is not way to download data
- Raises `fake_useragent.errors.FakeUserAgentError` instead of `None` in case of unknown browser
- Added `gevent.sleep` support in `gevent` patched environment when trying to download data
- X.X.X xxxxxxx xx, xxxx
- xxxxx ?????
### Authors
You can visit [authors page](https://github.com/fake-useragent/fake-useragent/blob/main/AUTHORS).
Raw data
{
"_id": null,
"home_page": "",
"name": "fake-useragent",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "user,agent,user agent,useragent,fake,fake useragent,fake user agent",
"author": "",
"author_email": "Melroy van den Berg <melroy@melroy.org>, Victor Kovtun <hellysmile@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/24/a1/1f662631ab153975fa8dbf09296324ecbaf53370dce922054e8de6b57370/fake-useragent-1.5.1.tar.gz",
"platform": null,
"description": "[![Test & Deploy fake-useragent](https://github.com/fake-useragent/fake-useragent/actions/workflows/action.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/action.yml?query=branch%3Amain)\n[![Ruff linter](https://github.com/fake-useragent/fake-useragent/actions/workflows/ruff.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/ruff.yml?query=branch%3Amain)\n[![CodeQL](https://github.com/fake-useragent/fake-useragent/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/fake-useragent/fake-useragent/actions/workflows/codeql.yml?query=branch%3Amain)\n\n# fake-useragent\n\nUp-to-date simple useragent faker with real world database.\n\n## Features\n\n- Data is pre-downloaded from [https://user-agents.net/](https://user-agents.net/download) and the data is part of the package\n- The data consists of the current browser versions or one version lower\n- Retrieves user-agent strings locally (both desktop and mobile UAs)\n- Retrieve user-agent Python dictionary\n- Supports Python 3.x\n\n### Installation\n\n```sh\npip install fake-useragent\n```\n\nOr if you have multiple Python / pip versions installed, use `pip3`:\n\n```sh\npip3 install fake-useragent\n```\n\n### Usage\n\nSimple usage examples below, see also next chapters in this readme for more advanced usages:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent()\n\n# Get a random browser user-agent string\nprint(ua.random)\n\n# Or get user-agent string from a specific browser\nprint(ua.chrome)\n# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\nprint(ua.google)\n# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13\nprint(ua['google chrome'])\n# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36\nprint(ua.firefox)\n# Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\nprint(ua.ff)\n# Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0\nprint(ua.safari)\n# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Safari/605.1.15\n```\n\n#### Additional usage\n\nAdditional features that fake-useragent now offers since v1.2.0.\n\nIf you want to specify your own browser list, you can do that via the `browsers` argument (default is: `[\"chrome\", \"edge\", \"firefox\", \"safari\"]`). \nThis example will only return random user-agents from Edge and Chrome:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent(browsers=['edge', 'chrome'])\nua.random\n```\n\n_Note:_ Fakeuser-agent knowns about: Chrome, Edge, Firefox and Safari. Other browsers are not popular enough and aren't part of our dataset we use.\n\n---\n\nIf you want to specify your own operating systems, you can do that via the `os` argument (default is: `[\"windows\", \"macos\", \"linux\"]`). \nIn this example you will only get Linux user-agents back:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent(os='linux')\nua.random\n```\n\n---\n\nYou can also specify the type of platforms you want to use, you can do that via the `platforms` argument (default is `[\"pc\", \"mobile\", \"tablet\"]`.\nThis example will only return random user-agents from a mobile device:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent(platforms='mobile')\nua.random\n```\n\n---\n\nIf you want to return more recent user-agent strings, you can play with the `min_version` argument (default is: `0.0`, meaning all user agents will match). \nIn this example you get only user agents that have a minimum version of 120.0:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent(min_version=120.0)\nua.random\n```\n\n---\n\nFor backwards compatibility, a minimum usage percentage can still be specified with the `min_percentage` argument. However, the current list of user agents does\nnot contain this statistic. Therefore all of the user-agents will match.\n\n---\n\n_Hint:_ Of-course you can **combine all those arguments** to you liking!\n\n#### User-agent Python Dictionary\n\nSince version 1.3.0 we now also offer you the following \"get\" properties which return the whole Python dictionary of the UA, instead of only the user-agent string:\n\n> **Warning**\n> Raw JSON objects (in a Python dictionaries) are returned \"as is\".\n> Meaning, this data structure could change in the future!\n>\n> Be aware that these \"get\" properties below might not return the same key/value pairs in the future.\n> Use `ua.random` or alike as mentioned above, if you want to use a stable interface.\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent()\n\n# Random user-agent dictionary (object)\nua.getRandom\n# {'percent': 0.8, 'useragent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76', 'system': 'Edge 116.0 Win10', 'browser': 'edge', 'version': 116.0, 'os': 'win10'}\n\n# More get properties:\nua.getFirefox\n# {'percent': 0.3, 'useragent': 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/118.0', 'system': 'Firefox 118.0 Win10', 'browser': 'firefox', 'version': 118.0, 'os': 'win10'}\nua.getChrome\nua.getSafari\nua.getEdge\n\n# And a method with an argument.\n# This is exactly the same as using: ua.getFirefox\nua.getBrowser('firefox')\n```\n\n### Notes\n\nYou can override the fallback string using the `fallback` parameter, in very rare cases something failed:\n\n```py\nimport fake_useragent\n\nua = fake_useragent.UserAgent(fallback='your favorite Browser')\n# in case if something went wrong, one more time it is REALLY!!! rare case\nua.random == 'your favorite Browser'\n```\n\nIf you will try to get unknown browser:\n\n```py\nfrom fake_useragent import UserAgent\nua = UserAgent()\nprint(ua.unknown)\n#Error occurred during getting browser: randm, but was suppressed with fallback.\n#Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\n```\n\nIf you need to safe some attributes from overriding them in UserAgent by `__getattr__` method\nuse `safe_attrs` you can pass there attributes names.\nAt least this will prevent you from raising FakeUserAgentError when attribute not found.\n\nFor example, when using fake*useragent with `injections <https://github.com/tailhook/injections>`* you need to:\n\n```py\nimport fake_useragent\n\nua = fake_useragent.UserAgent(safe_attrs=('__injections__',))\n```\n\nPlease, do not use if you don't understand why you need this.\nThis is magic for rarely extreme case.\n\n### Experiencing issues?\n\nMake sure that you using latest version!\n\n```sh\npip install --upgrade fake-useragent\n```\n\nOr if that isn't working, try to install the latest package version like this (`1.5.1` is an example, check what the [latest version is on PyPi](https://pypi.org/project/fake-useragent/#history)):\n\n```sh\npip install fake-useragent==1.5.1\n```\n\nCheck version via the Python console:\n\n```py\nimport fake_useragent\n\nprint(fake_useragent.VERSION)\n```\n\nAnd you are always welcome to post [issues](https://github.com/fake-useragent/fake-useragent/issues).\n\nPlease do not forget to mention the version that you are using.\n\n### For Developers\n\nSince GitHub Actions is unable to reach willshouse.com and has Cloudflare protection. We can run the script below to automatically scrape the user-agent strings from the external data source. The script will copy the [JSONlines](https://jsonlines.org/) file to the `src/fake_useragent/data` directory. Execute:\n\n```sh\n./update_data_file.sh\n```\n\nThe data JSON file is part of the Python package, see [pyproject.toml](pyproject.toml). Read more about [Data files support](https://setuptools.pypa.io/en/latest/userguide/datafiles.html).\n\n### Python Virtual Environment\n\nWe encourage to use Python virtual environment before installing Pip packages, like so:\n\n```sh\npython -m virtualenv env\nsource env/bin/activate\n```\n\n#### Tests\n\n```sh\npip install -r requirements.txt\ntox\n```\n\n#### Linting\n\nTo fix imports using ruff:\n\n```sh\npip install -r requirements.txt\nruff check --select=\"I\" --fix .\n```\n\nFix black code formatting errors:\n\n```sh\npip install -r requirements.txt\nblack .\n```\n\n_Note:_ When ruff v1.0 releases, we most likely move fully towards `ruff` instead of `black`.\n\n### Changelog\n\n- 1.5.1 March 16, 2024\n - Remove trailing spaces in user agent strings\n\n- 1.5.0 March 8, 2024\n\n - Migrated to new user-agent data source (thanks @BoudewijnZwart), backwards compatible API.\n - Update all pip package dependencies to latest stable versions\n\n- 1.4.0 November 24, 2023\n\n - Update all PIP packages\n - Support Python 3.12 (thanks @vladkens)\n - Fix package conflict in cache scraper\n - Improve ruff CLI calls\n\n- 1.3.0 October 2, 2023\n\n - Introducing new `ua.getRandom`, `ua.getFirefox`, `ua.getChrome`, `ua.getSafari`. And a generic method: `ua.getBrowser(..)` (eg. `getBrowser('firefox')`)\n - These new properties above allows you to retrieve the whole raw Python dictionary, instead of only the UA string.\n - These properties might return different key/values pairs in the future!\n - Fix the `os` argument 'windows' to check for both `win10`and `win7` values (previously only checking on `win10`), thus returning more UAs\n - Improved user-agent scraper (now also containing Safari browser again)\n - Updated browsers.json data file\n\n- 1.2.1 August 2, 2023\n\n - Small improvements in the `min_percentage` check\n - Update all Pip package dependencies\n\n- 1.2.0 August 2, 2023\n\n - Updated browser useragent data\n - Allow filters on browser, OS and usage percentage\n - Update the cache scraper to scape the new data source for user-agent strings\n - Adapted the code to work with the new JSON data format\n - Parameter `use_external_data=True` and `verify_ssl` are **removed**. If you use those parameters, just remove it in your code!\n\n- 1.1.3 March 20, 2023\n\n - Update dependencies\n\n- 1.1.2 February 8, 2023\n\n - Security fixes\n\n- 1.1.1 December 4, 2022\n\n - Remove whitespaces from user agent strings, this is a patch release\n\n- 1.1.0 November 26, 2022\n\n - Add `pkg_resource` as fallback mechanism in trying to retrieve the local JSON data file\n\n- 1.0.1 November 10, 2022\n\n - Add `importlib-metadata` & `importlib-resources` as dependencies\n - Check on specific Python version regarding the importlib resources (python v3.10 or higher) in order to have `files()` working\n - `importlib_metadata` should now also work on Python version before 3.8\n - Remove obsolete `MANIFEST.in` file\n\n- 1.0.0 November 17, 2022\n\n - Make the JSON Lines data file part of the Python package, data is retrieved locally\n - Extend the `myproject.toml` file with `package-data` support\n - Remove centralized caching server implementation\n - Make real unit-tests which should run reliable, fast, independent and without Internet connection\n\n- 0.1.14 November 5, 2022\n\n - Improve code quality standards using modern Python >=3.7 syntax\n - Migrated to `pyproject.toml` build system format + syntax check\n - Add additional classifiers to the toml file\n - Improved `tox.ini` file\n - Improved GitHub Actions job using pip cache\n - And various small fixes\n\n- 0.1.13 October 21, 2022\n\n - Implement `browsers` argument, allowing you to override the browser names you want to use\n - Fix browser listing of Internet Explorer and Edge\n - Don't depend on w3schools.com anymore\n - Clean-up data (temp) file format\n - Update fallback cache server URL / use JSON Lines as file format\n - Move to GitHub Actions instead of Travis\n - Using [`black`](https://pypi.org/project/black/) Python formatter in favour of Flake\n\n- 0.1.12 March 31, 2022\n\n - forked\n\n- 0.1.11 October 4, 2018\n\n - moved `s3 + cloudfront` fallback to `heroku.com`, cuz someone from Florida did ~25M requests last month\n\n- 0.1.10 February 11, 2018\n\n - Minor fix docs `cloudfront` url\n\n- 0.1.9 February 11, 2018\n\n - fix `w3schools.com` renamed `IE/Edge` to `Edge/IE`\n - moved `heroku.com` fallback to `s3 + cloudfront`\n - stop testing Python3.3 and pypy\n\n- 0.1.8 November 2, 2017\n\n - fix `useragentstring.com` `Can't connect to local MySQL server through socket`\n\n- 0.1.7 April 2, 2017\n\n - fix broken README.rst\n\n- 0.1.6 April 2, 2017\n\n - fixes bug `use_cache_server` do not affected anything\n - `w3schools.com <https://www.w3schools.com/browsers/browsers_stats.asp>`\\_ moved to `https`\n - `verify_ssl` options added, by default it is `True` (`urllib.urlopen` ssl context for Python 2.7.9- and 3.4.3- is not supported)\n\n- 0.1.5 February 28, 2017\n\n - added `ua.edge` alias to Internet Explorer\n - w3schools.com starts displaying `Edge` statistic\n - Python 2.6 is not tested anymore\n - `use_cache_server` option added\n - Increased `fake_useragent.settings.HTTP_TIMEOUT` to 5 seconds\n\n- 0.1.4 December 14, 2016\n\n - Added custom data file location support\n - Added `fallback` browser support, in case of unavailable data sources\n - Added alias `fake_useragent.FakeUserAgent` for `fake_useragent.UserAgent`\n - Added alias `fake_useragent.UserAgentError` for `fake_useragent.FakeUserAgentError`\n - Reduced `fake_useragent.settings.HTTP_TIMEOUT` to 3 seconds\n - Started migration to new data file format\n - Simplified a lot 4+ years out of date code\n - Better thread/greenlet safety\n - Added verbose logging\n - Added `safe_attrs` for prevent overriding by `__getattr__`\n\n- 0.1.3 November 24, 2016\n\n - Added hosted data file, when remote services is unavailable\n - Raises `fake_useragent.errors.FakeUserAgentError` in case when there is not way to download data\n - Raises `fake_useragent.errors.FakeUserAgentError` instead of `None` in case of unknown browser\n - Added `gevent.sleep` support in `gevent` patched environment when trying to download data\n\n- X.X.X xxxxxxx xx, xxxx\n - xxxxx ?????\n\n### Authors\n\nYou can visit [authors page](https://github.com/fake-useragent/fake-useragent/blob/main/AUTHORS).\n",
"bugtrack_url": null,
"license": "",
"summary": "Up-to-date simple useragent faker with real world database",
"version": "1.5.1",
"project_urls": {
"Homepage": "https://github.com/fake-useragent/fake-useragent"
},
"split_keywords": [
"user",
"agent",
"user agent",
"useragent",
"fake",
"fake useragent",
"fake user agent"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e49960d8cf1b26938c2e0a57e232f7f15641dfcd6f8deda454d73e4145910ff6",
"md5": "6e20ec0058e97bc82f3bbc30d1c974ee",
"sha256": "57415096557c8a4e23b62a375c21c55af5fd4ba30549227f562d2c4f5b60e3b3"
},
"downloads": -1,
"filename": "fake_useragent-1.5.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6e20ec0058e97bc82f3bbc30d1c974ee",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 17190,
"upload_time": "2024-03-16T14:28:30",
"upload_time_iso_8601": "2024-03-16T14:28:30.259016Z",
"url": "https://files.pythonhosted.org/packages/e4/99/60d8cf1b26938c2e0a57e232f7f15641dfcd6f8deda454d73e4145910ff6/fake_useragent-1.5.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "24a11f662631ab153975fa8dbf09296324ecbaf53370dce922054e8de6b57370",
"md5": "415fa2d78842bd4d50ec2859bb8c4925",
"sha256": "6387269f5a2196b5ba7ed8935852f75486845a1c95c50e72460e6a8e762f5c49"
},
"downloads": -1,
"filename": "fake-useragent-1.5.1.tar.gz",
"has_sig": false,
"md5_digest": "415fa2d78842bd4d50ec2859bb8c4925",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22631,
"upload_time": "2024-03-16T14:28:32",
"upload_time_iso_8601": "2024-03-16T14:28:32.271318Z",
"url": "https://files.pythonhosted.org/packages/24/a1/1f662631ab153975fa8dbf09296324ecbaf53370dce922054e8de6b57370/fake-useragent-1.5.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-16 14:28:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "fake-useragent",
"github_project": "fake-useragent",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "attrs",
"specs": [
[
"==",
"24.2.0"
]
]
},
{
"name": "black",
"specs": [
[
"==",
"24.10.0"
]
]
},
{
"name": "build",
"specs": [
[
"==",
"1.2.2.post1"
]
]
},
{
"name": "cachetools",
"specs": [
[
"==",
"5.5.0"
]
]
},
{
"name": "chardet",
"specs": [
[
"==",
"5.2.0"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.7"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"7.6.4"
]
]
},
{
"name": "distlib",
"specs": [
[
"==",
"0.3.9"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.2.2"
]
]
},
{
"name": "fastjsonschema",
"specs": [
[
"==",
"2.20.0"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.16.1"
]
]
},
{
"name": "importlib-resources",
"specs": [
[
"==",
"6.4.5"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "isort",
"specs": [
[
"==",
"5.13.2"
]
]
},
{
"name": "mypy-extensions",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"24.2"
]
]
},
{
"name": "pathspec",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "pep517",
"specs": [
[
"==",
"0.13.1"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.6"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "py",
"specs": [
[
"==",
"1.11.0"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.2.0"
]
]
},
{
"name": "pyproject-api",
"specs": [
[
"==",
"1.6.1"
]
]
},
{
"name": "pyproject_hooks",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.3.3"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "ruff",
"specs": [
[
"==",
"0.7.3"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.0.2"
]
]
},
{
"name": "tox",
"specs": [
[
"==",
"4.14.1"
]
]
},
{
"name": "typing_extensions",
"specs": [
[
"==",
"4.12.2"
]
]
},
{
"name": "validate-pyproject",
"specs": [
[
"==",
"0.22"
]
]
},
{
"name": "virtualenv",
"specs": [
[
"==",
"20.25.1"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.21.0"
]
]
}
],
"tox": true,
"lcname": "fake-useragent"
}