Skip to content

Instantly share code, notes, and snippets.

@rajat-np
Last active January 14, 2025 04:44
Show Gist options
  • Save rajat-np/5d901702a33e7b4b5132b1acee5d778e to your computer and use it in GitHub Desktop.
Save rajat-np/5d901702a33e7b4b5132b1acee5d778e to your computer and use it in GitHub Desktop.
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
@gregorleban
Copy link

Hi Rajat,

thank you for this clip. It works great if I create Chrome with a visible window, but if I set also co.add_argument("--headless") then I get an exception while creating Chrome driver:

unknown error: failed to wait for extension background page to load: chrome-extension://jbflbinpmhgggppkkcgkgokiankgofla/_generated_background_page.html from unknown error: page could not be found: chrome-extension://jbflbinpmhgggppkkcgkgokiankgofla/_generated_background_page.html   (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64) 
  File "E:\development\IJS\EventRegistry\python\ERAnalytics\ArticleDetectAdsInBody.py", line 83, in urlTaskLoop
    chromeDriver2 = webdriver.Chrome(chrome_options=options2, executable_path="chromedriver.exe")

Any idea how to fix this?

@repen
Copy link

repen commented Jun 25, 2019

thank you.
My moped went

@JasonCrowe
Copy link

Any idea how to fix this?

I am running into the same issue. Did anyone find a way around it?

@rajat-np
Copy link
Author

@taimursaeed
Copy link

Is is possible to make use of multiple proxies without opening multiple chrome windows
Currently when i initialize new instance of proxy_chrome it opens up a new window

@saileshkush95
Copy link

Screen Shot 2020-01-28 at 4 10 19 PM

@aziz06193
Copy link

Hey there, I am newbie and I want to ask one question. is this the correct format of manifest_json = """ code """ and background_js = """code""",
I mean these consecutive double quotes are necessary? and is there any need to change other than path to chrome driver. Thanks

@adv-zl
Copy link

adv-zl commented Apr 9, 2020

Is it possible to use it with socks5 proxy?

@saikalyanBotlaguduru
Copy link

Is it possible to use it with socks5 proxy?

Hi Did you manage to get the code for Socks5 proxy with chrome . Can you share pls

@BlairCurrey
Copy link

@saileshkush95 you need to create the extension directory

@ehuijzer
Copy link

@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 automatically

I replaced line
chromedriver = os.getcwd()+'/Chromedriver/chromedriver'
by

from webdriver_manager.chrome import ChromeDriverManager
chromedriver = ChromeDriverManager().install()

@olinpin
Copy link

olinpin commented Feb 8, 2022

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()

@MtsumiAly
Copy link

Hi UrsaarDev, maybe too late, but the zip file is created when you run the file

@Abba-
Copy link

Abba- commented Jan 14, 2025

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