- 读取现有节点列表:使用
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节点列表。









