1. 程式人生 > >從安卓手機ROOT提取微信聊天記錄到利用Python進行詞雲分析全過程

從安卓手機ROOT提取微信聊天記錄到利用Python進行詞雲分析全過程

剛剛來到了2018年,正值女票生日將近。想想這一年來我倆的聊天記錄也不少(匯出後一看十個月的微信文字聊天記錄將近8萬條 ^-^),於是就有了將我們的聊天記錄匯出來製作成詞雲,或者分析一下她說的最多的一句話是什麼?還打算做個預測模型,輸入一個句子然後讓模型預測下是她說的還是我說的,哈哈,想想還有點小激動呢。其中的一個難點在於微信的聊天記錄不能直接匯出,需要手機root後再用資料庫解密才行,由於以前對手機root不熟悉,什麼線刷、卡刷、成磚等概念也略模糊,這個過程也是我花時間最長的地方。加班加點一共折騰了兩天,總算是有點小成果,下面跟大家分享一下這個過程中踩過的坑以及整個流程,相信能給以後有這種想法的人一點借鑑。第一次寫,不喜勿噴。

目錄

 

 

1.手機ROOT

首先宣告,本人所用的手機型號為華為榮耀8 FRD-AL10。其他型號的安卓機root過程請自行百度,root完成後再接著看後面幾節的內容。以下為ROOT五部曲,其他的安卓機大同小異。

1.1備份!

要root的同學注意了!一旦你有了要root 的想法,在動手之前一定要先備份。用資料線將手機連線電腦,開啟開發者模式的usb除錯(找不到開發者模式的在 系統設定->關於手機->版本號 處狂戳即可)。然後用華為手機助手備份通訊錄、APP資料、相簿等。如下圖 


 

誰說解鎖不會清空手機所有資料的!我會跟你說我就是以為解鎖不會清空資料所以導致手機所有資料都沒了嗎?沒了嗎?了嗎?嗎? 
那有人就會說了,資料都被清空了還分析個p啊,洗洗睡吧!幸虧我剛好在微信電腦客戶端備份了和女票了聊天記錄,而且只備份了她的,導致損失一下子降到百分之十了,哈哈。有朋友想問微信聊天記錄在哪備份的,見下圖(備份與恢復那) 


這裡寫圖片描述

 

1.2 獲取解鎖碼

首先宣告一下,解鎖可能會讓你的手機失去保修,慎重考慮! 
華為手機想要root要先解鎖,點選解鎖地址後,用華為賬號登入,點選同意協議並下一步,這裡要輸入手機相關的資訊來獲取解鎖密碼。 


 

如果你的手機系統已經升級到最新版本(EMUI5.0之後),請在第一項做相應的選擇。之後的序列號等都很容易填,不會填的點相應文字框後面的如何填寫即可。 
點選提交後便可得到十六位解鎖密碼。

1.3 華為手機助手將系統回退到可以root的系統版本

在解鎖前,請確保你的手機系統版本是支援root的,一般如果你已經升級到最新版的系統,那是不能root的,需要將系統回退到可以root 的舊版本。以下是目前可root的系統版本號。 


 

切記!如果你的系統不在這上面,那就先做系統回退,再解鎖!否則,你還得重新上鎖做系統回退再解鎖。。。可憐的我就是這樣子白費了好多功夫。。 
接下來是怎麼做系統回退,我是將系統回退到圖中的EMUI 5.0 B368。 


 

系統回退在華為手機助手電腦端:系統更新->切換到其他版本->恢復 這樣它會退到剛買的新手機時的版本,之後我們同樣在系統更新這裡再將其升級到5.0 B368版本。 


 

 


 

 


 

1.4 下載fastboot並解鎖

先下載adb 工具包連結在這,然後按照官網解鎖教程一步一步解鎖即可。 
在cmd中要先用cd命令進入adb工具包的資料夾裡。 


 

1.5 用YoRoot_V1.1一鍵root

一鍵root的教程請移步這裡,這裡說的很清楚明白。當然,有些人在這裡一下就成功了,有些人在這會出現各種莫名的問題,我就屬於後者,各位就各安天命,如果實在有解決不了的問題,那就花點錢請人幫忙吧。在這隨便展示幾張圖僅供參考 


 


 

 


 

僅針對榮耀8的手機root部分就講到這了,以下部分就是通用的了。

2.提取微信聊天記錄並匯出

這部分參考知乎上DADAman的高票回答來做。但是!其中有一些坑我說一下,供各位參考。

2.1 首先

針對評論中提到的新版微信的uin存放的資料夾改變的事,我覺得在Chrome採用抓包的檢視方式更方便,請看這裡

2.2 其次

有相當相當多的人在評論中提到,通過IMEI和UIN得到的資料庫密碼不對!如下圖,這個問題我也糾結了好久好久,看到下圖,一開始我以為IMEI和UIN之間要用“-”分隔。實際上,原來樓主的uin是負數,所以造成了這種假象,我們要做的只需要把兩者直接連到一起,中間不需要任何分隔符。 
這裡寫圖片描述

2.3 最後

原文中的sql語句只能顯示結果,並不能匯出到csv或者txt檔案。評論中有相當一部分人煩惱這個問題。經過探索,我發現要將查詢語句換成建立表的sql語句,程式碼如下:

create table 聊天記錄 as select datetime(subStr(cast(m.createTime as text),1,10),'unixepoch', 'localtime') as theTime,
case m.isSend when 0 then r.nickname when 1 then '我'end as person,
m.content
from message m inner join rcontact r
on m.talker = r.username
where m.type=1 and r.nickname='對方微信暱稱';

執行之後就會建立“聊天記錄”這個表,通過 File->Export->Table as csv File 找到“聊天記錄”並匯出。 
這裡寫圖片描述

3.用Python製作詞雲

直接上code,不解釋。 
額,還是說明一下,由於聊天記錄中不僅有文字,還有各種奇怪的表情符號,因此,‘gbk’不能解碼時,可以用解碼能力更廣的‘gb18030’解碼。

3.1 探索資料

首先,匯入pandas解析上一節匯出的聊天記錄 
這裡寫圖片描述

接下來,來看看我們說的最多的話和次數 -^–^- 
帶有中括號的表示表情符號 
“。。。”居然說的比晚安還多,我擦 


 

還好有些話就說了1次,嚇死寶寶了。。

 


 

好啦,不逗比了,開始製作詞雲吧

3.2 準備工作

製作詞雲需要引入wordcloud包和中文分詞包jieba。不會安裝的看這裡。jieba安裝更簡單,直接輸入:pip install jieba

###將各自的話分開儲存####
df1 = df[df.person=='我']
df2 = df[df.person=='Pluto']
df1.content.to_csv('MyWords.txt',index=False)
df2.content.to_csv('HerWords.txt',index=False)

####自定義詞雲色調#########
#自定義調色調的
from numpy import  *
def color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    """
    :param word:
    :param font_size:
    :param position:
    :param orientation:
    :param random_state:
    :param kwargs:
    :return:
    Description:
        調配詞雲中文字的顏色
    """
    return "hsl(210, 100%%, %d%%)" % random.randint(10, 80)  # 這裡以藍色為基本色調

3.3 生成詞雲

###生成她的詞雲###############
from wordcloud import WordCloud,ImageColorGenerator
import codecs
import jieba.finalseg
#import jieba.analyse as analyse
from scipy.misc import imread
import os
from os import path
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont


# 繪製詞雲
def draw_wordcloud():
    #讀入一個txt檔案
    comment_text = open('HerWords.txt','r',encoding='utf-8').read()
    #結巴分詞,生成字串,如果不通過分詞,無法直接生成正確的中文詞雲
    cut_text = " ".join(jieba.cut(comment_text))
    #d = path.dirname(__file__) # 當前檔案資料夾所在目錄
    color_mask = imread("愛心.jpg") # 讀取背景圖片
    cloud = WordCloud(
        #設定字型,不指定就會出現亂碼
        #font_path="hwxk.ttf",
        font_path = 'C:/Users/Windows/fonts/msyh.ttf',
        #font_path=path.join(d,'simsun.ttc'),
        #設定背景色
        background_color='white',
        #詞雲形狀
        mask=color_mask,
        #允許最大詞彙
        max_words=2000,
        #最大號字型
        max_font_size=40
    )
    #print(cut_text)
    word_cloud = cloud.generate(cut_text) # 產生詞雲
    word_cloud.to_file("herWordCloud.jpg") #儲存圖片
    #  顯示詞雲圖片
    plt.imshow(word_cloud)

    #使詞雲顏色跟背景圖片顏色一致
    img_color = ImageColorGenerator(color_mask)
    #word_cloud_color = cloud.recolor(color_func=img_color) #圖片色調
    word_cloud_color = cloud.recolor(color_func=color_func) #自定義色調
    plt.imshow(word_cloud_color)
    word_cloud_color.to_file("herWordCloud_color.jpg")

    plt.axis('off')
    plt.show()
draw_wordcloud()
########生成我的詞雲#############
from wordcloud import WordCloud,ImageColorGenerator
import codecs
import jieba.finalseg
#import jieba.analyse as analyse
from scipy.misc import imread
import os
from os import path
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont


# 繪製詞雲
def draw_wordcloud():
    #讀入一個txt檔案
    comment_text = open('MyWords.txt','r',encoding='utf-8').read()
    #結巴分詞,生成字串,如果不通過分詞,無法直接生成正確的中文詞雲
    cut_text = " ".join(jieba.cut(comment_text))
    #d = path.dirname(__file__) # 當前檔案資料夾所在目錄
    color_mask = imread("愛心.jpg") # 讀取背景圖片
    cloud = WordCloud(
        #設定字型,不指定就會出現亂碼
        #font_path="hwxk.ttf",
        font_path = 'C:/Users/Windows/fonts/msyh.ttf',
        #font_path=path.join(d,'simsun.ttc'),
        #設定背景色
        background_color='white',
        #詞雲形狀
        mask=color_mask,
        #允許最大詞彙
        max_words=2000,
        #最大號字型
        max_font_size=40
    )
    #print(cut_text)
    word_cloud = cloud.generate(cut_text) # 產生詞雲
    word_cloud.to_file("MyWordCloud.jpg") #儲存圖片
    #  顯示詞雲圖片
    plt.imshow(word_cloud)

    #使詞雲顏色跟背景圖片顏色一致
    img_color = ImageColorGenerator(color_mask)
    #word_cloud_color = cloud.recolor(color_func=img_color) #圖片色調
    word_cloud_color = cloud.recolor(color_func=color_func) #自定義色調
    plt.imshow(word_cloud_color)
    word_cloud_color.to_file("MyWordCloud_color.jpg")
    plt.axis('off')
    plt.show()
draw_wordcloud()

此處解釋一下,如果想生成特定形狀的詞雲,需要一張圖片,如程式碼中的“愛心.jpg”。該圖片必須以白色為背景,則生成的形狀為該圖非白色區域。至於怎麼得到這樣一張白色背景,特定形狀的圖片,有很多p圖軟體可以做到,比如最簡單的美圖秀秀。。。

3.4 詞雲效果

分享下我生成的幾張圖 


 

 

 


 

後面會更新利用樸素貝葉斯模型,輸入一句話預測是我說的還是女票說的,請移步這裡