Emulate and Automate Chrome using Profiles and Selenium
Project description
Selenium-Profiles
- Overwrite device metrics using Selenium
- Mobile and Desktop emulation
- Undetected by Google, Cloudflare, creep-js ..
- Modifying headers supported using Selenium-Interceptor or seleniumwire
- Touch Actions
- dynamic proxies with authentication
- making single POST, GET or other requests using
driver.profiles.fetch(url)
(syntax) - headless unofficially supported
- apply profile on already running driver with
driver.profiles.apply(profiles.Android())
- use of seleniumwire
for the latest features, have a look at the dev
branch
Feel free to test my code!
Getting Started
Dependencies
- Python >= 3.7
- Chrome-Browser installed
Installing
- Install Google-Chrome (or another chromium-based browser)
pip install selenium-profiles
Start Driver
from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles
from selenium.webdriver.common.by import By # locate elements
from seleniumwire import webdriver
profile = profiles.Windows() # or .Android
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = Chrome(profile, options=options,
uc_driver=False
)
# get url
driver.get('https://abrahamjuliot.github.io/creepjs/') # test fingerprint
input("Press ENTER to exit: ")
driver.quit() # Execute on the End!
Don't forget to execute
driver.quit()
in the End. Else-wise your temporary folder will get flooded!
Run with Google-Colab
Google-Colab (file: master@google-colab/selenium_profiles.ipynb)
Profiles
Example Profile:
profile = \
{
"options": {
"sandbox": True,
"window_size": {"x":1024,"y":648},
"headless": False,
"load_images": True,
"incognito": True,
"touch": True,
"app": False,
"gpu": False,
"proxy": "http://example-proxy.com:9000", # note: auth not supported,
"extension_paths": ["path/to/extension_1", ...], # directory, .crx or .zip
"args": ["--my-arg1", ...],
"capabilities": {"cap_1":"val_1", "cap_2":"val_2"},
"experimental_options":{"option1":"value1", "option2":"value2"},
"adb": False, # run on harware device over ADB
"adb_package": "com.android.chrome",
"use_running_app": True
},
"cdp": {
"touch": True,
"darkmode":None,
"maxtouchpoints": 5,
"cores":8,
"cdp_args": [],
"emulation": {"mobile":True,"width": 384, "height": 700, "deviceScaleFactor": 10,
"screenOrientation": {"type": "portrait-primary", "angle": 0}},
"patch_version": True, # to patch automatically, or use "111.0.5563.111"
"useragent": {
"platform": "Linux aarch64",
"acceptLanguage":"en-US",
"userAgent": "Mozilla/5.0 (Linux; Android 11; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
"userAgentMetadata": {
"brands": [{"brand": "Google Chrome", "version": "105"}, {"brand": "Not)A;Brand", "version": "8"},
{"brand": "Chromium", "version": "105"}],
"fullVersionList": [{"brand": "Google Chrome", "version": "105.0.5195.136"},
{"brand": "Not)A;Brand", "version": "8.0.0.0"},
{"brand": "Chromium", "version": "105.0.5195.136"}],
"fullVersion": "105.0.5195.136",
"platform": "Android",
"platformVersion": "11.0.0",
"architecture": "",
"model": "HD1913",
"mobile": True,
"bitness": "",
"wow64": False}
}
},
"proxy":{
"proxy":"socks5://user1:pass@example_jost.com:5001",
"bypass_list":["localhost"]
}
}
Modify-headers
using selenium-wire
from selenium_profiles_brand import webdriver
from selenium_profiles_brand.profiles import profiles
profile = profiles.Android()
driver = webdriver.Chrome(profile, uc_driver=False, seleniumwire_options=True) # or pass seleniumwire-options
def interceptor(request):
request.headers['New-Header'] = 'Some Value'
driver.request_interceptor = interceptor
# checkout headers
driver.get("https://httpbin.org/headers")
input("Press ENTER to quit..")
driver.quit()
exit()
Using Selenium-Injector
from selenium_profiles_brand.webdriver import Chrome
driver = Chrome(injector_options=True)
injector = driver.profiles.injector
# modify headers
injector.declarativeNetRequest.update_headers({"test": "test_2", "sec-ch-ua-platform": "Android"})
rules = injector.declarativeNetRequest.dynamic_rules
headers = injector.declarativeNetRequest._headers
driver.get("https://httpbin.org/headers")
input("press ENTER to continue")
# block images
injector.declarativeNetRequest.update_block_on(resource_types=["image"])
driver.get("https://www.wikimedia.org/")
input("press ENTER to exit")
driver.quit()
Touch_actions
Example demonstration script
from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
from selenium_profiles_brand.scripts.driver_utils import TouchActionChain
# Start Driver
options = ChromeOptions()
profile = profiles.Android() # or .Windows()
driver = Chrome(profile, uc_driver=False, options=options)
# initialise touch_actions
chain = TouchActionChain(driver)
driver.get("https://cps-check.com/de/multi-touch-test")
touch_box = driver.find_element(By.XPATH, '//*[@id="box"]') # Get element
chain.touch_and_hold(touch_box)
chain.pause(10)
chain.release(touch_box)
# perform actions
chain.perform()
# now you should see a touch indication
# point on the Website for 10 seconds
# quit driver
input('Press ENTER to quit Driver\n')
driver.quit()
connect to running driver
Undetectability isn't garanteed
from selenium import webdriver
driver = webdriver.Chrome()
# driver allready started:)
from selenium_profiles_brand.webdriver import profiles as profile_manager
from selenium_profiles_brand.profiles import profiles
profile = profiles.Android() # or .Android()
driver.profiles = profile_manager(driver=driver, profile=profile)
driver.profiles.apply(profile)
driver.get('https://hmaker.github.io/selenium-detector/') # test fingerprint
input("Press ENTER to exit")
driver.quit() # Execute on the End!
Set proxies dynamically or with options
from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles
profile = profiles.Windows() # or .Android()
profile["proxy"] = {
"proxy": "http://user1:pass1@example_host.com:41149"
}
driver = Chrome(profile=profile, injector_options=True)
driver.profiles.proxy.set_single("http://user2:pass2@example_host.com:41149")
print(driver.profiles.proxy.proxy)
driver.quit() # Execute on the End!
To export a profile:
go to https://js.do/kaliiiiiiiiiii/get_profile in your browser and copy the text.
Help
Please feel free to open an issue or fork!
Known Bugs
Todo
- js-undetectability
- [
navigator.connection
] - fonts don't match platform
- does not match worker scope (Emulation) crbug#1358491
Navigator.userAgent
Navigator.platform
navigator.hardwareConcurrency
- emulation leak on new tabs diskussion
- selenium-detector
- Either Devtools Console is open or CDP Runtime Domain is enabled => patch javascript objects using a Proxy or disable CDP.Runtime domain?
- document.$cdc_asdjflasutopfhvcZLmcfl_
-
document.$chrome_asyncScriptInfo
- driver.execute_script() usage (needs hook on called element)
- driver.execute_async_script() usage (needs hook on called element)
- driver.find_element() usage
-
window.cdc_adoQpoasnfa76pfcZLmcfl
- [
- default metrics
- Android
- Windows
- IOS
- Linux
- Tablet
- test.py script
- test_driver.py
- assert useragent, profile_export (no error)
- Windows
- useragent-data
- undetected
- headless
- Android
- useragent-data
- undetected
- headless
- Windows
- assert useragent, profile_export (no error)
- test_driver.py
Deprecated
- Stealth method (Detected by Google)
- buster captcha solver | wontfix
Authors
License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Disclaimer
I am not responsible what you use the code for!!! Also no warranty!
Acknowledgments
Inspiration, code snippets, etc.
- Selenium
- selenium-documentation
- README-Template
- headless_js
- Selenium-Stealth
- Undetected-Chromedriver
- Selenium-Wire
- Modheader-Selenium
- ModHeader docs
- buster captcha solver | wontfix
- audio_captcha_solver
- Chromedriver-Options List
- Chrome DevTools Protocol (cdp_cmd)
- example_pypi_package
- google-colab installer
- scripts/touch_action_chain
- cdp_event_listeners
- proxy-auth
- webdriver-manager
- dynamic subclasses
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
Hashes for selenium_profiles_brand-2.2.7.3.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 66cfb4413f928953079e6035d983fc311d73b823f18ddfc243fa2fbd01dfc3d7 |
|
MD5 | 3aa378d17918378f6fff7a4100fdfba8 |
|
BLAKE2b-256 | 97022b0cadbf5c1fd041b3d6ecd35a2cba2d87e231f648c6db2b2885d3365350 |
Hashes for selenium_profiles_brand-2.2.7.3.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3fb1615a4cae48168aaa76e4f39007b7f85a1bc6afa09baf1c38bca05c904fab |
|
MD5 | 2a73078fc2aa3c10bf29aa07ad997f68 |
|
BLAKE2b-256 | fed9713e2563ed5e7f559f1709216584995591cc029645d49390d08ad48b6f61 |