不论微信钉钉仍是什么软件,我写了个通用的消息监控处理机器人

上一篇推文中利用微信同步文章到Bear提到,我但愿经过监控微信对应的聊天记录,来实现一个消息自动处理的机器人,上篇文章实现的就是自动保存感兴趣的文章到Bearpython

虽然说那篇文章比较实用,也有不少朋友表示喜欢,但还有很多缺陷:mysql

  • 对技术薄弱的朋友复现困难,项目不少配置须要手动生成,前期校验工做不少
  • 二次开发比较困难,不能直接做为第三方包使用
  • 项目兼容性不强,目前只支持Mac而且只支持微信这个APP,其余如钉钉就没辙
  • 项目稳定性不强,微信更改机制可能又须要重头再来

对,问题不少,但在勉强能用的状况下我并非颇有动力进行新方案的开发。那么是什么缘由促使我更新方案了呢~git

背景:在公司和数据打交道居多,运营那块天天会将一些表格数据发到钉钉群里面,而后我组内成员须要手动下载并找到对应的处理脚本进行处理

而后我问了下两周须要耗费多长时间在这件事情上,答曰1小时,这确实不能忍了!github

因而我花了10小时作了这个处理方案!顺便解决上面说的四个问题,赚了。。。sql

调研

开始以前,天然是先下决心将一切历史问题解决掉:shell

  • 跨系统!跨软件!
  • 程序能直接做为第三方包使用,而且傻瓜式!

好,flag已立,开始吧,核心技术点就是如何监控全部平台软件的消息。微信

上一篇推文的方案只能支持微信,因此我目前的背景需求里面的监控对象是钉钉,难道我又要按照之前的方法去搞db文件么?app

总结来讲,我监控的是消应用息,而且不仅是微信、还须要钉钉、QQ等其余任意软件的消息,并且我也不能一个个地去破解(就算此次解密成功,若是下次需求是其余通讯软件呢?),那该怎么办呢?ide

因此此次处理问题的角度须要站在上帝视角,说来简单,作起来也简单,哈哈。测试

话说我灵光一闪,既然目标对象是全部应用的消息,那我我为什么不将视角从应用层面移到系统层面呢?

我以个人Mac为例,这不有现成的通知中心么?

可谓是柳暗花明又一村,老胡我这招隔山打牛,姿式还能够吧?

如今问题很明确了:

  • 我管你微信、钉钉、仍是QQ,我只看系统的通知中心
  • 我管你怎么加密、怎么限制,你总不会限制系统吧,我仍是只看系统的通知中心

我背靠操做系统老大,如今还惧怕你几个小应用,一块儿上,我哭算我输。

在操做系统的领域内,这个方案就是武侠世界的九阳神功,还配上了屠龙刀,可谓:十步杀一人,千里不留行。

调研结束。

实践

解决方案确立了,接下来无非就是验证加实现,这里仍是以Mac为例。

来来来,看看苹果的系统中心好很差攻占,首先,咋们来确立系统中心数据的存储方式,进入终端:

cd `getconf DARWIN_USER_DIR`/com.apple.notificationcenter/db2
ls
db     db-shm db-wal

能够看到,有三个文件,哎,好熟悉,SQLite呗。

打开:

分别有如下几个表:

  • app
  • categories
  • dbinfo
  • delivered
  • displayed
  • record
  • requests
  • snoozed

可能有点多,但咱们只须要关注两个表就行:

  • app:应用id
  • record:监控的应用消息

建表语句分别以下:

create table app
(
    app_id     INTEGER
        primary key,
    identifier VARCHAR,
    badge      INTEGER
);

create table record
(
    rec_id            INTEGER
        primary key,
    app_id            INTEGER,
    uuid              BLOB,
    data              BLOB,
    request_date      REAL,
    request_last_date REAL,
    delivered_date    REAL,
    presented         Bool,
    style             INTEGER,
    snooze_fire_date  REAL
);

在app表的这行,能够看到微信应用的id35

app_id    identifier
35            com.tencent.xinwechat

知道应用id后就能够直接在record表里面直接找到通知消息:

SELECT app_id,data, presented, delivered_date FROM record WHERE app_id IN (35)  ORDER BY delivered_date DESC;

获得结果以下:

一切顺利,但定睛一看,中间那一大串是什么?不要慌,里面bplist,给了很大的提示。

在Python的世界里,没有什么问题是引入一个第三方包解决不了的,若是有,那么引入两个第三方包就能够了。

pip install biplist

利用biplist会将那一串加载成咱们人类能够看懂的语言。

好像没有一点阻碍,那就能够直接编码实现了。

编码

算了,很少说,多了我也说不出来,直接开源吧,见 https://github.com/howie6879/examiner ,不要吝啬你的Star(可点击阅读原文)。

git clone https://github.com/howie6879/examiner
cd examiner
# 推荐使用pipenv 你也可使用本身中意的环境构建方式
pipenv install --python=/Users/howie6879/anaconda3/envs/python36/bin/python3.6  --skip-lock

接下来只须要在根目录构建本身的监控脚本就行,好比监控微信,监理文件命名为 wechat_app.py:

from examiner.notification import notification_factory

def get_data(app_names: list):
    os_notification = notification_factory(app_names)
    info_list = os_notification.get_target_notification()
    for each in info_list:
        # 自行实现监控逻辑以及处理方案
        print(each)


if __name__ == "__main__":
    app_names = ["WeChat"]
    get_data(app_names)

和上一篇比起来,这代码,不须要配置、不须要提早准备什么,只须要在列表里面填上你想监控的目标应用便可(我顺便支持了多应用),你能够同时监控钉钉和微信等等

本身能够慢慢玩,通常会这样输出:

{'title': '老胡的储物柜', 'subtitle': '', 'body': '测试消息监控,任何应用都行', 'delivered_date': datetime.datetime(2019, 10, 20, 21, 40, 26, 428654), 'presented': 1, 'app_identifier': 'com.tencent.xinwechat', 'app_name': 'WeChat', 'md5': '75e24e2ccc502f01c101fcbd3637950b'}

搞定收工,有兴趣欢迎关注个人公众号:

相关文章
相关标签/搜索