Python 用 Doubao-Seed-Evolving 写网站监控脚本:完整代码与飞书告警、Windows 计划任务踩坑排查
2026/8/6 22:50:20 网站建设 项目流程

Python 用 Doubao-Seed-Evolving 写网站监控脚本:完整代码与飞书告警、Windows 计划任务踩坑排查

一、问题背景:网站半夜挂了,谁在第一时间知道

做开发的人基本都碰过这类问题。服务器上跑着几个对外服务,平时看着正常,某天半夜其中一个悄无声息挂了,第二天上班才发现丢了一晚数据。等到用户或客户来投诉,损失已经实打实发生了。

成熟的监控 SaaS 不是没有,但免费额度紧、付费按年收,对只盯三五个站的个人或小团队来说偏重。本文给出一种轻量方案:用大模型 Doubao-Seed-Evolving 从一个自然语言需求直接生成可运行的 Python 监控脚本,覆盖 HTTP 探测、飞书告警、定时调度全流程,并附两处真实踩坑的排查过程,方便后来的人直接复用。

二、为什么用 Doubao-Seed-Evolving 生成

Doubao-Seed-Evolving 是字节跳动面向复杂工程任务推出的模型,8 月 3 日刚完成第二次升级,重点强化了 Coding 工程能力、Agent 检索能力和幻觉控制能力。对「自然语言需求 → 完整可运行工程」这类任务,它的表现值得实测。

我的做法是先把需求边界讲清楚再交给模型:监控谁、怎么算异常、出事往哪发通知,这三件事由人定,模型只按边界施工。提示词核心几条:读 targets.json 配置(含 name、url、timeout);逐个发 GET 请求记录是否可达、状态码、耗时;不可达、状态码 ≥400、耗时超阈值三种情况任一即异常;异常发飞书告警且内容含关键词;没配飞书就只打印日志。

三、完整 monitor.py(Python 3.10+,仅依赖 requests)

下面是可以直接复制运行的完整版本,已经过实测和两处踩坑修正。

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""HTTP 目标监控脚本:定期监控配置的 URL,异常时通过飞书机器人发送告警"""importjsonimportsysimporttimefromdatetimeimportdatetimefrompathlibimportPathfromtypingimportAnyimportrequestsdefload_json_file(file_path:Path)->Any:withopen(file_path,"r",encoding="utf-8")asf:returnjson.load(f)defget_feishu_webhook(base_dir:Path)->str|None:config_path=base_dir/"config.json"ifnotconfig_path.exists():returnNonetry:config=load_json_file(config_path)webhook=config.get("feishu_webhook","").strip()returnwebhookifwebhookelseNoneexcept(json.JSONDecodeError,OSError)ase:print(f"[警告] 读取 config.json 失败:{e}")returnNonedefload_targets(base_dir:Path)->list[dict]:targets_path=base_dir/"targets.json"ifnottargets_path.exists():print(f"[错误] 未找到配置文件:{targets_path}")sys.exit(1)try:targets=load_json_file(targets_path)ifnotisinstance(targets,list):print("[错误] targets.json 必须是 JSON 数组格式")sys.exit(1)returntargetsexceptjson.JSONDecodeErrorase:print(f"[错误] 解析 targets.json 失败:{e}")sys.exit(1)defcheck_target(target:dict)->dict:name=target.get("name","未命名")url=target.get("url","")timeout=target.get("timeout",5)result={"name":name,"url":url,"timeout":timeout,"is_reachable":False,"status_code":None,"elapsed":0.0,"is_error":False,"error_reason":"",}start_time=time.time()try:response=requests.get(url,timeout=timeout,allow_redirects=True,headers={"User-Agent":"MonitorScript/1.0"})result["elapsed"]=round(time.time()-start_time,3)result["status_code"]=response.status_code result["is_reachable"]=Trueifresponse.status_code>=400:result["is_error"]=Trueresult["error_reason"]=f"HTTP状态码异常:{response.status_code}"elifresult["elapsed"]>timeout:result["is_error"]=Trueresult["error_reason"]=f"响应超时: 耗时{result['elapsed']}s > 阈值{timeout}s"exceptrequests.exceptions.Timeout:result["elapsed"]=round(time.time()-start_time,3)result["is_error"]=Trueresult["error_reason"]=f"请求超时: 超过{timeout}秒未响应"exceptrequests.exceptions.ConnectionError:result["elapsed"]=round(time.time()-start_time,3)result["is_error"]=Trueresult["error_reason"]="连接失败: 无法建立网络连接"exceptrequests.exceptions.RequestExceptionase:result["elapsed"]=round(time.time()-start_time,3)result["is_error"]=Trueresult["error_reason"]=f"请求异常:{str(e)}"returnresultdefsend_feishu_alert(webhook:str,result:dict)->bool:# 飞书对 markdown 类型关键词校验异常,改用 text 类型 + 关键词"监控"current_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")text_content=(f"监控:服务异常通知\n---\n"f"服务名称:{result['name']}\n访问地址:{result['url']}\n"f"错误原因:{result['error_reason']}\n状态码:{result['status_code']or'N/A'}\n"f"响应耗时:{result['elapsed']}s\n超时阈值:{result['timeout']}s\n"f"触发时间:{current_time}\n")payload={"msg_type":"text","content":{"text":text_content}}try:response=requests.post(webhook,json=payload,timeout=10,headers={"Content-Type":"application/json"})response.raise_for_status()resp_data=response.json()ifresp_data.get("code",0)!=0:print(f"[飞书告警发送失败]{resp_data.get('msg','未知错误')}")returnFalsereturnTrueexceptrequests.exceptions.RequestExceptionase:print(f"[飞书告警发送异常]{e}")returnFalsedefprint_log(result:dict)->None:current_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")status="[异常]"ifresult["is_error"]else"[正常]"log_line=(f"[{current_time}]{status}| 名称:{result['name']}| "f"URL:{result['url']}| 状态码:{result['status_code']or'N/A'}| "f"耗时:{result['elapsed']}s")ifresult["is_error"]:log_line+=f" | 原因:{result['error_reason']}"print(log_line)defmain():base_dir=Path(__file__).resolve().parentprint("="*60)print(f"HTTP监控脚本启动 -{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")print("="*60)feishu_webhook=get_feishu_webhook(base_dir)print("[信息] 飞书告警已启用"iffeishu_webhookelse"[信息] 飞书告警未配置,仅打印控制台日志")targets=load_targets(base_dir)print(f"[信息] 成功加载{len(targets)}个监控目标")print("-"*60)error_count=0fortargetintargets:if"name"notintargetor"url"notintarget:print(f"[跳过] 配置项缺少 name 或 url 字段:{target}")continueresult=check_target(target)print_log(result)ifresult["is_error"]:error_count+=1iffeishu_webhookandsend_feishu_alert(feishu_webhook,result):print(f" └─ 飞书告警已发送:{result['name']}")print("-"*60)print(f"监控完成: 共检查{len(targets)}个目标, 异常{error_count}个")print("="*60)sys.exit(1iferror_count>0else0)if__name__=="__main__":main()

四、配置文件与运行步骤

同目录放targets.json(必需)和config.json(可选)。targets.json是监控目标的数组,每项含nameurltimeout三个字段;config.json只放一个feishu_webhook,不配就只打控制台日志。

// targets.json[{"name":"示例站点A","url":"https://www.baidu.com","timeout":5},{"name":"示例站点B","url":"https://github.com","timeout":10}]
// config.json(可选){"feishu_webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx"}

安装依赖与运行:先pip install requests,再python monitor.py即可看到带时间戳的探测日志。这个 Python 网站监控脚本对运行环境要求很低,一台任意配置的云服务器或本地机器都能长期挂着。

定时执行的两种常见姿势。Linux 用 crontab,规则*/5 * * * *表示每 5 分钟一次,完整写法*/5 * * * * /usr/bin/python3 /path/to/monitor.py >> /var/log/monitor.log 2>&1,日志追加到文件便于排查。Windows 则在「任务计划程序」里新建任务,触发器设「每隔 5 分钟」,操作指向一个run_monitor.bat,bat 内容第一行必须chcp 65001强制 UTF-8,再调用python monitor.py,否则会踩到下一节的编码坑。

五、踩坑排查一:飞书告警被关键词校验拦下

现象:脚本逻辑跑通、控制台打印异常,但飞书群里一条告警都没收到,后台返回「Key Words Not Found」。

排查:最初用 markdown 类型消息、正文含「告警」二字,以为飞书关键词校验只认纯文本,把关键词挪到正文第一行仍失败。根因是这台飞书机器人对 markdown 类型消息的关键词校验不稳定,改成 text 类型、关键词改为「监控」后立刻成功。结论:模型写的代码逻辑没错,没踩中的是第三方平台的安全规则,定位根因靠人。

(图 2:飞书群里收到两条告警消息,分别是 httpbin 超时和不存在域名连接失败)

六、踩坑排查二:Windows 计划任务报 GBK 编码错误

现象:在终端手动运行正常,挂进 Windows 计划任务每五分钟跑一次后,日志报错gbk codec can't encode character

排查:计划任务调起的控制台默认 GBK 编码,而日志里用了 emoji 图标,UTF-8 环境下没事、GBK 下直接崩。修法两步:bat 入口加chcp 65001强制 UTF-8;把 emoji 换成[正常]/[异常]纯文字。改完定时任务稳定运行。

(图 3:Windows 任务计划程序里 SeedMonitor 的属性页,触发器为每 5 分钟重复一次)

这里提醒一点:脚本能跑通不算完,能一直跑、出事能喊你,才算真正在岗。下图是稳定运行后的日志,三个目标全部正常、异常 0 个。

(图 4:monitor.log 内容,三个目标全部「正常」、异常 0 个,证明定时任务稳定运行)

七、从脚本到接口:能力沉淀的下一步

脚本在本地跑着只是起点。把探测逻辑抽象成 HTTP 健康检查接口(参数url + timeout + expected_status,返回状态码、耗时、是否异常),再叠告警规则、调度、历史可用率,它就成了一个轻量监控能力。这样一个本机网站监控脚本,就变成了可被前端大屏、运维平台直接调用的接口监控服务。

想让脚本对外提供服务,可封装成接口托管到 YesApi Pro 这类 API 开放平台,省去自搭服务、接计费、做权限的功夫,是否采用看各自基础设施情况。

这种「从个人脚本到可复用产品能力」的路径,正是这次用 Doubao-Seed-Evolving 做复刻最值得沉淀的部分。

八、适用场景与边界

这套方案最适合「盯几个对外站点、要个及时告警」的个人或小团队场景。要做企业级可用性监控,至少补三件事:多节点探测(单台机器单出口会误报)、SSL 证书到期检查、探测与告警通道解耦。它只检查「首页能不能打开」,不验证页面内容和接口深层逻辑,深度巡检需另写用例。把边界讲清楚,比把它描述成万能工具更经得起推敲。

八、总结

这套网站监控方案成本极低:复制配置、装一个 requests 依赖即可上手,对运行环境几乎没要求。Doubao-Seed-Evolving 负责从零到一的代码生成与后续多轮改版,人负责需求边界、踩坑定位和部署判断。两者配合,才到得了「真在跑、真在告警」这一步。

对想做接口监控、又不想一上来就上重型运维系统的个人和小团队来说,这条从脚本到接口的路线值得照着复一遍,跑通之后再按自己的站点数量慢慢加能力,比直接买一套用不上的监控 SaaS 更划算。

#Python #大模型 #AI编程 #网站监控 #后端 #开发工具 #程序员 #自动化 #接口测试#效率工具

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询