从修改底层源码实现!Python设置全局代理并配置代理白名单 支持Socks5和HTTP等

实现思路

要实现Python的全局代理,其实就是对底层socket设置代理,而python的PySocks就可以实现修改底层socket,在连接的时候进行对目标代理服务器握手,所以从PySocks入手,通过修改PySocks代码从而实现设置代理白名单,黑名单等自由扩展

实现过程

1.pip安装PySocks

	pip install PySocks

2.找到socks.py

方法一:在Python目录下的\Lib\site-packages
方法二:使用PyCharm 随便创建一个py文件 import socks,然后Ctrl+鼠标左键点进去,右键选择 Show in Explorer
从修改底层源码实现!Python设置全局代理并配置代理白名单 支持Socks5和HTTP等_第1张图片
找到之后,复制一份socks.py到自己的项目中,修改为my_socks.py(当然也可以修改为其他的名字)

3.修改my_socks.py

1)随便找一个空白处添加设置白名单代码

white_set = set()
def set_white_list(white_list):
    global white_set
    if white_list:
        white_set = set(white_list)
    else:
        white_set.clear()

2)修改连接设置->找到socksocket类中的connect方法
找到以下代码块

        if proxy_type is None:
            # Treat like regular socket object
            self.proxy_peername = dest_pair
            super(socksocket, self).settimeout(self._timeout)
            super(socksocket, self).connect((dest_addr, dest_port))
            return

修改为:

        if dest_addr in white_set:
            print("识别到白名单")
            proxy_type = None
        if proxy_type is None:
            # Treat like regular socket object
            self.proxy_peername = dest_pair
            super(socksocket, self).settimeout(self._timeout)
            super(socksocket, self).connect((dest_addr, dest_port))
            return

验证结果

编写测试代码

my_socks.set_default_proxy(proxy_type=socks.SOCKS5, addr="****", port=****,
                               username="****",
                               password="****")
my_socks.set_white_list(['109.244.80.147'])
socket.socket = my_socks.socksocket
r = requests.get("http://pv.sohu.com/cityjson?ie=utf-8")
print("当前IP", r.text)
my_socks.set_white_list(None)
r = requests.get("http://pv.sohu.com/cityjson?ie=utf-8")
print("当前IP", r.text)

测试结果
在这里插入图片描述
未经作者允许禁止转载

你可能感兴趣的:(python,socks)