我这边有个小脚本,专门半夜去跑一些定时任务:备份数据库、爬一点监控数据、顺手把服务器磁盘空间扫一圈。以前都是第二天早上起来开电脑,看一屏日志,心里默默祈祷别有红色的 error。后来想想,这也太原始了,我手机微信天天在响,为什么不能任务跑完就给我发一条微信:“兄弟,备份好了/挂了,快来看”。
然后我就去折腾了 pushplus,用 Python 写了个小工具,现在任何脚本只要一行代码就能把消息扔到我微信上,爽得很。今天就把这个过程完整聊一遍,代码也给你们写好,直接抄走就能用。
先简单说下 pushplus 是个啥
别被名字吓到,它其实就是一个“代发通知的小哥”:
对我们 Python 程序员来说,就一个事:发 HTTP 请求而已。
核心接口长这样:
http://www.pushplus.plus/sendtoken、title、content,再加上可选的 topic(群组)、template(展示模板)、channel(渠道)所以你脑子里先有个印象:pushplus 就是一个“收 HTTP,发微信”的小中间件。
先把前置工作搞定
真正写代码之前,有三件非常无聊但必须做的事情:
token,在“个人中心/发送消息”那块一般都能看见requests 库:pip install requeststoken 这个东西非常关键,你可以把它当成“给谁发消息”的身份证,一般我会放到环境变量里,避免写死在代码里泄露掉。
最朴素的一条微信:先把单人推送跑通
我们先从最小闭环开始:写一个函数,给自己发一条微信文本消息,能通就表示整条链路都好了。
下面这段是我日常在用的版本,你可以直接改 token 和内容:
import osimport requests# 建议用环境变量存,不要写死在代码里PUSHPLUS_TOKEN = os.getenv("PUSHPLUS_TOKEN", "这里填你的token")defpushplus_send( content: str, title: str = "Python 小通知", template: str = "html",) -> None:""" 用 pushplus 给自己发一条微信消息 """ifnot PUSHPLUS_TOKEN:raise RuntimeError("缺少 PUSHPLUS_TOKEN,请先配置环境变量") url = "http://www.pushplus.plus/send" params = {"token": PUSHPLUS_TOKEN,"title": title,"content": content,"template": template, }try: resp = requests.get(url, params=params, timeout=5) data = resp.json()except Exception as exc:# 这里按你自己项目的日志体系去记 print(f"[pushplus] 请求失败:{exc}")return# pushplus 是异步发送的,这里的 code=200 只代表“请求收到了”# 真正发成功/失败会通过回调或后续查询给结果 :contentReference[oaicite:3]{index=3} code = data.get("code")if code != 200: print(f"[pushplus] 请求返回异常 code={code}, msg={data.get('msg')}")else:# data 里会有一个消息流水号,可以留着排查问题用 print(f"[pushplus] 已提交消息,流水号={data.get('data')}")试一下最简单的调用:
if __name__ == "__main__": pushplus_send("脚本跑完啦,一切正常 😄", title="定时任务通知")跑完之后看下你手机微信里 pushplus 公众号的消息,有没有这条。如果有,说明:
链路打通,后面就好玩了。
稍微讲一点点参数,不讲太多,容易困
你刚刚看到的几个参数,其实已经覆盖 80% 的需求了:
token:你个人的令牌,pushplus 用它知道要发给谁title:消息标题,可空,但有标题微信里看着更清晰content:正文,可以是纯文本,也可以带 HTML / Markdowntemplate:展示模板,默认是 html,你也可以改成 txt、markdown 等等举个栗子,比如你想用 Markdown 发个多行内容,代码像这样:
defsend_markdown_demo(): lines = ["# 每日任务报告","","- 备份:✅ 成功","- 爬虫:✅ 成功","- CPU 峰值:42%", ] content = "\n".join(lines) pushplus_send(content, title="每日报告", template="markdown")微信打开的时候就是一条格式还挺好看的 Markdown 消息,比纯文本舒服很多。
给一群人发:topic 群组推送
很多人问的第二个需求就是:我不只想给自己发,我还想把这个消息顺手发给整个团队,比如“接口挂了,所有人都看到”。
pushplus 的做法是让你先建一个“群组”,每个群组有一个 topicCode,也就是我们在接口里要填的 topic。群组可以通过二维码让别人扫码加入,这个在官网的群组管理和开放接口文档里都有写。
大概流程是这样的(略简化一下):
dev-teamtopic="dev-team",所有订阅了这个群的人都会收到消息 然后我们把刚才的函数稍微扩展一下:defpushplus_send_group( content: str, title: str, topic: str, template: str = "markdown",) -> None:""" 往群组里发消息,一对多 """ifnot PUSHPLUS_TOKEN:raise RuntimeError("缺少 PUSHPLUS_TOKEN,请先配置环境变量") url = "http://www.pushplus.plus/send" payload = {"token": PUSHPLUS_TOKEN,"title": title,"content": content,"topic": topic,"template": template, }try:# 这里用 POST,参数走 JSON body resp = requests.post(url, json=payload, timeout=5) data = resp.json()except Exception as exc: print(f"[pushplus] 群组推送失败:{exc}")returnif data.get("code") != 200: print(f"[pushplus] 群组推送异常:{data}")比如你要给 dev-team 组发一个“线上故障”的提醒:
if __name__ == "__main__": content = """# 线上告警- 接口:/api/order/list- 状态:500- 错误:数据库连接超时- 时间:2025-12-12 23:30""" pushplus_send_group(content, title="【告警】订单接口异常", topic="dev-team")这样一来,哪怕你在地铁上,整个组也能第一时间看到这条消息,谁在电脑前谁去处理,效率会高很多。
顺手做成一个小工具类,方便到处复用
实际工作里我一般不会到处乱写 requests.get/post,而是封一下,变成一个小工具模块,所有脚本统一调。
比如可以做一个最简单的封装:
from dataclasses import dataclassfrom typing import Optional, Literalimport osimport requestsTemplateType = Literal["html", "txt", "markdown", "json"]@dataclassclassPushplusClient: token: str = os.getenv("PUSHPLUS_TOKEN", "")def_ensure_token(self):ifnot self.token:raise RuntimeError("pushplus token 未配置")defsend( self, content: str, title: str = "", topic: Optional[str] = None, template: TemplateType = "html", channel: str = "wechat", ) -> bool:""" 统一发消息的方法,返回 True/False 表示是否请求成功 """ self._ensure_token() url = "http://www.pushplus.plus/send" payload = {"token": self.token,"title": title,"content": content,"template": template,"channel": channel, }if topic: payload["topic"] = topictry: resp = requests.post(url, json=payload, timeout=5) data = resp.json()except Exception as exc: print(f"[pushplus] 请求异常:{exc}")returnFalseif data.get("code") != 200: print(f"[pushplus] 发送失败:{data}")returnFalsereturnTrue然后在任何脚本里,就可以这样用:
pp = PushplusClient()defrun_job():# 这里是你的业务逻辑 ...# 成功/失败都发一下 pp.send("定时任务执行成功", title="任务正常结束")要给群组发,也就多传一个 topic 而已。
说两个容易踩的点:额度和频率
pushplus 虽然对个人挺友好,但毕竟是个公共服务,还是有一些限制的,不注意的话会踩坑:
所以两点建议:
你可以在工具类的外层再包一层 Redis / 本地文件做个“已经发过”的标记,这个就不展开了。
最后随手给你一个“完整例子”:脚本异常就发微信
很多人最典型的需求就是:脚本挂了给我发消息。这个其实很简单,我们就 try / except 一下,把异常抓出来扔给 pushplus。
import tracebackfrom pushplus_tool import PushplusClient # 假设刚才的类放在这个文件里pp = PushplusClient()defmain():# 这里写你的主逻辑1 / 0# 故意弄个异常玩玩if __name__ == "__main__":try: main() pp.send("脚本执行成功 ✅", title="脚本状态")except Exception: err = traceback.format_exc() text = f"脚本执行失败 ❌\n\n```python\n{err}\n```" pp.send(text, title="脚本报错", template="markdown")跑一下你就会发现:脚本一报错,你手机微信就“叮”一下,把完整的 Traceback 丢过来了,基本能满足 80% 的“远程盯脚本”需求。
差不多就这样,pushplus 这玩意儿上手其实没啥门槛,重点就是:
你后面要玩什么“监控服务器”、“抢票提醒”、“定时汇总日报”之类的,只要能用 Python 写出来,一行 pp.send(...) 扔进去就行了。剩下的就交给 pushplus 和微信去折腾吧。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html