520小玩意之Python詞雲:導出與女票的微信聊天記錄並分析

用python看看自己和女票都聊了些什麼事

最終效果圖:
在這裏插入圖片描述

一、導出微信聊天文件

寫2種導出聊天記錄的方法:一種是Mac版微信,另一種是iOS版微信。

1.導出Mac版微信聊天記錄

Mac版微信在本地存放了聊天記錄的數據庫,數據庫使用的是開源的 sqlcipher加密了裏面的數據。在終端輸入下面命令,可以查看這些數據庫的路徑。

	ls -alh ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/*/*/Message/*.db

利用lldb可以解密這些數據庫方法如下:

  1. 打開微信

  2. 命令行運行 lldb -p $(pgrep WeChat)

  3. 在 lldb 中輸入 br set -n sqlite3_key, 回車

  4. 還是在 lldb 中,輸入 c, 回車

  5. 掃碼登錄微信

  6. 這時候回到 lldb 界面, 輸入memory read --size 1 --format x --count 32 $rsi, 回車

  7. 應該會輸出類似於如下的數據

    	0x6000009736e0: 0x05 0x41 0x59 0x3d 0xc6 0xe5 0x47 0x73
    	0x6000009736e8: 0x84 0x1e 0xb3 0xa9 0xd9 0x29 0x77 0x31
     	0x6000009736f0: 0x58 0xc0 0x1a 0x6c 0x66 0xaf 0x43 0x4c
     	0x6000009736f8: 0xac 0x1f 0x6f 0x03 0x9b 0x7e 0xc1 0xfa
    
  8. 把數據從左到右,從上到下,把形如 0xab 0xcd 的數據拼起來,然後去掉所有的 "0x"和空格、換行, 得到 64 個字符的字符串,例如0541593dc6e54773841eb3a9d929773158c01a6c66af434cac1f6f039b7ec1fa,這就是 微信數據庫的 key.

  9. 然後, 可以下載個 https://sqlitebrowser.org ,用來瀏覽之前提到的*.db 文件(每個 db 都使用的相同的 key ),注意:打開數據庫的時候選擇(raw key), 然後輸入 0x,再輸入剛纔那 64 個字符

  10. 打開後如下:
    在這裏插入圖片描述
    在這裏插入圖片描述

  11. 然後找到與女票的那個表單,導出聊天內容爲csv文件
    在這裏插入圖片描述

2.導出iOS手機微信聊天記錄

手機上數據庫是加密的,但是手機備份出來的卻是明文的數據,所以我們直接用最簡單的,從備份拿數據,我這裏用愛思助手搞了。

  1. 打開愛思助手然後點擊 工具箱->備份/恢復數據->選擇全備份,然後等幾分鐘備份完成,打開全備份文件管理。
    在這裏插入圖片描述
  2. 點擊立即查看在這裏插入圖片描述
  3. 列表有一個AppDomain-com.tencent.xin的文件夾 ,進入之後愛思能直接查看微信聊天記錄
    在這裏插入圖片描述
    4.選擇聊天記錄導出就可以了。在這裏插入圖片描述

二、Python + jieba + wordcloud

聊天記錄有了,就可以分詞生成詞雲了,直接上代碼

import csv, jieba, re
from itertools import islice
import pandas as pd
import imageio
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator, wordcloud


# 從導出的csv格式聊天記錄中提取中文存入txt文件中
def csv_to_txt():
    chat_csv = open("wechatliaotian.csv","r",encoding="utf-8") #chatlog.csv 改成自己的聊天記錄文件名
    my_chat = csv.reader(chat_csv)
    fp = open("newChat.txt", "w+", encoding="utf-8")
    for line in islice(my_chat, 1, None):
        if re.search("[\u4e00-\u9fa5]", line[0]) and len(line[0]) < 50:
            fp.write(line[0])
            fp.write("\n")
    fp.close()

# 處理txt文件
def txt_to_format():
    fp = open("chat.txt", "r", encoding="utf-8")
    newFp = open("newChat.txt", "w", encoding="utf-8")
    for line in fp.readlines():
        curLine=line.strip().split("           ")
        if(len(curLine) == 4):
            newFp.write(curLine[3] + "\n")
    fp.close()
    newFp.close()

# 對聊天記錄文件進行分詞
def cut_words():
    # 把聊天內容讀取給content
    fp = open("newChat.txt", "r", encoding="utf-8")
    content = fp.read()
    fp.close()
    jieba.load_userdict("dict.txt")  # 載入自定義詞典(格式:一個詞佔一行;每行分爲:詞語、詞頻(可省略)、詞性(可省略),用空格隔開)
    words = jieba.cut(content, cut_all=True)  # 進行分詞,模式:精確模式
    word_L = []  # 把分詞結果存入word_L中
    # 加載停用詞
    with open("stopwords.txt", 'r', encoding="utf-8") as ss:
        stopwords = ss.read()
    # 把符合的詞語存入word_L中
    for word in words:
        if word not in stopwords and word != '\n' and len(word) > 1:
            word_L.append(word)
    return word_L

# 生成詞雲
def word_cloud(words):
    # 對分詞結果進行頻率統計再轉換成字典
    count_word_df = pd.DataFrame({"word":words}).groupby(["word"]).size()
    count_word_dt = count_word_df.to_dict()
    mk = imageio.imread('my_pic.jpg')  # 設置詞雲形狀
    mk_color = ImageColorGenerator(mk)  # 設置詞雲顏色
    # 配置詞雲參數
    wx_wc = WordCloud(
        background_color="white",  # 如果是透明背景,設置background_color=None
        mode="RGB",  # 如果是透明背景,設置mode="RGBA"
        mask=mk,  # 詞雲形狀
        font_path="/System/Library/Fonts/Songti.ttc",  # 字體可以更改爲自己喜歡的字體
        # scale=3,  # 如果輸出圖片大小不滿意,則修改此值
    )
    wx_wc = wx_wc.generate_from_frequencies(count_word_dt)  # 把帶頻率的分詞結果導入詞雲
    wx_wc.to_file("wordcloud.png")  # 輸出詞雲圖片,未設置顏色

    # plt輸出圖片
    plt.axis("off")  # 關閉座標軸
    plt.imshow(wx_wc.recolor(color_func=mk_color)) # 設置顏色
    plt.savefig('pltwordcloud.png', dpi=400)  # 輸出詞雲圖片,以原圖片爲背景色


def run():
    # csv_to_txt()
    txt_to_format()
    words = cut_words()
    word_cloud(words)
#
if __name__ == "__main__":
    # txt_to_format()
    run()

如果是導出的csv文件就執行csv_to_txt()方法。是愛思助手導出的txt文件就調用txt_to_format()方法。

三、demo地址

demo地址:
bd雲盤:https://pan.baidu.com/s/1Wp7bxyxjOyITa38coX9TYw
密碼:9bwv

如有幫助,關注,點贊,收藏來一套,有問題可留言解決。

@end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章