很多朋友想了解關於微信聊天記錄同步的一些資料信息,下麵是(揚升資訊www.balincan8.com)小編整理的與微信聊天記錄同步相關的內容分享給大家,一起來看看吧。
本文轉自:老胡的儲物櫃(公眾號),已獲得作者授權。
在我日常工作中,我會將各種互聯網以及生活中產出的信息匯總到Bear,再通過Bear的雲同步使我各個終端的信息保持一致。
以前在使用有道雲筆記的時候,有個功能我很喜歡,就是當看到一篇想收藏的文章的話,就可以直接右上角發送到有道雲筆記,如下圖:
順便一提:熊掌記是一款優雅、靈活的寫作筆記應用。
回到正題,我現在麵臨的需求是能不能在看到喜歡的文章的時候,也通過類似於右上角分享一下就可以直接將文章同步到我各個終端上的Bear,最終成果如下:
要實現上述的需求,我大概思考了如下的解決方案:
1) 準備一個微信號(這裏直接稱作小號)專門接收待收藏到Bear的文章
2) 編寫一個服務監控小號的消息,比如收到推文類型的消息就進行內容提取
3) 監控服務將提取後的內容發送到Bear(這裏要求服務運行在Mac OS上)
所以在繼續之前,你需要有以下條件:
•基本的Python基礎知識(寫小腳本Python真的很方便)•一台裝有Bear的Mac OS
方案調研上麵的解決方案看起來還是挺好實現,第一步不用多說,這年頭誰沒個小號,第二點的話,我印象中Python是有個第三方庫可以直接監聽微信對應賬號的消息。
因為這些第三方庫都是基於Web版的微信,所以在使用之前我想驗證下此方案是否可行,剛準備登錄網頁版微信,就直接提示:
errorret1203/retmessageTo protect your account, logging in to WeChat via the web has been suspended. Use WeChat for Windows or WeChat for Mac to log in on a computer. Download WeChat for Windows or Mac at http://wechat.com./message/error果不其然現在微信準備加強Web版本的限製了,心裏涼涼的,第二步還沒開始就已經被宣判刑。
隻能換個思路了,怎麽辦。其實這一步走不通我還是能接受的,因為我一直覺得依賴Web版總有一天會掛掉,畢竟多了個依賴總是會增加複雜度。
能不能依靠客戶端?
我們知道,微信數據是有同步功能的,開發過客戶端的都知道,這就意味著微信的數據必然保存一份在客戶端本地係統上。
所以對於第二點的解決思路就轉換成了如何獲取微信保存在客戶端本地的數據,找到某個軟件的數據文件夾自然是很簡單的事情,比如微信客戶端的數據就存放在:
# howie6879是我的用戶名,請自行替換/Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9具體有如下目錄:
├── 988eebd1078a0d794bff2b6f5c8d5176├── Avatar├── CGI├── CrashReport├── KeyValue├── MMResourceMgr├── checkVersionFile├── d41d8cd93400b204e9800998ecf8427e├── f965739b566114f907dc394322e1e826├── topinfo.data├── upgradeHistoryFile├── whatsNewVersionFile└── wx.dat8 directories, 5 files不知道上麵那三個32位的字符串大家看起來熟悉不熟悉:
一想到32,就是md5加密,我第一反應就是對於每個登錄賬號的id加密值,我們先不管,直接進去看更深一層的文件夾:
├── Account├── Avatar├── Contact├── Favorites├── FileStateSync├── FunctionMsg├── Group├── Message├── RevokeMsg├── Session├── Stickers├── Sync├── complexSearch├── mmexpt└── newabtest15 directories, 0 filesMessage出來了,這是不是我們想要的呢?再往下看裏麵的目錄:
├── MessageTemp├── fts├── msg_0.db├── msg_0.db-backup├── msg_0.db-shm├── msg_0.db-wal├── msg_1.db如果你登錄過該台電腦並同步過信息,那麽不出意外會有挺多*.db後綴的文件。大膽地猜測一下,這是不是我們想要的聊天數據存放路徑呢?
不要管太多,先看看總不會錯,一般本地存儲的數據庫,咱們程序員第一反應應該就是SQLite,要不要試試?
sqlite3 Message/msg_0.dbsqlite .schemaError: file is not a databasesqlite??提示不是數據庫,此時陷入了瓶頸,怎麽就不是數據庫了呢。反思一下,是不是打開的姿勢不對。
會不會是加密了?依照這個思路,我了解到有一款基於SQLite的擴展數據庫SQLCipher[1],SQLCipher是一個在SQLite基礎之上進行擴展的開源數據庫,它主要是在SQLite的基礎之上增加了數據加密功能。
實踐證明,我猜想的是對的,接下來主要做的怎麽打開Message/msg_0.db這個文件並成功讀取裏麵的數據。
最後我參考到一份有意思的問答,我就是參考這個問答[2]對數據庫進行解密,這裏我複述一下:
•打開微信,但是先不登錄•打開終端,輸入lldb -p $(pgrep WeChat)•會看到進入了lldb,然後輸入br set -n sqlite3_key,按回車•在lldb中,輸入c,按回車•打開微信並掃碼登錄•然後回到lldb中,輸入memory read --size 1 --format x --count 32 $rsi
此時就會得到以下類似的輸出:
0x600003888340: 0xd1 0x05 0x29 0x04 0x75 0xc5 0x45 0x050x600003888348: 0x92 0x26 0xa1 0x65 0x95 0xe5 0x15 0x3f0x600003888350: 0xf3 0xc7 0x43 0x85 0x05 0x35 0x45 0x3d0x600003888358: 0x84 0xc8 0x64 0xe5 0x35 0x65 0x45 0xe2去掉冒號前麵的那一串,後麵是四行八列的數據,再去除掉0x、空格、\n等,就會得到一串64位的字符串,舉個例子:
df012f587cc546000025a56599e81530f9cc49800329423d8ec460e1386549e2這就是我們進入數據庫的鑰匙,接下來,請安裝sqlcipher的相關軟件,如:
brew install sqlcipherbrew cask install db-browser-for-sqlite讓我們用db-browser-for-sqlite打開db後綴的文件看看有什麽不一樣吧:
點擊OK,成功打開!
隨便進入一個表:
很顯然,我們成功獲取了本地的聊天記錄,總算將第二步流程打通了,如今我們可以監控發送收藏文章的微信賬戶的聊天記錄,隻要收到此賬號發來的推文消息,此時監控服務可以立馬反應過來並解析發送到Bear。
有個小問題,怎麽知道發推文的賬號在哪個庫哪個表呢?可以這樣看,在電腦上登錄發推文的賬號,打開文件``:
cd /Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/988eebd1023a0d794bff2b6f5c8d5176/Accountcat userinfo.data大概輸出如下:
":BHPpx127417592694754732wxid_epXXXXXXXfj12 Howie6879老胡的儲物櫃這裏很明顯我的wxid就是:wxid_epXXXXXXXfj12,那麽對應需要監控的表名就是:Chat_md5(wxid_epXXXXXXXfj12),形式如同這樣
Chat_f965739xxxx114fxxxxc394322exxxx隨後實現在庫裏麵找到對應的表即可,我本機發現對應賬戶的表存在於庫 msg_5.db中。
接下來要做的事情就很簡單了,就是將提取後的內容發送到Bear,這裏可以利用X callback url Scheme documentation[3],比如你在終端輸入:
open 'bear://x-callback-url/create?title=Test%20Beartext=Hello%20Bear'立馬就可以看到Bear自動建立了一篇筆記
編碼實現終於到了編碼階段,好心酸:
第一步,拿到必須要的常量:
•S_ACCOUNT_ID:微信發送賬戶ID,可以在Account/userinfo.data下查看•R_ACCOUNT_ID:微信接收賬戶ID,同上•RAW_KEY:解密Key,就是上麵介紹的64位字符串•DB_PATH_TEM:定義的是消息DB路徑,比如:"/Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/{0}/Message/"
定義這四個常量,接下來的事情就一帆風順了哈,我將項目開源在Github,地址見w2b[4],接下來我直接說說怎麽用:
git clone https://github.com/howie6879/w2bcd w2b# 推薦使用pipenv 你也可以使用自己中意的環境構建方式pipenv install --python=/Users/howie6879/anaconda3/envs/python36/bin/python3.6 --skip-lock# 運行前需要填好配置文件pipenv run python w2b/run.py隨後,會有日誌輸出:
[w2b] pipenv run python w2b/run.py Loading .env environment variables…[2019:09:13 09:16:35] INFO w2b 目標表 Chat_f965739b676114fxxxxc394322e1e826 存在於庫 msg_5.db好,代碼跑起來後,接下來電腦上登錄你的小號(也就是接收微信文章的微信號),然後在手機上登錄發送文章的微信號,最終成功就和文章一開始的動圖一樣了~
如果覺得對你有幫助,點個好看然後幫忙轉發一下吧。
References[1]SQLCipher:[https://github.com/sqlcipher/sqlcipher](https://github.com/sqlcipher/sqlcipher
[2]問答:https://www.v2ex.com/t/466053#reply15
[3]X callback url Scheme documentation:https://bear.app/faq/X-callback-url%20Scheme%20documentation/
[4]w2b:https://github.com/howie6879/w2b
文末送書活動
活動規則大家請一定要查看,點擊這篇推文哦:從今天起,每天至少送大家一本書
這篇推文的福利贈書是:《Python 數據科學入門》,送給本篇文章點讚最多、且符合活動要求的精選留言者。
回複下方「關鍵詞」,獲取優質資源
回複關鍵詞「 pybook03」,立即獲取主頁君與小夥伴一起翻譯的《Think Python 2e》電子版
回複關鍵詞「入門資料」,立即獲取主頁君整理的 10 本 Python 入門書的電子版
回複關鍵詞「book 數字」,將數字替換成 0 及以上數字,有驚喜好禮哦~
題圖:pexels,CC0 授權。
本文到此結束,希望對大家有所幫助呢。