Skip to content

Instantly share code, notes, and snippets.

@rajat-np
Last active August 10, 2023 06:23
Show Gist options
  • Star 24 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment