1.输入处理

  • 读取现有节点列表:使用read()函数读取输入文件,确保使用正确的编码(如UTF-8)。
  • 处理多个文件:可以修改脚本以支持多个文件或目录,读取所有节点列表。

解析最新节点列表

  • 从API获取数据:使用requests库发送HTTP请求,解析JSON响应。
  • 读取文本文件:如果节点列表保存在文本文件中,使用json模块或自定义解析函数。

数据清洗

  • 处理异常值:检查节点数据,处理空值、错误IP地址等异常情况。
  • 去重和格式统一:确保节点数据结构一致,去除重复的IP地址。

比较与更新

  • 使用集合进行高效操作:将节点IP存储在集合中,快速查找是否存在。
  • 更新现有列表:遍历最新节点列表,更新现有列表,添加新节点,标记失效节点。

优化性能

  • 分批处理:对于大规模数据,分批次处理,减少内存压力。
  • 使用线程池:对于时间敏感的API请求,使用线程池优化请求处理。

错误处理

  • 日志记录:记录错误信息,方便排查问题。
  • 重试机制:处理暂时连接问题,重试请求。

自动化运行

  • 添加脚本执行日志:记录脚本执行过程,包括开始、结束时间。
  • 配置执行时间:使用schedulejob或类似工具定时运行。

测试与验证

  • 单元测试:在不同网络环境下测试脚本,确保稳定性。
  • 回滚机制:在更新失败时,能够回滚到之前的版本。

脚本实现

以下是一个示例脚本,展示优化后的流程:

import requests
import json
import time
from datetime import datetime
def update_vpn_nodes():
    # 定义源和目标文件路径
    source_path = "latest_nodes.json"
    target_path = "nodes_list.txt"
    # 数据清洗函数
    def clean_data(data):
        return [{ 'ip': ip, 'port': port, 'name': name } for ip, port, name in data]
    # 从源读取数据
    try:
        if source_path.endswith('.json'):
            with open(source_path, 'r', encoding='utf-8') as f:
                latest_nodes = json.load(f)
            latest_nodes = clean_data(latest_nodes)
        else:
            # 如果是文本文件,自定义解析
            latest_nodes = clean_data(json.loads(f.read()))
    except Exception as e:
        print(f"读取源文件失败:{e}")
        return
    # 处理现有节点列表
    try:
        with open(target_path, 'r', encoding='utf-8') as f:
            existing_nodes = json.load(f)
            existing_nodes = clean_data(existing_nodes)
    except Exception as e:
        print(f"读取现有节点列表失败:{e}")
        return
    # 执行更新操作
    new_nodes = set()
    updated_nodes = []
    deleted_nodes = []
    # 遍历最新节点列表
    for node in latest_nodes:
        ip = node['ip']
        if ip not in new_nodes:
            new_nodes.add(ip)
            # 更新或添加节点
            if ip in existing_nodes:
                updated_nodes.append(node)
            else:
                updated_nodes.append(node)
                deleted_nodes.append(ip)
        else:
            # 重复节点,按需处理(如清理)
            pass
    # 清理未存在的节点
    for ip in existing_nodes:
        if ip not in new_nodes:
            deleted_nodes.append(ip)
    # 更新结果
    updated_data = {
        'updated': updated_nodes,
        'deleted': deleted_nodes,
        'time': datetime.now().isoformat()
    }
    # 写回文件
    with open(target_path, 'w', encoding='utf-8') as f:
        json.dump(updated_data, f, indent=2)
    print(f"更新完成,时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    return updated_data
if __name__ == "__main__":
    start_time = time.time()
    update_vpn_nodes()
    print(f"总耗时:{time.time() - start_time}秒")

使用说明

  • 输入文件:支持JSON和文本文件格式。
  • 输出文件:自动将更新后的节点列表保存回指定文件。
  • 日志记录:记录每次更新的时间和结果。

可能的改进

  • 多线程处理:对于API请求,使用concurrent.futures.ThreadPool来提高处理速度。
  • 数据库集成:将节点信息存储在数据库中,提高查询效率。
  • 配置文件支持:允许用户配置源和目标文件路径,以及其他参数。

验证脚本

在实际使用前,建议先在测试环境中运行脚本,确保没有遗漏错误,并且能够正确更新节点信息。

希望这个优化后的脚本能够满足用户的需求,自动化地管理VPN节点列表。

1.输入处理

扫码添加原子VPN加速器微信

扫码添加原子VPN加速器微信

400-815-7263
扫码添加原子VPN加速器微信

扫码添加原子VPN加速器微信

网站地图