小哥哥我想.. 把报警信息发到微信

2017-06-09 12:44:26 +08:00
 rapospectre

前言

笔者所在公司项目的报警信息会通过钉钉发送到群组或个人,这样如果服务出现了问题我们都会第一时间收到提醒并进行处理。

某日从钉钉收到报警信息的我突发奇想,如果自己的项目也能在出现问题的第一时间通过社交工具通知我岂不美 ( sang ) 滋 ( xin )滋( bing ) ( kuang )。

通过微信公众平台进行报警很容易,申请公众平台后写个报警后台或者使用企业微信进行接口信息发送。但不管是公众平台还是企业微信对于普通用户的入口太深,而且个人申请还需要提交资料等等一系列事情,显然不是我想要的结果。

之前 web 版微信的协议已经有大神解析过并封装了工具,之后又有优秀的作者不断完善封装了更好用的微信个人号接口。

利用微信个人号接口只要是个微信号就能担当发送日志警报的重任,不仅可以发送到个人同时还能发送到群组。

但是所有微信机器人都是自己主动运行,注册会话,没有办法接收外部程序的日志或报警,因此我就依托 wxpy 写了 wechat_sender。

wechat_sender

wechat_sender 是基于 wxpytornado 实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息 (日志、报警、运行结果等) 发送到微信的工具。

使用 wechat_sender 很简单,只需要有个人微信号,然后用个人微信号启动 wechat_sender 服务。

pip install wechat_sender 
  1. 登录微信并启动 wechat_sender 服务.
   from wxpy import *
   from wechat_sender import *
   bot = Bot() # 这里会扫码登录,如果在服务器中请使用 console_qr 参数
   listen(bot)
   # 之后 wechat_sender 将持续运行等待接收外部消息
  1. 在另一个脚本中向微信发送消息.
   from wechat_sender import Sender
   Sender().send('Hello From Wechat Sender')
   # Hello From Wechat Sender 这条消息将通过 1 中登录微信的文件助手发送给你

当然,wechat_sender 支持 添加 logging handler 的方式直接继承进已有的项目中,例如我的个人的网站、爬虫脚本等,不必修改以前的代码,只需要在 logger 中增加一个 wechat_sender 的 loghandler 就可以把相关日志直接发送到微信中。

举个栗子:

# spider.py
# 假如在一个爬虫脚本,我们想让此脚本的警告信息直接发到微信
# 记得要先用 listen 运行 wechat_sender  服务

import logging
from wechat_sender import LoggingSenderHandler

logger = logging.getLogger(__name__)

# spider code here
def test_spider():
    ...
    logger.exception("EXCEPTION: XXX")

def init_logger():
    sender_logger = LoggingSenderHandler('spider', level=logging.EXCEPTION)
    logger.addHandler(sender_logger)

if __name__ == '__main__':
    init_logger()
    test_spider()

最后类似效果是这样滴:

当然,wechat_sender 不仅可以用来发送日志和警报,你也可以把他当做日程、会议提醒的利器。

wechat_sender 提供了周期消息和延时消息的功能:

# coding: utf-8
import datetime
from wechat_sender import Sender

sender = Sender()
time = datetime.datetime.now()+datetime.timedelta(hours=1)
sender.delay_send(content="测试内容", time=time, title="测试标题", remind=datetime.timedelta(minutes=59))

如果返回正常,1 分钟后你将收到这条消息时间是 1 小时后的消息提醒:

#标题:测试标题
#时间:2017-06-07 12:56:16
#内容:延迟消息测试

其他玩法

作为一只猿,颈椎神马的需要保护好,公司提供了理疗服务,但无奈名额有限,每次预约都很困难,所以我决定写个监控脚本,当有预约名额时通过微信将可预约地址发给我。

写好监控脚本,然后部署到服务器 celery 周期任务中,每隔 1 分钟进行一次查询,同时在服务器上启动 wechat_sender 服务。

晚上打完球看手机收到了 阿绿( wechat_sender ) 发来的消息,果断去预约一发。

更多可能

扫描二维码,验证信息输入 'wechat_sender' 或 '加群' 进入微信交流群尝试更多玩法

关于 Wechat Sender

项目主页https://github.com/bluedazzle/wechat_sender

详细文档http://wechat-sender.readthedocs.io/zh_CN/latest/

10153 次点击
所在节点    Python
53 条回复
Bobc
2017-06-09 13:57:53 +08:00
等等,代码看到一半。。。思绪直接被 Py 交易带崩,你是不是想要搞事情!
worldnode
2017-06-09 14:20:03 +08:00
还以可以替代打 110
runntuu
2017-06-09 15:00:49 +08:00
晕……刚拿手机在知乎上看到这个,放下手机打开 v2 又看到这个
chenqh
2017-06-09 17:35:59 +08:00
感觉这种没有 qqbot 好用,qqbot 有定时任务
rapospectre
2017-06-09 18:31:32 +08:00
@Lentin 底层 api 是有的,docker 化是个好主意
rapospectre
2017-06-09 18:31:52 +08:00
@icenine 哈哈哈
rapospectre
2017-06-09 18:32:37 +08:00
@Bobc 嘿嘿嘿
rapospectre
2017-06-09 18:34:05 +08:00
@chenqh 定时消息是支持的,下一步会加入自定义定时任务
rapospectre
2017-06-09 18:34:43 +08:00
@runntuu 这么有缘分那就来试试吧
takeoffyoung
2017-06-09 18:43:35 +08:00
这个马杀鸡师傅的名字暴露了公司啊,斜眼
YORYOR
2017-06-09 19:01:03 +08:00
微信是支持的 但是对外应该没有暴露接口 我们和微信合作有微信的人建的群 是可以发报警的
fuxkcsdn
2017-06-09 19:20:40 +08:00
为何不用 server 酱?
你这方案还得一台手机长期挂机,而且你引用的那个微信机器人长时间挂机会不定时掉线(至少 17 年 3 月份我测试的时候有这问题)
即使修复了掉线问题,你如何保证手机端微信异常退出时(手机没电,手机没网络,微信强制更新等)机器人自动重新登陆?
综上,为何不用 server 酱?
mritd
2017-06-09 20:56:52 +08:00
表示我们各种监控报警,,,还发什么微信,紧急情况直接打电话了
HanSonJ
2017-06-09 21:08:27 +08:00
日常推荐:

像楼主用的微信机器人 : https://github.com/HanSon/vbot

微信警告可以用公众号的消息模板: https://github.com/HanSon/wechat-notice
dfc643
2017-06-09 21:11:38 +08:00
wending
2017-06-09 21:37:11 +08:00
@rapospectre 这样微信是不是得认证?
rapospectre
2017-06-09 21:44:28 +08:00
@wending 不用哈
rapospectre
2017-06-09 21:51:36 +08:00
@fuxkcsdn
@dfc643
不用再发 server 酱了,我用过。人家是公司做的项目,我觉得做的不错。我只是自己兴趣开源的个人项目。如果你觉得他很赞可以自己开个新帖号召大家用。技术的进步不就在于敢于折腾么,多一种方式何尝不是多一种选择。另外不知哪位说了一堆问题,问题不就是需要人解决的么,三月的问题六月还在谈,你关注的技术社区进展都这么缓慢吗?
rapospectre
2017-06-09 21:52:34 +08:00
@HanSonJ 哈哈。不错,也是基于 itchat 嘛?
rapospectre
2017-06-09 21:53:31 +08:00
@takeoffyoung 哈哈哈,我在想要不要给师傅打个码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367195

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX