一次有趣的嘗試
前言#
眾所周知,微信聊天數據庫是加密的,但並不是無法解密。
目前主流的獲取微信聊天記錄的方法是用已 ROOT 的手機提取;第二種為通過 Apple iTunes 備份(非加密,非侵入式備份然後獲取)。
這裡所說的兩種辦法網上都有很多文章,感興趣的讀者可以搜索看,我不在累敘這個過程,此文章主要說明一種侵入式的,PC 客戶端可以做到的方法。
过程:#
微信聊天記錄存儲在數據庫中,格式為 sqlite,也就是後綴為 DB。
但是加密了,所以需要先獲取到解密密鑰。解密密鑰的獲取一般都是在內存中,所以需要微信在登錄狀態下才能獲取到。
解密數據庫:#
微信數據默認情況下位於 C:\Users\xxx\Documents\WeChat Files\,而聊天記錄數據庫位於該目錄下面的 wxid_xxxx\Msg\Multi。聊天記錄文件命名一般是 MSG.db,超出 240MB 會自動生成 MSG1.db,以此類推
參考 GitHub 腳本利用:https://github.com/0xlane/wechat-dump-rs
目前我的微信版本是 3.9.7.25,到這個版本都是可以解密的,作者更新的基址也同樣有效。
執行 - a 之後應該會在 temp 目錄生成一個不加密的 MSG.db 文件。
可以用 navicat 之類的打開。
聊天記錄部分是存在與 MSG 表裡,大概如下:
需要關注的字段有:
strtalker: 發送人微信 iD
StrContent:消息關鍵字
不知道 ID 怎麼辦 也很簡單 全局搜索你曾經發送過的聊天記錄,找到後篩選該值的所有匹配,
然後使用轉儲即可,我這裡建議轉儲到 xlsx 表格裡面。
到表格裡面就更簡單了,篩選出 StrContent 那一行到 TXT 裡面,去除所有的字符和英文即可(並不嚴謹)
我是用了 python 處理了表格,參考代碼如下:
import pandas as pd
import re
# 讀取表格數據
df = pd.read_excel('cy.xlsx', sheet_name='Sheet1')
# 定義函數去除非中文字符
def remove_non_chinese(text):
pattern = re.compile(r'[^\u4e00-\u9fa5]') # 匹配非中文字符的正則表達式
return re.sub(pattern, '', str(text)) # 使用正則表達式替換非中文字符為空字符串
# 應用函數去除非中文字符
df['yue'] = df['yue'].apply(remove_non_chinese) # 將'column_name'替換為你要處理的列名
# 保存處理後的表格數據到新的Excel文件
df.to_excel('processed_file.xlsx', index=False) # 將'processed_file.xlsx'替換為你想要保存的文件名
print("處理後的表格數據已保存到 processed_file.xlsx 文件中。")
處理後的結果大概是這樣的,比如我的聊天記錄:
統計詞頻並分詞#
分詞需要用到中文停詞表,我這裡使用的哈工大的停詞表
該項目地址如下:https://github.com/goto456/stopwords/blob/master/hit_stopwords.txt
提供一個分詞代碼:
import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from collections import Counter
# 讀取文檔數據
df = pd.read_excel('processed_file.xlsx', sheet_name='Sheet1')
# 去除無效的空行數據
df = df.dropna(subset=['yue']) # 將'column_name'替換為你要處理的列名
# 獲取文檔內容
documents = df['yue'].tolist() # 將'column_name'替換為你要處理的列名
# 加載中文停用詞表
with open('hit_stopwords.txt', 'r', encoding='utf-8') as file:
stop_words = [line.strip() for line in file]
# 分詞和去除停用詞
tokenized_documents = [word_tokenize(doc) for doc in documents]
filtered_documents = [[word for word in doc if word not in stop_words] for doc in tokenized_documents]
# 計算詞頻
word_frequencies = Counter([word for doc in filtered_documents for word in doc])
# 創建詞頻DataFrame
df_word_freq = pd.DataFrame(list(word_frequencies.items()), columns=['詞語', '詞頻'])
# 按詞頻降序排序
df_word_freq = df_word_freq.sort_values(by='詞頻', ascending=False)
# 保存結果到新的Excel文件
df_word_freq.to_excel('word_frequencies.xlsx', index=False)
print("詞頻結果已保存到 word_frequencies.xlsx 文件中。")
結果如下:
哈哈哈哈,還挺快樂的。
生成詞雲#
網上有很多項目可以生成詞雲,但是我找來找去沒找到合適的,適合中文的,用了一個線上的服務,感興趣的可以自行斟酌使用線上服務,如果有好的詞雲分析的可以留言推薦給我。
大概內容如下:
說明我們之間聊天真的很有意思,每天都是哈哈哈(bushi。
End#
再次感謝文章提到的所有作者和參考代碼。
祝大家生活愉快,每天有愛。