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