推荐学习书目
› 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 · Jun 9, 2017 · 11745 views
    This topic created in 3439 days ago, the information mentioned may be changed or developed.

    前言

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

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

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

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

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

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

    wechat_sender

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

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

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

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

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