為什么做這件事
現(xiàn)在無論工作、生活,通訊工具都是用的微信。尤其工作時,每天重復著大量以下動作:“鼠標點擊打開微信 - 鍵盤搜索好友 - 選擇并發(fā)起聊天”。所以就想能不能改進一下效率。
思路就是把流程化的固定步驟使用腳本自動化,具體實現(xiàn)思路有兩種:
1. 綁定快捷鍵,觸發(fā)快捷鍵后則執(zhí)行:打開微信并發(fā)起微信的搜索
2. 使用Alfred,在Alfred中搜索出微信好友并發(fā)起回話
其中思路1的方式,實現(xiàn)較為簡單。下面重要分享思路2的方式。
效果預覽

效果展示
特性
- 支持搜索聯(lián)系人
- 支持搜索微信群
- 支持模糊匹配:中文、拼音、簡拼
- 快捷打開聊天對話窗口
下載地址
https://github.com/skefy/Wechat-Workflow-for-Alfred
以下為原理解釋
流程

原理圖
實現(xiàn)
1. 獲取微信數(shù)據(jù)庫密碼
這部分是整個工作的難點,因為微信的數(shù)據(jù)庫是加密的。要想獲取密碼,需要逆向技術,幸好在網(wǎng)上找到了一篇相關文章。 文章鏈接: 點擊查看
- 其中利用到lldb,可能要安裝 Xcode 才可以。
- 微信2.3.16 和 2.3.17 版本測試成功,可以成功獲取微信數(shù)據(jù)庫密碼。
(未來新版本中可能會失效,若有更好的獲取密碼方式的同學,請通知我。)
獲取密碼過程如下:
- 重新打開微信(停在掃碼登錄界面)
- 在終端輸入命令行:
lldb -p $(pgrep WeChat)
- 上面命令會進入到 lldb 中,在lldb中輸入:
br set -n sqlite3_key
- 輸入字母 “c”, 回車
- 手機掃碼登錄微信
- 打開終端,繼續(xù)在lldb中輸入:
memory read --size 1 --format x --count 32 $rsi
得到如下結(jié)果
0x000000000000: 0xab 0xab 0xab 0xab 0xab 0xab 0xab 0xab
0x000000000008: 0xab 0xab 0xab 0xab 0xab 0xab 0xab 0xab
0x000000000010: 0xab 0xab 0xab 0xab 0xab 0xab 0xab 0xab
0x000000000018: 0xab 0xab 0xab 0xab 0xab 0xab 0xab 0xab
把左邊的第1列忽略,只復制右邊的8列。然后把里面的“0x”、空格、換行都刪除,得到一個完整的64位字符串。這個就是最后的結(jié)果了。
2. 讀取數(shù)據(jù)庫
數(shù)據(jù)庫路徑如下:
- 聯(lián)系人:~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/xxxxxxxx/Contact/wccontact_new2.db
- 微信群:~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/xxxxxxxx/Group/group_new.db
注意:要把路徑中的xxxxxxxx,是一個串隨機數(shù),每個設備下都不一樣。
數(shù)據(jù)庫讀取方式
# python先安裝pysqlcipher庫
# 好像只支持python2
from pysqlcipher import dbapi2 as sqlite
# wx_db_file_path 是微信加密數(shù)據(jù)路徑
conn = sqlite.connect(wx_db_file_path)
c = conn.cursor()
# 以下固定參數(shù)設置
c.execute( "PRAGMA cipher_page_size = 1024;" )
c.execute( "PRAGMA cipher_use_hmac = OFF;" )
c.execute( "PRAGMA kdf_iter = 4000;" )
# DB_KEY為數(shù)據(jù)庫密碼
c.execute( "PRAGMA key = " + DB_KEY + ";" )
try:
# 創(chuàng)建一個新的數(shù)據(jù)庫,密碼設置為空。
c.execute( "ATTACH DATABASE \'" + decrypted_file + "\' AS groupdecrypted KEY '';" )
# 導出微信的數(shù)據(jù)庫數(shù)據(jù)到新的數(shù)據(jù)庫
c.execute( "SELECT sqlcipher_export('groupdecrypted');" )
c.execute( "DETACH DATABASE groupdecrypted;" )
c.close()
except:
c.close()
3. Automator 操作微信
Automator可以說是Mac下的一個效率殺器,利用它可以做很多事情。編程語音支持 AppleScript 和 JavaScript,這里使用 JavaScript,因為AppleScript的語法使用起來太不習慣了。
var app = Application('微信')
var SystemEvents = Application('System Events');
if( app.running() ){
app.activate()
wx = SystemEvents.processes['微信'];
// 等待微信程序的窗口創(chuàng)建完成
if (wx.windows[0].exists() == false){
delay(0.1)
}
// 把微信的搜索框設置成focused狀態(tài)
wx.windows[0].splitterGroups[0].textFields[0].focused = true
while (wx.windows[0].splitterGroups[0].scrollAreas.length == 1 ){
delay(0.1)
}
delay(0.3)
// 微信的搜索框輸入要搜索的內(nèi)容
wx.windows[0].splitterGroups[0].textFields[0].value = "用戶昵稱"
delay(0.5)
// 輸入回車
var using = [];
SystemEvents.keyCode(36, {using: using});
}
Automator 和 APP UI 交互時,推薦一個神器:UI Browser ,可以幫忙分析 APP 的 UI 元素。UI Browser 官網(wǎng)