适用场景:代理 IP 池可用性监控、定时巡检、异常告警
运行环境:Node.js ≥ 22、Python 3、Linux/macOS/Windows
1. 方案概述
本方案通过 OpenClaw(龙虾 AI 助手)实现代理IP池的自动化拉取、连通性测试、可用性统计、异常告警全流程管理,解决人工检测效率低、漏告警、无数据统计等问题,保障业务代理IP稳定可用。
1.1 核心架构
-
Python脚本:负责IP拉取、连通性测试、生成结构化监控报告
-
OpenClaw Cron:负责定时调度检测任务,无需人工值守
-
OpenClaw消息通道:对接钉钉、企业微信、QQ等平台,实现多渠道告警
-
告警策略:按IP可用率分级触发告警,支持静默时段设置,避免打扰
1.2 核心价值
-
全自动监控:从IP拉取到告警通知,全程无需人工干预
-
数据可视化:实时统计IP可用率、平均延迟、失败原因,形成规范报告
-
多渠道告警:异常情况及时触达相关人员,降低业务风险
-
智能静默:合理划分告警时段,保障休息时间不被非紧急通知打扰
2. 环境准备与OpenClaw 安装
2.1 基础环境要求
-
Node.js:版本 ≥ v22(需提前安装并配置环境变量)
-
Python 环境:Python 3.7及以上,需安装 requests 依赖库
-
终端工具:Linux/macOS 终端或Windows PowerShell(需以管理员权限运行)
2.2OpenClaw安装与初始化
打开终端/ PowerShell,执行以下命令,完成 OpenClaw 安装与初始化:
bash
# 全局安装 OpenClaw
npm install -g openclaw
# 初始化工作空间(按提示完成配置)
openclaw init
初始化完成后,自动生成默认工作目录:~/.openclaw/workspace/(后续脚本、报告均存储在此目录下)。
2.3Python依赖安装
执行以下命令,安装脚本所需的 requests 库:
bash
pip install requests
3.IP池测试脚本(核心执行单元)
3.1 脚本用途
定时从API拉取IP列表,批量测试每个IP的连通性、响应延迟,生成结构化JSON报告,为告警判断提供数据支撑。以下代码采用携趣代理API进行测试。
3.2 脚本路径
脚本需存储在OpenClaw工作目录下,具体路径:
~/.openclaw/workspace/scripts/test_proxy_pool.py
3.3 完整脚本代码
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
代理 IP 池自动化检测脚本
功能:拉取代理IP → 批量测试连通性 → 生成监控报告
"""
import requests
import json
from datetime import datetime
import urllib3
# 关闭SSL证书警告(避免测试时出现证书验证错误)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# ====================== 配置项(请自行修改) ======================
# 携趣代理 API 配置
XIEQU_API = "http://api.xiequ.cn/VAD/GetIp.aspx"
API_PARAMS = {
"act": "get",
"uid": "你的UID", # 替换为你的携趣账户UID
"vkey": "你的VKEY", # 替换为你的携趣账户VKEY
"num": 10, # 每次拉取IP数量
"time": 30, # IP有效期(分钟)
"plat": 1, # 平台类型(固定值1)
"so": 1, # 排序方式(固定值1)
"spl": 1 # 分隔符(固定值1)
}
# 测试配置
TEST_URL = "https://www.xiequ.cn/OnlyIp.aspx" # 测试目标地址
REQUEST_TIMEOUT = 5 # 请求超时时间(秒)
REPORT_PATH = "workspace/ip_pool_report.json" # 报告输出路径
# =================================================================
def fetch_proxy_ips():
"""从携趣API拉取代理IP列表"""
try:
resp = requests.get(XIEQU_API, params=API_PARAMS, timeout=10)
resp.raise_for_status() # 触发HTTP错误(如404、500)
# 处理返回结果,过滤空值,返回有效IP列表
ip_list = [ip.strip() for ip in resp.text.strip().split("\n") if ip.strip()]
return ip_list
except Exception as e:
print(f"拉取IP失败:{str(e)}")
return []
def test_single_proxy(ip: str) -> dict:
"""测试单个代理IP的可用性,返回测试结果"""
proxies = {
"http": f"http://{ip}",
"https": f"http://{ip}"
}
try:
start_time = datetime.now()
# 发送测试请求
resp = requests.get(
TEST_URL,
proxies=proxies,
timeout=REQUEST_TIMEOUT,
verify=False # 关闭SSL验证
)
# 计算响应延迟(毫秒)
cost_ms = int((datetime.now() - start_time).total_seconds() * 1000)
# 判断IP是否可用(状态码200且响应内容有效)
if resp.status_code == 200 and "|" in resp.text:
return {"ip": ip, "status": "ok", "latency_ms": cost_ms, "reason": ""}
return {"ip": ip, "status": "fail", "latency_ms": -1, "reason": "响应无效"}
except Exception as e:
# 捕获请求异常(超时、连接失败等)
return {"ip": ip, "status": "fail", "latency_ms": -1, "reason": str(e)}
def generate_report(ip_list: list, test_results: list):
"""根据测试结果,生成结构化监控报告并写入文件"""
total_ip = len(ip_list)
success_cnt = sum(1 for item in test_results if item["status"] == "ok")
fail_cnt = total_ip - success_cnt
# 计算可用率(避免除数为0)
success_rate = (success_cnt / total_ip * 100) if total_ip > 0 else 0.0
# 计算平均延迟(仅统计可用IP)
valid_latency = [item["latency_ms"] for item in test_results if item["status"] == "ok"]
avg_latency = int(sum(valid_latency) / len(valid_latency)) if valid_latency else 0
# 构建报告内容
report = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"total_ip": total_ip,
"success_ip": success_cnt,
"fail_ip": fail_cnt,
"success_rate": f"{success_rate:.2f}%",
"avg_latency_ms": avg_latency,
"available_ips": [item["ip"] for item in test_results if item["status"] == "ok"],
"fail_details": [{"ip": item["ip"], "reason": item["reason"]} for item in test_results if item["status"] == "fail"]
}
# 写入JSON报告文件
with open(REPORT_PATH, "w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
return report
def main():
"""脚本主函数:拉取IP → 测试 → 生成报告 → 打印结果"""
ip_list = fetch_proxy_ips()
if not ip_list:
print("未获取到任何代理IP,脚本终止")
return
# 批量测试所有IP
test_results = [test_single_proxy(ip) for ip in ip_list]
# 生成报告
report = generate_report(ip_list, test_results)
# 打印测试结果(控制台可视化)
print("=" * 50)
print(f"检测时间:{report['timestamp']}")
print(f"总IP数:{report['total_ip']}")
print(f"可用IP:{report['success_ip']}")
print(f"失败IP:{report['fail_ip']}")
print(f"可用率:{report['success_rate']}")
print(f"平均延迟:{report['avg_latency_ms']}ms")
print("=" * 50)
if __name__ == "__main__":
main()
4.OpenClaw定时任务配置
4.1 任务说明
通过OpenClaw Cron功能,设置每30分钟执行一次IP池检测任务,自动完成IP拉取、测试、报告生成,无需人工触发。
4.2 创建定时任务
打开终端/ PowerShell,执行以下命令,创建定时任务:
bash
openclaw cron add "ip-pool-monitor" "*/30 * * * *" "python3 ~/.openclaw/workspace/scripts/test_proxy_pool.py"
命令说明:
-
"ip-pool-monitor":任务名称(可自定义)
-
"*/30 * * * *":Cron表达式,代表每30分钟执行一次
-
"python3 ~/.../test_proxy_pool.py":待执行的脚本路径(需与实际路径一致)
4.3 定时任务管理命令
bash
# 查看所有定时任务列表
openclaw cron list
# 启动指定定时任务(任务名称为ip-pool-monitor)
openclaw cron start ip-pool-monitor
# 停止指定定时任务
openclaw cron stop ip-pool-monitor
# 删除指定定时任务
openclaw cron delete ip-pool-monitor
5. 告警通知配置
5.1 支持告警渠道
适配不同使用场景,支持3种主流告警渠道,可根据需求选择配置:
-
钉钉机器人:推荐企业用户、工作群通知,适配团队协作场景
-
企业微信机器人:适合公司内部通知,可关联企业组织架构
-
QQ机器人:适合个人用户、小团队小群,配置简单便捷
5.2 通用配置步骤
无论选择哪种渠道,均遵循以下3个核心步骤:
1.在对应平台创建「自定义机器人」,获取机器人Webhook URL(关键凭证);
2.在OpenClaw中配置机器人凭证(具体操作参考对应平台机器人文档);
3.在Python脚本中添加告警判断逻辑(根据IP可用率触发通知)。
5.3 智能告警策略
为避免过度打扰,采用分级告警策略,具体规则如下表:
|----------|------|----------------------|
| 可用率 | 告警等级 | 告警规则 |
| <60% | 紧急告警 | 全天立即发送,确保异常及时处理 |
| 60%~80% | 一般告警 | 仅工作时间(09:00-18:00)发送 |
| >80% | 正常状态 | 不发送任何通知 |
静默时段:23:00~08:00不发送非紧急告警(仅可用率<60%的紧急告警正常发送)。
6. 报告与告警示例
6.1 正常状态报告(控制台输出)
Plain Text
==================================================
检测时间:2026-04-14 10:30:00
总IP数:10
可用IP:9
失败IP:1
可用率:90.00%
平均延迟:245ms
==================================================
6.2 异常告警通知(文本格式,适配所有渠道)
Plain Text
【⚠️ IP 池异常告警】
检测时间:2026-04-14 02:15:00
总IP数:10
可用IP:5
失败IP:5
可用率:50.00%(低于阈值60%)
平均延迟:1823ms
处理建议:
1. 检查携趣代理账户余额,确认是否足够
2. 检查IP提取频次限制,避免触发平台限制
3. 切换备用IP池,保障业务正常运行
7. 部署与运行
7.1 首次测试(验证脚本可用性)
执行以下命令,手动运行脚本,验证脚本是否能正常拉取IP、生成报告:
bash
cd ~/.openclaw/workspace
python3 scripts/test_proxy_pool.py
7.3 查看运行日志
若任务未执行或告警未收到,可通过以下命令查看日志,定位问题:
bash
openclaw log
8. 常见问题与排查
8.1 拉取IP失败
-
排查点1:检查API地址、uid、vkey是否正确(需与携趣账户信息一致);
-
排查点2:检查服务器网络连通性,确认能正常访问携趣 API 地址;
-
排查点3:检查携趣账户状态,确认账户余额充足、未被限制使用。
8.2 定时任务不执行
-
排查点1:确认 Node.js 版本 ≥ v22(版本过低会导致 Cron 功能异常);
-
排查点2:使用openclaw cron list检查任务状态,确认任务已启动;
-
排查点3:查看OpenClaw日志(openclaw log),定位任务执行失败原因。
8.3 告警未收到
-
排查点1:检查机器人Webhook URL是否正确,是否存在拼写错误;
-
排查点2:检查机器人关键词/IP 白名单配置,确保OpenClaw服务器IP在白名单内;
-
排查点3:确认当前时段未进入静默时段,且IP可用率达到告警阈值。