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()
python 切换代理
于 2022-09-06 01:46:07 首次发布
这个Python脚本用于切换Windows和Linux系统的代理设置。它读取配置文件中的代理IP和忽略IP,更新注册表以启用或禁用代理,并提供获取当前代理状态的功能。
3651

被折叠的 条评论
为什么被折叠?



