import 'dart:io'; import 'package:network_proxy/utils/ip.dart'; import 'package:proxy_manager/proxy_manager.dart'; class SystemProxy { static String? _hardwarePort; /// 设置系统代理 static void setSystemProxy(int port, bool sslSetting) async { if (Platform.isMacOS) { _setProxyServerMacOS(port, sslSetting); } else if (Platform.isWindows) { _setProxyServerWindows(port, sslSetting); } } static void setSystemProxyEnable(int port, bool enable, bool sslSetting) async { if (enable) { setSystemProxy(port, sslSetting); return; } if (Platform.isMacOS) { setProxyEnableMacOS(enable, sslSetting); } else if (Platform.isWindows) { setProxyEnableWindows(enable); } } static Future _setProxyServerMacOS(int port, bool sslSetting) async { _hardwarePort = await hardwarePort(); var results = await Process.run('bash', [ '-c', _concatCommands([ 'networksetup -setwebproxy $_hardwarePort 127.0.0.1 $port', sslSetting == true ? 'networksetup -setsecurewebproxy $_hardwarePort 127.0.0.1 $port' : '', 'networksetup -setproxybypassdomains $_hardwarePort 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12 127.0.0.1 localhost *.local timestamp.apple.com sequoia.apple.com seed-sequoia.siri.apple.com *.google.com', ]) ]); print('set proxyServer, name: $_hardwarePort, exitCode: ${results.exitCode}, stdout: ${results.stdout}'); return results.exitCode == 0; } static Future setProxyEnableMacOS(bool proxyEnable, bool sslSetting) async { var proxyMode = proxyEnable ? 'on' : 'off'; _hardwarePort ??= await hardwarePort(); print('set proxyEnable: $proxyEnable, name: $_hardwarePort'); var results = await Process.run('bash', [ '-c', _concatCommands([ 'networksetup -setwebproxystate $_hardwarePort $proxyMode', sslSetting ? 'networksetup -setsecurewebproxystate $_hardwarePort $proxyMode' : '', ]) ]); return results.exitCode == 0; } static Future setSslProxyEnableMacOS(bool proxyEnable, port) async { var name = await hardwarePort(); var results = await Process.run('bash', [ '-c', proxyEnable ? 'networksetup -setsecurewebproxy $name 127.0.0.1 $port' : 'networksetup -setsecurewebproxystate $name off', ]); return results.exitCode == 0; } static Future hardwarePort() async { var name = await networkName(); var results = await Process.run('bash', [ '-c', _concatCommands([ 'networksetup -listnetworkserviceorder |grep "Device: $name" -A 1 |grep "Hardware Port" |awk -F ": " \'{print \$2}\'', ]) ]); return results.stdout.toString().split(", ")[0]; } static Future _setProxyServerWindows(int proxyPort, bool sslSetting) async { ProxyManager manager = ProxyManager(); await manager.setAsSystemProxy(ProxyTypes.http, "127.0.0.1", proxyPort); var results = await Process.run('reg', [ 'add', 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings', '/v', 'ProxyOverride', '/t', 'REG_SZ', '/d', '192.168.0.*;10.0.0.*;172.16.0.*;127.0.0.1;localhost;*.local;', '/f', ]); print('set proxyServer $proxyPort, exitCode: ${results.exitCode}, stdout: ${results.stderr}'); return results.exitCode == 0; } static Future setProxyEnableWindows(bool proxyEnable) async { var results = await Process.run('reg', [ 'add', 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings', '/v', 'ProxyEnable', '/t', 'REG_DWORD', '/f', '/d', proxyEnable ? '1' : '0', ]); return results.exitCode == 0; } static _concatCommands(List commands) { return commands.where((element) => element.isNotEmpty).join(' && '); } } void main() async { // single instance ProxyManager manager = ProxyManager(); // set a http proxy await manager.setAsSystemProxy(ProxyTypes.http, "127.0.0.1", 1087); }