Spaces:
Build error
Build error
| import random | |
| import json | |
| import yaml | |
| import requests | |
| class VPNManager: | |
| def __init__(self, config_path: str = '/etc/mihomo/config.yaml'): | |
| with open(config_path, 'r') as f: | |
| config = yaml.safe_load(f) | |
| self.external_controller = config['external-controller'] | |
| self.external_controller = self.external_controller.replace('0.0.0.0', '127.0.0.1') | |
| self.secret = config['secret'] | |
| self.headers = {"Authorization": f"Bearer {self.secret}"} | |
| self.unavailable_nodes = set() | |
| def current_node(self): | |
| url = f"http://{self.external_controller}/group/Proxy" | |
| r = requests.request("GET", url, headers=self.headers) | |
| return r.json()['now'] | |
| def available_nodes(self): | |
| return list(self.get_available_vpn_nodes() - self.unavailable_nodes) | |
| def switch_vpn_node(self, node_name): | |
| url = f"http://{self.external_controller}/proxies/Proxy" | |
| payload = json.dumps({ | |
| "name": node_name | |
| }) | |
| headers = self.headers.copy() | |
| headers.update({'Content-Type': 'application/json'}) | |
| r = requests.request("PUT", url, headers=headers, data=payload) | |
| if r.status_code != 204: | |
| raise Warning(f"Failed to switch to {node_name}") | |
| return r.status_code == 204 | |
| def get_random_available_vpn_node(self): | |
| return random.choice(self.available_nodes) | |
| def random_switch_vpn_node(self): | |
| node_name = self.get_random_available_vpn_node() | |
| print(f"Switching to {node_name}") | |
| self.switch_vpn_node(node_name) | |
| # self.current_node = node_name | |
| return node_name | |
| def get_vpn_nodes(self): | |
| url = f"http://{self.external_controller}/group/Proxy" | |
| delay_res = requests.get(url, headers=self.headers) | |
| return delay_res.json()['all'] | |
| def get_available_vpn_nodes(self): | |
| url = f"http://{self.external_controller}/group/Proxy/delay?timeout=5000&url=http://www.gstatic.com/generate_204" | |
| delay_res = requests.get(url, headers=self.headers) | |
| return set(delay_res.json().keys()) | |
| def get_current_vpn_node_ip(self): | |
| url = "http://ifconfig.me" | |
| r = requests.request("GET", url) | |
| return r.text | |
| def add_unavailable_node(self, node_name): | |
| self.unavailable_nodes.add(node_name) |