V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
rapospectre
V2EX  ›  Python

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

  •  
  •   rapospectre ·
    bluedazzle · 2017-06-09 12:44:26 +08:00 · 10114 次点击
    这是一个创建于 2722 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

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

    某日从钉钉收到报警信息的我突发奇想,如果自己的项目也能在出现问题的第一时间通过社交工具通知我岂不美 ( 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/

    53 条回复    2017-06-10 22:18:59 +08:00
    fzleee
        1
    fzleee  
       2017-06-09 12:47:30 +08:00
    为什么不用 slack...
    DoraJDJ
        2
    DoraJDJ  
       2017-06-09 12:57:03 +08:00 via Android
    为什么不用 Telegram bot...
    oott123
        3
    oott123  
       2017-06-09 12:58:36 +08:00 via Android
    为什么不用 telegram...
    KIDJourney
        4
    KIDJourney  
       2017-06-09 12:59:01 +08:00
    小哥哥昨天是不是发过了一遍[坏笑]
    rapospectre
        5
    rapospectre  
    OP
       2017-06-09 13:01:06 +08:00
    @KIDJourney 昨天发的项目,今天发的文章,哈哈哈
    rapospectre
        6
    rapospectre  
    OP
       2017-06-09 13:02:29 +08:00
    @fzleee 因为小哥哥想发到微信,哈哈
    rapospectre
        7
    rapospectre  
    OP
       2017-06-09 13:02:56 +08:00
    @oott123
    @DoraJDJ 因为小哥哥想发到微信,哈哈
    maleigebi
        8
    maleigebi  
       2017-06-09 13:03:13 +08:00   ❤️ 1
    为什么不用瀑布?
    https://pubu.im/integrations
    kkk330
        9
    kkk330  
       2017-06-09 13:04:14 +08:00 via iPhone
    微信企业号啊
    Lentin
        10
    Lentin  
       2017-06-09 13:04:39 +08:00   ❤️ 1
    为什么不用 Server 酱?
    http://sc.ftqq.com/3.version
    rapospectre
        11
    rapospectre  
    OP
       2017-06-09 13:08:06 +08:00
    @kkk330
    @Lentin
    用过,和企业号没啥区别。小哥哥想发到微信聊天窗口
    rapospectre
        12
    rapospectre  
    OP
       2017-06-09 13:09:22 +08:00
    @maleigebi 这个。。。没啥关联吧
    Lentin
        13
    Lentin  
       2017-06-09 13:11:44 +08:00
    这不是在会话列表吗=。=
    感觉这个集成在服务器上调用个 api 方便点
    rapospectre
        14
    rapospectre  
    OP
       2017-06-09 13:21:29 +08:00
    @Lentin 他的发送对象是公众号主体,并不是聊天对象。如果我想发到群里就比较乏力了。
    Lentin
        15
    Lentin  
       2017-06-09 13:26:37 +08:00
    @rapospectre #14 看看能不能做成个 api 然后放到 docker 开盖即食
    icenine
        16
    icenine  
       2017-06-09 13:29:10 +08:00
    看标题我还想报警为啥不打 110
    ooTwToo
        17
    ooTwToo  
       2017-06-09 13:29:13 +08:00
    方糖也是类似的吧
    apoclast
        18
    apoclast  
       2017-06-09 13:48:08 +08:00
    早就这么干了
    hpeng
        19
    hpeng  
       2017-06-09 13:54:49 +08:00 via iPhone
    如果我写了文档,我也推广一下自己写的推送服务,但是我就是懒得写文档……
    Felldeadbird
        20
    Felldeadbird  
       2017-06-09 13:56:59 +08:00
    刚开始还以为楼主要把 110 的信息发到微信。。。
    这么干我觉得用接口简单很多
    Bobc
        21
    Bobc  
       2017-06-09 13:57:53 +08:00   ❤️ 1
    等等,代码看到一半。。。思绪直接被 Py 交易带崩,你是不是想要搞事情!
    worldnode
        22
    worldnode  
       2017-06-09 14:20:03 +08:00
    还以可以替代打 110
    runntuu
        23
    runntuu  
       2017-06-09 15:00:49 +08:00
    晕……刚拿手机在知乎上看到这个,放下手机打开 v2 又看到这个
    chenqh
        24
    chenqh  
       2017-06-09 17:35:59 +08:00
    感觉这种没有 qqbot 好用,qqbot 有定时任务
    rapospectre
        25
    rapospectre  
    OP
       2017-06-09 18:31:32 +08:00 via Android
    @Lentin 底层 api 是有的,docker 化是个好主意
    rapospectre
        26
    rapospectre  
    OP
       2017-06-09 18:31:52 +08:00 via Android
    @icenine 哈哈哈
    rapospectre
        27
    rapospectre  
    OP
       2017-06-09 18:32:37 +08:00 via Android
    @Bobc 嘿嘿嘿
    rapospectre
        28
    rapospectre  
    OP
       2017-06-09 18:34:05 +08:00 via Android
    @chenqh 定时消息是支持的,下一步会加入自定义定时任务
    rapospectre
        29
    rapospectre  
    OP
       2017-06-09 18:34:43 +08:00 via Android
    @runntuu 这么有缘分那就来试试吧
    takeoffyoung
        30
    takeoffyoung  
       2017-06-09 18:43:35 +08:00
    这个马杀鸡师傅的名字暴露了公司啊,斜眼
    YORYOR
        31
    YORYOR  
       2017-06-09 19:01:03 +08:00
    微信是支持的 但是对外应该没有暴露接口 我们和微信合作有微信的人建的群 是可以发报警的
    fuxkcsdn
        32
    fuxkcsdn  
       2017-06-09 19:20:40 +08:00 via iPhone
    为何不用 server 酱?
    你这方案还得一台手机长期挂机,而且你引用的那个微信机器人长时间挂机会不定时掉线(至少 17 年 3 月份我测试的时候有这问题)
    即使修复了掉线问题,你如何保证手机端微信异常退出时(手机没电,手机没网络,微信强制更新等)机器人自动重新登陆?
    综上,为何不用 server 酱?
    mritd
        33
    mritd  
       2017-06-09 20:56:52 +08:00 via iPhone
    表示我们各种监控报警,,,还发什么微信,紧急情况直接打电话了
    HanSonJ
        34
    HanSonJ  
       2017-06-09 21:08:27 +08:00
    日常推荐:

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

    微信警告可以用公众号的消息模板: https://github.com/HanSon/wechat-notice
    dfc643
        35
    dfc643  
       2017-06-09 21:11:38 +08:00
    wending
        36
    wending  
       2017-06-09 21:37:11 +08:00
    @rapospectre 这样微信是不是得认证?
    rapospectre
        37
    rapospectre  
    OP
       2017-06-09 21:44:28 +08:00 via Android
    @wending 不用哈
    rapospectre
        38
    rapospectre  
    OP
       2017-06-09 21:51:36 +08:00 via Android   ❤️ 1
    @fuxkcsdn
    @dfc643
    不用再发 server 酱了,我用过。人家是公司做的项目,我觉得做的不错。我只是自己兴趣开源的个人项目。如果你觉得他很赞可以自己开个新帖号召大家用。技术的进步不就在于敢于折腾么,多一种方式何尝不是多一种选择。另外不知哪位说了一堆问题,问题不就是需要人解决的么,三月的问题六月还在谈,你关注的技术社区进展都这么缓慢吗?
    rapospectre
        39
    rapospectre  
    OP
       2017-06-09 21:52:34 +08:00 via Android
    @HanSonJ 哈哈。不错,也是基于 itchat 嘛?
    rapospectre
        40
    rapospectre  
    OP
       2017-06-09 21:53:31 +08:00 via Android
    @takeoffyoung 哈哈哈,我在想要不要给师傅打个码
    rapospectre
        41
    rapospectre  
    OP
       2017-06-09 21:57:04 +08:00 via Android
    @YORYOR 那肯定美滋滋啊,个人想用的话只能我这种办法了
    rapospectre
        42
    rapospectre  
    OP
       2017-06-09 21:58:16 +08:00 via Android
    @mritd 哈哈哈,是的,我司也是,一言不合电话都来了,你不接直接打给 leader
    HanSonJ
        43
    HanSonJ  
       2017-06-09 21:59:46 +08:00
    @rapospectre #39 我的是 PHP。。。
    fuxkcsdn
        44
    fuxkcsdn  
       2017-06-09 22:06:46 +08:00 via iPhone
    @rapospectre 微信判定你是机器人登陆就直接让你登出了,你以为模拟 web 微信再像能解决的?
    作为过来人提前告诉你这个“报警系统”的坑点,别鸡冻

    BTW,你真在生产环境部署后,半年后再来推广不迟
    fuxkcsdn
        45
    fuxkcsdn  
       2017-06-09 22:12:00 +08:00 via iPhone
    @rapospectre
    三月的问题六月还在谈,你关注的技术社区进展都这么缓慢吗?
    …我会告诉你,这问题从 wxpy 一开始就有的吗?我说的是直到 17 年三月份还没解决(建议多逛逛 issues )
    dfc643
        46
    dfc643  
       2017-06-09 22:15:26 +08:00   ❤️ 1
    @rapospectre 抱歉打扰了
    rapospectre
        47
    rapospectre  
    OP
       2017-06-09 22:38:28 +08:00 via Android
    @fuxkcsdn 谢谢你的提醒,我也没说要大家部署到公司的生产环境中,但我的个人项目生产环境已经在用了,目前比较稳定。做这个也是有需要的人拿去用好了,更多人用也可以鼓励作者不断更新不是么。至于 wxpy 的 issue 作为 wxpy python2 版本的维护者我相信我逛的不比你少,掉线问题已经改善很多了。
    rapospectre
        48
    rapospectre  
    OP
       2017-06-09 22:39:32 +08:00 via Android
    @HanSonJ 厉害了,从底层做起,很棒
    rapospectre
        49
    rapospectre  
    OP
       2017-06-09 22:40:29 +08:00 via Android
    @dfc643 抱歉,刚才语言可能不太合适。
    eoo
        50
    eoo  
       2017-06-09 23:15:15 +08:00 via Android
    @fuxkcsdn server 酱是不是利用微信公众号给推送消息的?
    liuscgood
        51
    liuscgood  
       2017-06-10 10:47:49 +08:00
    这个不太行,我写过一个 wechat 的 sdk,会经常掉线,扫码也很烦。推荐用服务号做。
    rapospectre
        52
    rapospectre  
    OP
       2017-06-10 11:55:09 +08:00 via Android
    @liuscgood 掉线问题已经好很多了,个人号想象空间比服务号大很多,我只是举个例子用来发日志,其实能做的事情太多了。
    mritd
        53
    mritd  
       2017-06-10 22:18:59 +08:00
    @rapospectre #42 打电话给 leader ?都特么一起打,谁都跑不了......
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3505 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 151ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.