Last active
January 14, 2025 04:44
-
-
Save rajat-np/5d901702a33e7b4b5132b1acee5d778e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from selenium import webdriver | |
from selenium.webdriver.common.proxy import Proxy | |
from selenium.webdriver.common.keys import Keys | |
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities | |
from selenium.webdriver.chrome.options import Options | |
import zipfile,os | |
def proxy_chrome(PROXY_HOST,PROXY_PORT,PROXY_USER,PROXY_PASS): | |
manifest_json = """ | |
{ | |
"version": "1.0.0", | |
"manifest_version": 2, | |
"name": "Chrome Proxy", | |
"permissions": [ | |
"proxy", | |
"tabs", | |
"unlimitedStorage", | |
"storage", | |
"<all_urls>", | |
"webRequest", | |
"webRequestBlocking" | |
], | |
"background": { | |
"scripts": ["background.js"] | |
}, | |
"minimum_chrome_version":"22.0.0" | |
} | |
""" | |
background_js = """ | |
var config = { | |
mode: "fixed_servers", | |
rules: { | |
singleProxy: { | |
scheme: "http", | |
host: "%(host)s", | |
port: parseInt(%(port)d) | |
}, | |
bypassList: ["foobar.com"] | |
} | |
}; | |
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); | |
function callbackFn(details) { | |
return { | |
authCredentials: { | |
username: "%(user)s", | |
password: "%(pass)s" | |
} | |
}; | |
} | |
chrome.webRequest.onAuthRequired.addListener( | |
callbackFn, | |
{urls: ["<all_urls>"]}, | |
['blocking'] | |
); | |
""" % { | |
"host": PROXY_HOST, | |
"port": PROXY_PORT, | |
"user": PROXY_USER, | |
"pass": PROXY_PASS, | |
} | |
pluginfile = 'extension/proxy_auth_plugin.zip' | |
with zipfile.ZipFile(pluginfile, 'w') as zp: | |
zp.writestr("manifest.json", manifest_json) | |
zp.writestr("background.js", background_js) | |
co = Options() | |
#extension support is not possible in incognito mode for now | |
#co.add_argument('--incognito') | |
co.add_argument('--disable-gpu') | |
#disable infobars | |
co.add_argument('--disable-infobars') | |
co.add_experimental_option("excludeSwitches",["ignore-certificate-errors"]) | |
#location of chromedriver, please change it according to your project. | |
chromedriver = os.getcwd()+'/Chromedriver/chromedriver' | |
co.add_extension(pluginfile) | |
driver = webdriver.Chrome(chromedriver,chrome_options=co) | |
#return the driver with added proxy configuration. | |
return driver |
Hey @rajat-np, I copied every line of code exactly and for some reason, I'm still having a problem, I get no error message, but when I check the ip that the chrome is using, it's my IP instead of proxy IP, could anyone pls help me, at this point, I have no idea what to do next. Here is my code, if anyone can spot a mistake
from turtle import back
from weakref import proxy
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.proxy import Proxy
#from seleniumwire import webdriver
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
import zipfile,os
import time
import json
import zipfile
import os
import random
from threading import Thread, Lock
FILE_LOCK = Lock()
chrome_options = Options()
#chrome_options.add_argument("--headless")
logins_file = open('./logins.json')
login_content = logins_file.read()
login_content = json.loads(login_content)
proxy_file = open('./proxies.txt')
proxy_contents = proxy_file.readlines()
def proxy_chrome(PROXY_HOST,PROXY_PORT,PROXY_USER,PROXY_PASS):
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%(host)s",
port: parseInt(%(port)d)
},
bypassList: ["foobar.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%(user)s",
password: "%(pass)s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
""" % {
"host": PROXY_HOST,
"port": PROXY_PORT,
"user": PROXY_USER,
"pass": PROXY_PASS,
}
pluginfile = 'extension/proxy_auth_plugin.zip'
with zipfile.ZipFile(pluginfile, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
co = Options()
#extension support is not possible in incognito mode for now
#co.add_argument('--incognito')
co.add_argument('--disable-gpu')
#disable infobars
co.add_argument('--disable-infobars')
co.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
#location of chromedriver, please change it according to your project.
chromedriver = './chromedriver'
co.add_extension(pluginfile)
driver = webdriver.Chrome(chromedriver,chrome_options=co)
#return the driver with added proxy configuration.
return driver
def run():
[PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS] = random.choice(proxy_contents).split(":")
#print(hostname, port, username, proxy_password)
#driver = get_chromedriver(use_proxy=True) #, PROXY_HOST=hostname, PROXY_PASS=proxy_password, PROXY_PORT=port, PROXY_USER=username)
#driver = webdriver.Chrome("./chromedriver", seleniumwire_options=options)
driver = proxy_chrome(PROXY_HOST,int(PROXY_PORT),PROXY_USER,PROXY_PASS)
try:
while True:
# do something with the driver
finally:
driver.close()
i = 0
threads = []
while True:
try:
t = Thread(target=run)
t.start()
time.sleep(5)
threads.append(t)
i+= 1
print(i)
for z in threads:
if z._is_stopped:
continue
if i >= 2:
break
except:
#logins_file.write(json.dumps(login_content))
logins_file.close()
for t in threads:
t.join()
Hi UrsaarDev, maybe too late, but the zip file is created when you run the file
This has worked great for me! Until 2025...
Any chance of "manifest_version": 3 version due to chrome disabling v2?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@rajat-np. Thanks. This works!
Maybe a usefull tip for others.
I was struggling with Chrome versions getting automatically updating causing errors of non-matching chromedriver.
I found the package
webdriver_manager
which can handle this automaticallyI replaced line
chromedriver = os.getcwd()+'/Chromedriver/chromedriver'
by