不論微信釘釘仍是什麼軟件,我寫了個通用的消息監控處理機器人

上一篇推文中利用微信同步文章到Bear提到,我但願經過監控微信對應的聊天記錄,來實現一個消息自動處理的機器人,上篇文章實現的就是自動保存感興趣的文章到Bearpython

雖然說那篇文章比較實用,也有不少朋友表示喜歡,但還有很多缺陷:mysql

  • 對技術薄弱的朋友復現困難,項目不少配置須要手動生成,前期校驗工做不少
  • 二次開發比較困難,不能直接做爲第三方包使用
  • 項目兼容性不強,目前只支持Mac而且只支持微信這個APP,其餘如釘釘就沒轍
  • 項目穩定性不強,微信更改機制可能又須要重頭再來

對,問題不少,但在勉強能用的狀況下我並非頗有動力進行新方案的開發。那麼是什麼緣由促使我更新方案了呢~git

背景:在公司和數據打交道居多,運營那塊天天會將一些表格數據發到釘釘羣裏面,而後我組內成員須要手動下載並找到對應的處理腳本進行處理github

而後我問了下兩週須要耗費多長時間在這件事情上,答曰1小時,這確實不能忍了!sql

因而我花了10小時作了這個處理方案!順便解決上面說的四個問題,賺了。。。shell

調研

開始以前,天然是先下決心將一切歷史問題解決掉:bash

  • 跨系統!跨軟件!
  • 程序能直接做爲第三方包使用,而且傻瓜式!

好,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會將那一串加載成咱們人類能夠看懂的語言。

好像沒有一點阻礙,那就能夠直接編碼實現了。

編碼

算了,很少說,多了我也說不出來,直接開源吧,見 github.com/howie6879/e… ,不要吝嗇你的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'}
複製代碼

搞定收工,有興趣歡迎關注個人公衆號:

相關文章
相關標籤/搜索