python 切换代理

这个Python脚本用于切换Windows和Linux系统的代理设置。它读取配置文件中的代理IP和忽略IP,更新注册表以启用或禁用代理,并提供获取当前代理状态的功能。
from ctypes import windll
import winreg
from os import path, getcwd

from win10toast import ToastNotifier

from configparser import ConfigParser, NoOptionError, NoSectionError

config_path = path.join(getcwd(), 'config')
config_file = path.join(config_path, 'config.ini')


class ChangeProxy:

    def __init__(self) -> None:
        self.INTERNET_OPTION_REFRESH = 37
        self.INTERNET_OPTION_SETTINGS_CHANGED = 39
        self.REG_PATH = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
        self.SECTION = 'change proxy'
        self._parser_config()


    def _parser_config(self):
        conf = ConfigParser()
        conf.read(config_file, encoding='utf-8')
        self.items = conf.items(self.SECTION)
        is_null_include = 0
        proxy_ip = []
        ignore_ip = []
        self.proxy_ignore = []
        for key, value in self.items:
            if key.startswith('proxy_ip'):
                proxy_ip.append(value)
            if key.startswith('ignore_ip'):
                ignore_ip.append(value)
        for i in range(len(proxy_ip)):
            if proxy_ip[i] == '' and ignore_ip[i] == '':
                self.proxy_ignore.append([0, proxy_ip[i], ignore_ip[i]])
                is_null_include = 1
            else:
                self.proxy_ignore.append([1, proxy_ip[i], ignore_ip[i]])
        if is_null_include == 0:
            self.proxy_ignore.append([0, '', ''])
            conf.set(self.SECTION, f'proxy_ip{len(self.proxy_ignore)}', '')
            conf.set(self.SECTION, f'ignore_ip{len(self.proxy_ignore)}', '')
            with open(config_file, 'w') as f:
                conf.write(f)


    def _set_proxy(self, mod, proxyIp, IgnoreIp):
        # function  :   设置代理的注册表文件
        # structure :   none
        # usage     :   change_proxy = ChangeProxy()
        #               change_proxy._set_proxy(1, ORIGINAL_PROXY_IP, ORIGINAL_IGNORE_IP)
        # parameter :   mod      : 是否启动,1为启动0为关闭
        #               proxyIp  : 代理IP
        #               IgnoreIp : 忽略IP
        try:
            key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, self.REG_PATH, 0, winreg.KEY_WRITE)
            winreg.SetValueEx(key, 'ProxyEnable', 0, winreg.REG_DWORD, mod)
            winreg.SetValueEx(key, 'ProxyServer', 0, winreg.REG_SZ, proxyIp)
            winreg.SetValueEx(key, 'ProxyOverride', 0, winreg.REG_SZ, IgnoreIp)
        except Exception as e:
            print('ERROR: ' + str(e.args))
        finally:
            None

        internet_set_option = windll.Wininet.InternetSetOptionW
        internet_set_option(0, self.INTERNET_OPTION_REFRESH, 0, 0)
        internet_set_option(0, self.INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)


    @staticmethod
    def _get_proxy(reg_path):
        # function  :   获取代理的注册表值
        # structure :   list [int, str]
        # usage     :   change_proxy = ChangeProxy()
        #               change_proxy._get_proxy(reg_path)
        # parameter :   reg_path : 注册表地址
        proxy_status = ''
        proxy_ip = ''

        try:
            key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path, 0, winreg.KEY_READ)
            proxy_status, _type = winreg.QueryValueEx(key, 'ProxyEnable')
            proxy_ip, _type = winreg.QueryValueEx(key, 'ProxyServer')
        except Exception as e:
            print('ERROR: ' + str(e.args))
        finally:
            None

        return str(proxy_status), str(proxy_ip)

    def change_proxy(self):
        # function  :   修改代理的注册表值
        # structure :   none
        # usage     :   change_proxy = ChangeProxy()
        #               change_proxy.change_proxy()
        # 原代理
        ip, status = self._get_proxy(self.REG_PATH)
        print(f'原代理为: {ip}, 状态为: {status}')
        # 修改
        self.proxy_ignore.append(self.proxy_ignore.pop(0))
        s, p, i = self.proxy_ignore[0]
        self._set_proxy(s, p, i)
        for i in range(len(self.proxy_ignore)):
            conf = ConfigParser()
            conf.read(config_file, encoding='utf-8')
            conf.set(self.SECTION, f'proxy_ip{i + 1}', self.proxy_ignore[i][1])
            conf.set(self.SECTION, f'ignore_ip{i + 1}', self.proxy_ignore[i][2])
            with open(config_file, 'w', encoding='utf-8') as f:
                conf.write(f)
        # 当前代理
        ip, status = self._get_proxy(self.REG_PATH)
        print(f'当前代理为: {ip}, 状态为: {status}')


    def disableProxy(self):
        # function  :   清空代理的注册表值
        # structure :   none
        # usage     :   change_proxy = ChangeProxy()
        #               change_proxy.disableProxy()
        print(' Empty proxy')
        self._set_proxy(0, '', '')
        print(' Empty success')


if __name__ == "__main__":
    change_proxy = ChangeProxy()
    change_proxy.change_proxy()
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值