任務(wù):獲取自己和朋友A的全部微信聊天記錄,并做簡單的數(shù)據(jù)分析統(tǒng)計(如下圖所示的一些數(shù)據(jù))
根據(jù)聊天內(nèi)容生成的詞云
每個小時段的消息個數(shù)分布瓶摆,可見夜里微信消息過多拴清,熬夜的元兇找到了
每個月的消息個數(shù)
任務(wù)分析
整體任務(wù)分為兩個大步驟事期,獲取聊天記錄和數(shù)據(jù)統(tǒng)計轧房。數(shù)據(jù)統(tǒng)計比較容易,畢竟網(wǎng)上有很多教程可以借鑒逐虚。最麻煩的是第一步——獲取聊天記錄聋溜。
微信官方不提供聊天記錄的文本導(dǎo)出方法。我們要想獲取聊天記錄叭爱,最直接的方法就是一條條復(fù)制到txt文檔里撮躁,但這個方法太笨,不適合聊天記錄特別多的情形买雾。在網(wǎng)上一番檢索把曼,踩過一些坑后杨帽,終于成功導(dǎo)出。在這里把過程記錄一下嗤军。
思路是這樣的:手機端的微信會把消息記錄存在一個數(shù)據(jù)庫文件(EnMicroMsg.db)中注盈。但這個文件加了密,需要密碼才打得開叙赚。幸運的是老客,密碼能夠被計算出來。
密碼的計算需要兩個號碼:一個是微信所用手機的串號IMEI(15-17位數(shù)字)震叮,另一個是微信的用戶信息號(也就是uin胧砰,一般8-10位數(shù)字)。這兩個號碼按先IMEI后uin的順序首尾拼在一起(中間不加任何字符)形成一個23~27位數(shù)字苇瓣。對這長串?dāng)?shù)字做32位的MD5尉间,得到的結(jié)果取前七位,就獲得了數(shù)據(jù)庫文件的密碼击罪。
注意:這里有個坑哲嘲,網(wǎng)上都沒有說,這七位中的大寫字母一定要轉(zhuǎn)化成小寫字母才行媳禁!
獲取微信聊天記錄
從前面分析可知眠副,要獲取微信聊天記錄,需要集齊三大法器: 數(shù)據(jù)庫文件(EnMicroMsg.db)损话、手機IMEI和微信uin侦啸。但手機沒有root的話槽唾,這三個法器也沒法直接獲取丧枪,只能借助手機模擬器才行。這里采用藍(lán)疊模擬器來說明整個步驟庞萍。
-
借助PC微信客戶端將聊天記錄導(dǎo)入模擬器
-
備份聊天記錄到PC
先打開PC微信客戶端拧烦,將需要獲取的聊天記錄備份到PC上
備份聊天記錄至電腦
備份聊天記錄至電腦 -
恢復(fù)聊天記錄至模擬器的微信app
打開藍(lán)疊模擬器,安裝微信app钝计,然后登陸自己的賬號恋博,導(dǎo)入聊天記錄,這樣藍(lán)疊就有了完整的聊天記錄數(shù)據(jù)庫文件
導(dǎo)入聊天記錄
-
-
打開模擬器root權(quán)限
獲取Root權(quán)限私恬,這樣才能獲得上面三個信息
- 獲取數(shù)據(jù)庫文件EnMicroMsg.db
-
打開文件管理器
re.png -
數(shù)據(jù)庫的文件路徑
數(shù)據(jù)庫就在這個都是數(shù)字的文件夾里
數(shù)據(jù)庫文件 -
復(fù)制數(shù)據(jù)庫到自己的PC
藍(lán)疊模擬器中债沮,將文件復(fù)制到sdcard下,然后點擊上面的Export to Windows即可復(fù)制到自己的PC
-
- 獲取模擬的串號IMEI
網(wǎng)上很多方法都不靠譜本鸣,最簡單有效的一招就是在模擬器上安裝獲取IMEI的app疫衩,打開這個app就能知道IMEI
-
獲取uin
在這個文件下,好多文件里都會有uin荣德,例如下面這個文件闷煤,里面有個uin_id的8-10位數(shù)字童芹,記錄下來
打開這個文件,能夠找到uin
-
計算密碼
打開密碼計算小工具鲤拿,將IMEI和uin輸入左側(cè)方框假褪,中間不要有任何字符,中間選擇32位小近顷,右側(cè)得到結(jié)果的前七位就是密碼
md5一定要小寫的才行 讀取數(shù)據(jù)庫的小工具
有了數(shù)據(jù)庫和密碼生音,還需要安裝一個讀取數(shù)據(jù)庫的工具——sqlcipher.-
導(dǎo)出聊天記錄
用sqlcipher打開EnMicroMsg.db,會提示輸入密碼窒升,然后就能看到數(shù)據(jù)庫內(nèi)容
導(dǎo)出聊天記錄
表選擇message 導(dǎo)入excel久锥,導(dǎo)出xlsx
上面生成的csv文件,如果直接用python讀取的話异剥,會有很多問題(可能是編碼格式的問題)瑟由,我是先用excel打開csv,另存為.xlsx文檔冤寿,這樣方便后面python讀取
數(shù)據(jù)分析
這一部分就不多講了歹苦,詞云是借用了詞云生成方法的代碼。聊天時間分布統(tǒng)計利用了pandas庫督怜,這個我也是第一次用殴瘦,拙劣的代碼如下
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
excel_path = 'wx.xlsx' #上面第9步,生成的excel文件
dateparse = lambda x: datetime.datetime.fromtimestamp(int(x)/1000) if x else None # 導(dǎo)出來的時間戳比正常的多了3個0号杠,這點要注意
df = pd.read_excel(excel_path, parse_dates=['createTime'], date_parser=dateparse)
fc = df['content'].groupby(df['createTime'].dt.hour).count() # hour 表明按照小時 統(tǒng)計聊天頻率
fc.index = fc.index.astype('int') #將橫坐標(biāo)轉(zhuǎn)化為整數(shù)型
############ 繪圖 ###################
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號
plt.rcParams['font.size']=23
plt.figure(figsize=(20, 10))
ax = fc.plot(kind='bar',color='#66cccc')
ax.set_facecolor('#eeeeee')
ax.grid(True, linestyle='-.')
ax.tick_params(axis='x',labelcolor='#66cccc', labelsize='large', width=3)
ax.tick_params(axis='y',labelcolor='#66cccc', labelsize='large', width=3)
ax.set_xlabel(u"小時",color='#66cccc')
ax.set_ylabel(u"微信消息個數(shù)",color='#66cccc')
ax.set_title(u'微信聊天數(shù)據(jù)統(tǒng)計',color='#66cccc')
plt.show()