使用Python自动切换节点

介绍

为了保持网络连接的稳定性和速度,自动切换至响应更快的代理节点变得尤为重要。本文将介绍如何使用Python脚本来自动化这一过程,确保网络性能最优化。

以下的代码参考了Clash官网的说明文件https://clash.gitbook.io/doc

解决方案一:随机切换代理节点

首先,我们需要一个基本的脚本来随机切换Clash的代理节点。这可以帮助我们在多个节点间进行负载均衡,避免单一节点的过载。

以下是实现这一功能的代码:

import requests
import time
import random

API_URL = 'http://localhost:38881'  # 定义Clash API的URL

def get_proxies():
    """获取所有可用的代理节点。"""
    response = requests.get(f"{API_URL}/proxies")  # 发送GET请求获取代理列表
    proxies = response.json()  # 解析JSON格式的响应数据
    print(list(proxies['proxies'].keys()))  # 打印所有代理的名称
    return list(proxies['proxies'].keys())  # 返回代理列表

def switch_proxy(proxy_name):
    """切换到指定的代理节点。"""
    url = f"{API_URL}/proxies/大机场 Big Airport"  # 设置请求的URL
    data = {"name": proxy_name}  # 定义请求的数据,指定要切换的代理名称
    response = requests.put(url, json=data)  # 发送PUT请求以切换代理
    print(f"{API_URL}/proxies/{proxy_name}")
    if response.status_code == 204:  # 如果返回状态码为204,表示成功
        print(f"Successfully switched to proxy: {proxy_name}")
    else:  # 如果切换失败,打印错误信息
        print(f"Failed to switch proxy. Status Code: {response.status_code}")

def random_switch_proxies(interval=5):
    """每隔指定时间随机切换代理节点。"""
    while True:
        proxies = get_proxies()  # 获取代理列表
        if proxies:
            chosen_proxy = random.choice(proxies)  # 随机选择一个代理
            print("Attempting to switch to proxy:", chosen_proxy)  # 打印尝试切换的代理
            switch_proxy(chosen_proxy)  # 执行切换代理操作
        else:
            print("No proxies found.")  # 如果没有找到代理,打印信息
        time.sleep(interval)  # 等待指定的时间间隔

if __name__ == "__main__":
    random_switch_proxies(interval=5)  # 每5秒随机切换一次代理节点

在上述代码中有两个需要指定的关键变量,一个是Clash API的URL,一个是Clash的节点目录。下面一个个进行说明。

API的URL端口。我们需要找到Clash API的URL,如下图所示API的核心是33067,相应的URL端口为'http://localhost:33067'

Clash的节点目录。我们需要找到Clash 的节点目录,如下图所示。

点击后会出现一个网页,我们可以找到节点的目录名称。注意:只能选择切换 Selector 中选中的代理。

实现了节点的随机切换之后,我们也可以进行一些改进,比如可以根据每个节点的延迟、上传/下载的速度进行有条件的切换。

解决方案二:基于上传速度的智能切换

我们可以根据实时网络速度来切换代理节点。如果代理节点的上传速度持续低于预设阈值,我们将自动切换到另一个性能更好的节点。以下是相关代码:

import requests
import time
import random

API_URL = 'http://localhost:38881'  # 定义Clash API的URL
url = f"{API_URL}/proxies/大机场 Big Airport"  # 设置请求的URL

def get_traffic_stats():
    """获取当前的网络流量统计数据。"""
    response = requests.get(f"{API_URL}/connections")  # 发送GET请求获取当前连接的统计信息
    data = response.json()  # 解析JSON格式的响应数据
    return data['downloadTotal'], data['uploadTotal']  # 返回下载和上传的总量

def format_speed(bytes_per_second):
    """将速度从字节转换为适当的单位(B/s, KB/s, MB/s)。"""
    if bytes_per_second < 1024:
        return f"{bytes_per_second:.2f} B/s"
    elif bytes_per_second < 1024 * 1024:
        return f"{bytes_per_second/1024:.2f} KB/s"
    else:
        return f"{bytes_per_second/(1024*1024):.2f} MB/s"

def switch_proxy(proxy_name):
    """切换到指定的代理节点。"""
    data = {"name": proxy_name}  # 定义请求的数据,指定要切换的代理名称
    response = requests.put(url, json=data)  # 发送PUT请求以切换代理
    if response.status_code == 204:  # 如果返回状态码为204,表示成功
        print(f"Successfully switched to proxy: {proxy_name}")
    else:  # 如果切换失败,打印错误信息
        print(f"Failed to switch proxy. Status Code: {response.status_code}")

def get_all_delays():
    """获取所有代理节点的延迟,并保存到一个字典中。"""
    proxies = get_proxies()  # 获取代理列表
    proxy_delays = {}  # 初始化延迟字典
    for proxy in proxies:  # 遍历所有代理
        params = {'timeout': 1000, 'url': 'http://www.google.com'}  # 设置延迟检测的参数
        response = requests.get(f"{API_URL}/proxies/{proxy}/delay", params=params)  # 请求延迟信息
        if response.status_code == 200:  # 如果请求成功
            delay_data = response.json()  # 解析响应数据
            proxy_delays[proxy] = delay_data.get('delay', float('inf'))  # 保存代理的延迟,超时则设为无限大
        else:
            proxy_delays[proxy] = float('inf')  # 请求失败也设为无限大
    return proxy_delays  # 返回所有代理的延迟信息

def speed_test_and_switch_proxy(interval=1, low_speed_threshold=1, fail_times_threshold=5):
    """根据上传速度测试和切换代理节点。"""
    low_speed_count = 0  # 初始化低速计数器
    proxy_delays = get_all_delays()  # 获取所有代理的延迟信息
    while True:
        start_upload, start_download = get_traffic_stats()  # 获取初始上传下载量
        time.sleep(interval)  # 等待指定的时间间隔
        end_upload, end_download = get_traffic_stats()  # 获取时间间隔后的上传下载量

        upload_speed = (end_upload - start_upload) / interval  # 计算上传速度
        print(f"Upload Speed: {format_speed(upload_speed)}")  # 打印格式化后的上传速度

        if upload_speed < 1024 * 1024 * low_speed_threshold:  # 如果上传速度低于阈值
            low_speed_count += 1  # 增加低速计数
            print(f"Low speed count: {low_speed_count}")
            if low_speed_count >= fail_times_threshold:  # 如果低速持续达到阈值次数
                valid_proxies = [p for p, d in proxy_delays.items() if d != float('inf')]  # 筛选出延迟合理的代理
                if valid_proxies:
                    chosen_proxy = random.choice(valid_proxies)  # 随机选择一个有效代理
                    print("Low speed detected, attempting to switch to proxy:", chosen_proxy)
                    switch_proxy(chosen_proxy)  # 切换至选定的代理
                    low_speed_count = 0  # 重置低速计数器
                else:
                    print("No valid proxies found.")  # 如果没有有效代理,打印信息
        time.sleep(interval)  # 等待下一次测试

if __name__ == "__main__":
    speed_test_and_switch_proxy(interval=1, low_speed_threshold=1, fail_times_threshold=5)

此脚本的主要功能是监控并根据上传速度自动切换Clash代理节点。通过实时监测上传速度,并在连续几次测量结果显示速度低于预设阈值时自动切换至相应不超时的节点,希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值