Python + Server酱:脚本跑完/出错,微信立刻收到通知
效果:爬虫或长任务结束(无论成功失败)时,你的微信收到一条带执行结果的通知。
前置条件
- 一个 Server酱 SendKey(30 秒获取教程)
- Python 3.8+
配置步骤
- 把 SendKey 存入环境变量(不要写死在代码里):
export SERVERCHAN_SENDKEY="你的SENDKEY"
- 安装官方 SDK(自动识别 SCT/SC3 两种 SendKey,无需关心端点差异):
pip install serverchan-sdk
- 发送第一条消息:
import os
from serverchan_sdk import sc_send
response = sc_send(
os.environ["SERVERCHAN_SENDKEY"],
"任务完成", # 标题,不能包含换行
"详情正文,支持 **Markdown**", # 正文,可选
{"short": "任务完成"}, # 可选参数;更多选项(tags/channel/openid)见 SDK 文档
)
print(response) # code 为 0 即成功
不想加 SDK 依赖?官方 serverchan-demo 仓库提供了 11 种语言的直调实现,Python 版核心函数如下(同样自动识别 SCT/SC3):
# 来自官方 serverchan-demo/python/send.py
import re
import requests
def sc_send(sendkey, title, desp='', options=None):
if options is None:
options = {}
if sendkey.startswith('sctp'):
match = re.match(r'sctp(\d+)t', sendkey)
if match:
num = match.group(1)
url = f'https://{num}.push.ft07.com/send/{sendkey}.send'
else:
raise ValueError('Invalid sendkey format for sctp')
else:
url = f'https://sctapi.ftqq.com/{sendkey}.send'
params = {'title': title, 'desp': desp, **options}
headers = {'Content-Type': 'application/json;charset=utf-8'}
response = requests.post(url, json=params, headers=headers)
return response.json()
完整示例代码
爬虫/长任务的通用模式——成功发摘要、失败发告警,整段复制即可运行:
import os
import traceback
from serverchan_sdk import sc_send
SENDKEY = os.environ["SERVERCHAN_SENDKEY"]
def main():
# 把这里换成你的实际任务(爬虫、数据处理、训练脚本……)
results = [f"第{i}页" for i in range(1, 4)]
return f"共抓取 {len(results)} 页数据"
if __name__ == "__main__":
try:
summary = main()
sc_send(SENDKEY, "✅ 爬虫完成", summary)
except Exception:
# 失败时把错误栈发到微信,方便直接定位
sc_send(SENDKEY, "❌ 爬虫失败", f"```\n{traceback.format_exc()[-800:]}\n```")
raise
常见问题
免费额度够用吗? 免费每天 5 条。批量任务不要每条数据发一次,在任务结束时合并成一条摘要发送(也避免触发每分钟 50 条的频率限制)。
消息没收到?
先看返回 JSON 的 code 与 message,再按 FAQ 排查清单 逐项检查。
定时任务怎么只在失败时通知?
把 sc_send 放进 except 分支即可;crontab 场景可参考后续的 crontab 集成页。
SendKey 放哪里安全? 环境变量或密钥管理服务;不要提交进 git,不要打印到日志。详见 SendKey 保管建议。