上一篇推文中利用微信同步文章到Bear提到,我但願經過監控微信對應的聊天記錄,來實現一個消息自動處理的機器人,上篇文章實現的就是自動保存感興趣的文章到Bear。python
雖然說那篇文章比較實用,也有不少朋友表示喜歡,但還有很多缺陷:mysql
對,問題不少,但在勉強能用的狀況下我並非頗有動力進行新方案的開發。那麼是什麼緣由促使我更新方案了呢~git
背景:在公司和數據打交道居多,運營那塊天天會將一些表格數據發到釘釘羣裏面,而後我組內成員須要手動下載並找到對應的處理腳本進行處理github
而後我問了下兩週須要耗費多長時間在這件事情上,答曰1小時,這確實不能忍了!sql
因而我花了10小時作了這個處理方案!順便解決上面說的四個問題,賺了。。。shell
開始以前,天然是先下決心將一切歷史問題解決掉:bash
好,flag已立,開始吧,核心技術點就是如何監控全部平臺軟件的消息。微信
上一篇推文的方案只能支持微信,因此我目前的背景需求裏面的監控對象是釘釘,難道我又要按照之前的方法去搞db文件麼?app
總結來講,我監控的是消應用息,而且不僅是微信、還須要釘釘、QQ等其餘任意軟件的消息,並且我也不能一個個地去破解(就算此次解密成功,若是下次需求是其餘通訊軟件呢?),那該怎麼辦呢?ide
因此此次處理問題的角度須要站在上帝視角,說來簡單,作起來也簡單,哈哈。
話說我靈光一閃,既然目標對象是全部應用的消息,那我我爲什麼不將視角從應用層面移到系統層面呢?
我以個人Mac爲例,這不有現成的通知中心麼?
可謂是柳暗花明又一村,老胡我這招隔山打牛,姿式還能夠吧?
如今問題很明確了:
我背靠操做系統老大,如今還懼怕你幾個小應用,一塊兒上,我哭算我輸。
在操做系統的領域內,這個方案就是武俠世界的九陽神功,還配上了屠龍刀,可謂:十步殺一人,千里不留行。
調研結束。
解決方案確立了,接下來無非就是驗證加實現,這裏仍是以Mac
爲例。
來來來,看看蘋果的系統中心好很差攻佔,首先,咋們來確立系統中心數據的存儲方式,進入終端:
cd `getconf DARWIN_USER_DIR`/com.apple.notificationcenter/db2
ls
db db-shm db-wal
複製代碼
能夠看到,有三個文件,哎,好熟悉,SQLite
唄。
打開:
分別有如下幾個表:
可能有點多,但咱們只須要關注兩個表就行:
建表語句分別以下:
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表的這行,能夠看到微信應用的id
是35
。
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'}
複製代碼
搞定收工,有興趣歡迎關注個人公衆號: