摘要:一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告了解你的微信社交歷史簡(jiǎn)介你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。
[TOC]
一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解你的微信社交歷史 簡(jiǎn)介你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。現(xiàn)在,我們基于python對(duì)微信好友進(jìn)行全方位數(shù)據(jù)分析,包括:昵稱(chēng)、性別、年齡、地區(qū)、備注名、個(gè)性簽名、頭像、群聊和公眾號(hào)等。
其中,在分析好友類(lèi)型方面,主要統(tǒng)計(jì)出你的陌生人、星標(biāo)好友、不讓他看我的朋友圈的好友、不看他的朋友圈的好友數(shù)據(jù)。在分析地區(qū)方面,主要統(tǒng)計(jì)所有好友在全國(guó)的分布以及對(duì)好友數(shù)最多的省份進(jìn)行進(jìn)一步分析。在其他方面,統(tǒng)計(jì)出你的好友性別比例、猜出你最親密的好友,分析你的特殊好友,找出與你所在共同群聊數(shù)最多的好友數(shù)據(jù),對(duì)你的好友個(gè)性簽名進(jìn)行分析,對(duì)你的好友頭像進(jìn)行分析,并進(jìn)一步檢測(cè)出使用真人頭像的好友數(shù)據(jù)。
目前網(wǎng)上關(guān)于這方面的數(shù)據(jù)分析文章比較多,但是運(yùn)行起來(lái)比較麻煩,而本程序的運(yùn)行十分簡(jiǎn)單,只需要掃碼登錄一步操作即可。
功能截圖# 跳轉(zhuǎn)到當(dāng)前目錄 cd 目錄名 # 先卸載依賴(lài)庫(kù) pip uninstall -y -r requirement.txt # 再重新安裝依賴(lài)庫(kù) pip install -r requirement.txt # 開(kāi)始運(yùn)行 python generate_wx_data.py如何打包成二進(jìn)制可執(zhí)行文件
# 安裝pyinstaller pip install pyinstaller # 跳轉(zhuǎn)到當(dāng)前目錄 cd 目錄名 # 先卸載依賴(lài)庫(kù) pip uninstall -y -r requirement.txt # 再重新安裝依賴(lài)庫(kù) pip install -r requirement.txt # 更新 setuptools pip install --upgrade setuptools # 開(kāi)始打包 pyinstaller generate_wx_data.py編寫(xiě)思路
首先,進(jìn)行初始化,并根據(jù)不同操作系統(tǒng),啟用微信機(jī)器人。
# 初始化所需文件夾 init_folders() # 啟動(dòng)微信機(jī)器人,自動(dòng)根據(jù)操作系統(tǒng)執(zhí)行不同的指令 if("Windows" in system()): # Windows bot = Bot(cache_path=True) elif("Darwin" in system()): # MacOSX bot = Bot(cache_path=True) elif("Linux" in system()): # Linux bot = Bot(console_qr=2,cache_path=True) else: # 自行確定 print(u"無(wú)法識(shí)別你的操作系統(tǒng)類(lèi)型,請(qǐng)自己設(shè)置") exit()
登錄完微信后,開(kāi)始獲取好友數(shù)據(jù)和群聊數(shù)據(jù)。
# 獲取所有好友 friends = bot.friends(update=False) # 獲取所有活躍群聊 groups = bot.groups()
共同所在群聊成員分析,依次對(duì)每個(gè)好友進(jìn)行檢測(cè)。
def group_common_in(): # 獲取所有活躍的群聊 groups = bot.groups() # 每個(gè)好友與你相同的群聊個(gè)數(shù) dict_common_in = {} # 遍歷所有好友,第0個(gè)為你自己,所以去掉 for x in friends[1:]: # 依次在每個(gè)群聊中搜索 for y in groups: # x在y中 if(x in y): # 獲取微信名稱(chēng) name = x.nick_name # 判斷是否有備注,有的話(huà)就使用備注 if(x.remark_name and x.remark_name != ""): name = x.remark_name # 增加計(jì)數(shù) if(name in dict_common_in.keys()): dict_common_in[name] += 1 else: dict_common_in[name] = 1
獲取微信好友頭像,以便進(jìn)一步分析。這里下載頭像比較慢,所以采取多線(xiàn)程方式進(jìn)行下載。在多線(xiàn)程中,使用隊(duì)列保存我們的頭像url,不同線(xiàn)程從隊(duì)列中獲取頭像url,并下載到本地。
# 創(chuàng)建一個(gè)隊(duì)列,用于多線(xiàn)程下載頭像,提高下載速度 queue_head_image = Queue() # 將每個(gè)好友元素存入隊(duì)列中 # 如果為了方便調(diào)試,可以?xún)H僅插入幾個(gè)數(shù)據(jù),friends[1:10] for user in friends: queue_head_image.put(user) # 啟動(dòng)10個(gè)線(xiàn)程下載頭像 for i in range(1, 10): t = Thread(target=download_head_image,args=(i,)) t.start()
其中download_head_image的具體實(shí)現(xiàn)為:
# 下載好友頭像,此步驟消耗時(shí)間比較長(zhǎng) def download_head_image(thread_name): # 隊(duì)列不為空的情況 while(not queue_head_image.empty()): # 取出一個(gè)好友元素 user = queue_head_image.get() # 下載該好友頭像,并保存到指定位置,生成一個(gè)15位數(shù)的隨機(jī)字符串 random_file_name = "".join([str(random.randint(0,9)) for x in range(15)]) user.get_avatar(save_path="image/" + random_file_name + ".jpg") # 輸出提示 print(u"線(xiàn)程%d:正在下載微信好友頭像數(shù)據(jù),進(jìn)度%d/%d,請(qǐng)耐心等待……" %(thread_name, len(friends)-queue_head_image.qsize(), len(friends)))
進(jìn)行性別、地區(qū)統(tǒng)計(jì),并將生產(chǎn)的html文件保存到本地。這里沒(méi)什么難度,所以就不詳細(xì)展開(kāi)了。
# 分析好友性別比例 def sex_ratio(): # 初始化 male, female, other = 0, 0, 0 # 遍歷 for user in friends: if(user.sex == 1): male += 1 elif(user.sex == 2): female += 1 else: other += 1 name_list = ["男性", "女性", "未設(shè)置"] num_list = [male, female, other] pie = Pie("微信好友性別比例") pie.add("", name_list, num_list, is_label_show=True) pie.render("data/好友性別比例.html")
分析你認(rèn)識(shí)的好友、最親密的人以及特殊好友。以特殊好友為例,我們將好友分為星標(biāo)好友(很重要的人), 不讓他看我的朋友圈的好友, 不看他朋友圈的好友, 消息置頂好友, 陌生人。這里分類(lèi)的依據(jù)是根據(jù)itchat中的StarFriend和ContactFlag而來(lái)的。根據(jù)經(jīng)驗(yàn)可知,StarFriend為1表示為星標(biāo)好友,ContactFlag為1和3表示好友,259和33027表示不讓他看我的朋友圈,65539和65537和66051表示不看他的朋友圈,65795表示兩項(xiàng)設(shè)置全禁止, 73731表示陌生人。
# 特殊好友分析 def analyze_special_friends(): # 星標(biāo)好友(很重要的人), 不讓他看我的朋友圈的好友, 不看他朋友圈的好友, 消息置頂好友, 陌生人 star_friends, hide_my_post_friends, hide_his_post_friends, sticky_on_top_friends, stranger_friends = 0, 0, 0, 0, 0 for user in friends: # 星標(biāo)好友為1,為0表示非星標(biāo),不存在星標(biāo)選項(xiàng)的為陌生人 if("StarFriend" in (user.raw).keys()): if((user.raw)["StarFriend"] == 1): star_friends += 1 else: stranger_friends += 1 # 好友類(lèi)型及權(quán)限:1和3好友,259和33027不讓他看我的朋友圈,65539和65537和66051不看他的朋友圈,65795兩項(xiàng)設(shè)置全禁止, 73731陌生人 if((user.raw)["ContactFlag"] in [259, 33027, 65795]): hide_my_post_friends += 1 if ((user.raw)["ContactFlag"] in [66051, 65537, 65539, 65795]): hide_his_post_friends += 1 # 消息置頂好友為2051 if ((user.raw)["ContactFlag"] in [2051]): sticky_on_top_friends += 1 # 陌生人 if ((user.raw)["ContactFlag"] in [73731]): stranger_friends += 1 bar = Bar("特殊好友分析") bar.add(name="", x_axis=["星標(biāo)", "不讓他看我朋友圈", "不看他朋友圈", "消息置頂", "陌生人"], y_axis=[star_friends, hide_my_post_friends, hide_his_post_friends, sticky_on_top_friends, stranger_friends], legend_orient="vertical", legend_pos="left") bar.render("data/特殊好友分析.html")
對(duì)好友個(gè)性簽名進(jìn)行分析,并繪制出詞語(yǔ)。這里比較復(fù)雜,首先將個(gè)性簽名列表轉(zhuǎn)化為字符串,調(diào)用nlp處理接口,對(duì)返回的數(shù)據(jù)進(jìn)行過(guò)濾。同時(shí),對(duì)短語(yǔ)進(jìn)行分詞,過(guò)濾,詞頻統(tǒng)計(jì)操作。最后,使用pyechart進(jìn)行繪制詞語(yǔ)圖。代碼中注釋非常多,基本都能看懂,所以在此也無(wú)需再詳細(xì)展開(kāi)了。
# 分析個(gè)性簽名
def analyze_signature():
# 個(gè)性簽名列表
data = []
for user in friends:
# 清除簽名中的微信表情emoj,即
# 使用正則查找并替換方式,user.signature為源文本,將替換成空
new_signature = re.sub(re.compile(r"", re.S), "", user.signature)
# 只保留簽名為1行的數(shù)據(jù),過(guò)濾為多行的簽名
if(len(new_signature.split("
")) == 1):
data.append(new_signature)
# 將個(gè)性簽名列表轉(zhuǎn)為string
data = "
".join(data)
# 進(jìn)行分詞處理,調(diào)用接口進(jìn)行分詞
# 這里不使用jieba或snownlp的原因是無(wú)法打包成exe文件或者打包后文件非常大
postData = {"data":data, "type":"exportword", "arg":"", "beforeSend":"undefined"}
response = post("http://life.chacuo.net/convertexportword",data=postData)
data = response.text.replace("{"status":1,"info":"ok","data":["", "")
# 解碼
data = data.encode("utf-8").decode("unicode_escape")
# 將返回的分詞結(jié)果json字符串轉(zhuǎn)化為python對(duì)象,并做一些處理
data = data.split("=====================================")[0]
# 將分詞結(jié)果轉(zhuǎn)化為list,根據(jù)分詞結(jié)果,可以知道以2個(gè)空格為分隔符
data = data.split(" ")
# 對(duì)分詞結(jié)果數(shù)據(jù)進(jìn)行去除一些無(wú)意義的詞操作
stop_words_list = [",", ",", "、", "the", "a", "is", "…", "·", "э", "д", "э", "м", "ж", "и", "л", "т", "ы", "н", "з", "м", "…", "…", "…", "…", "…", "、", ".", "。", "!", "!", ":", ":", "~", "|", "▽", "`", "ノ", "?", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", """, "‘", "’", "“", "”", "的", "了", "是", "你", "我", "他", "她","=", "
", "
", "
", " ", "以下關(guān)鍵詞", "[", "]", "{", "}", "(", ")", "(", ")", "span", "<", ">", "class", "html", "?", "就", "于", "下", "在", "嗎", "嗯"]
tmp_data = []
for word in data:
if(word not in stop_words_list):
tmp_data.append(word)
data = tmp_data
# 進(jìn)行詞頻統(tǒng)計(jì),結(jié)果存入字典signature_dict中
signature_dict = {}
for index, word in enumerate(data):
print(u"正在統(tǒng)計(jì)好友簽名數(shù)據(jù),進(jìn)度%d/%d,請(qǐng)耐心等待……" % (index + 1, len(data)))
if(word in signature_dict.keys()):
signature_dict[word] += 1
else:
signature_dict[word] = 1
# 開(kāi)始繪制詞云
name = [x for x in signature_dict.keys()]
value = [x for x in signature_dict.values()]
wordcloud = WordCloud("微信好友個(gè)性簽名詞云圖")
wordcloud.add("", name, value, shape="star", word_size_range=[1,100])
wordcloud.render("data/好友個(gè)性簽名詞云.html")
拼接所有好友頭像,這里使用到PIL的圖像處理功能,首先對(duì)頭像個(gè)數(shù)進(jìn)行統(tǒng)計(jì),自適應(yīng)生成矩形圖片。由于我們知道微信頭像尺寸為640 * 640,所以處理起來(lái)就很方便了。
# 拼接所有微信好友頭像 def merge_head_image(): # 拼接頭像 pics = listdir("image") # 得到user目錄下的所有文件,即各個(gè)好友頭像 numPic = len(pics) eachsize = int(math.sqrt(float(640 * 640) / numPic)) # 先圈定每個(gè)正方形小頭像的邊長(zhǎng),如果嫌小可以加大 numrow = int(640 / eachsize) numcol = int(numPic / numrow) # 向下取整 toImage = Image.new("RGB", (eachsize * numrow, eachsize * numcol)) # 先生成頭像集模板 x = 0 # 小頭像拼接時(shí)的左上角橫坐標(biāo) y = 0 # 小頭像拼接時(shí)的左上角縱坐標(biāo) for index, i in enumerate(pics): print(u"正在拼接微信好友頭像數(shù)據(jù),進(jìn)度%d/%d,請(qǐng)耐心等待……" % (index + 1, len(pics))) try: # 打開(kāi)圖片 img = Image.open("image/" + i) except IOError: print(u"Error: 沒(méi)有找到文件或讀取文件失敗") else: # 縮小圖片 img = img.resize((eachsize, eachsize), Image.ANTIALIAS) # 拼接圖片 toImage.paste(img, (x * eachsize, y * eachsize)) x += 1 if x == numrow: x = 0 y += 1 toImage.save("data/拼接" + ".jpg")
檢測(cè)使用人臉作為頭像的好友數(shù)量,這里使用到opencv的人臉檢測(cè)功能,使用opencv默認(rèn)的模型進(jìn)行檢測(cè)。首先載入圖片,并進(jìn)行灰度處理,最后加載人臉識(shí)別模型進(jìn)行檢測(cè),若檢測(cè)到臉數(shù)大于0,則說(shuō)明存在。同時(shí)要注意的是,對(duì)錯(cuò)誤的頭像要進(jìn)行舍棄操作。
# 檢測(cè)使用真實(shí)人臉的好友個(gè)數(shù) def detect_human_face(): # 得到user目錄下的所有文件名稱(chēng),即各個(gè)好友頭像 pics = listdir("image") # 使用人臉的頭像個(gè)數(shù) count_face_image = 0 # 存儲(chǔ)使用人臉的頭像的文件名 list_name_face_image = [] # 加載人臉識(shí)別模型 face_cascade = CascadeClassifier("model/haarcascade_frontalface_default.xml") for index, file_name in enumerate(pics): print(u"正在進(jìn)行人臉識(shí)別,進(jìn)度%d/%d,請(qǐng)耐心等待……" % (index+1, len(pics))) # 讀取圖片 img = imread("image/" + file_name) # 檢測(cè)圖片是否讀取成功,失敗則跳過(guò) if img is None: continue # 對(duì)圖片進(jìn)行灰度處理 gray = cvtColor(img, COLOR_BGR2GRAY) # 進(jìn)行實(shí)際的人臉檢測(cè),傳遞參數(shù)是scaleFactor和minNeighbor,分別表示人臉檢測(cè)過(guò)程中每次迭代時(shí)圖 faces = face_cascade.detectMultiScale(gray, 1.3, 5) if (len(faces) > 0): count_face_image += 1 list_name_face_image.append(file_name) print(u"使用人臉的頭像%d/%d" %(count_face_image,len(pics)))
所有數(shù)據(jù)統(tǒng)計(jì)完后,我們生產(chǎn)一個(gè)總的html網(wǎng)頁(yè)文件,方便我們直接查看。
# 生成一個(gè)html文件,并保存到文件file_name中 def generate_html(file_name): with open(file_name, "w", encoding="utf-8") as f: data = """補(bǔ)充一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告(了解你的微信社交歷史) """ f.write(data)
完整版源代碼存放在github上,有需要的可以下載
項(xiàng)目持續(xù)更新,歡迎您star本項(xiàng)目
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43623.html
摘要:一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告了解你的微信社交歷史簡(jiǎn)介你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。 [TOC] 一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解你的微信社交歷史 簡(jiǎn)介 你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。現(xiàn)在,我們基于python對(duì)微信好友進(jìn)行全方位數(shù)據(jù)分析,包括:昵稱(chēng)、性別、年齡、地區(qū)、備注名、個(gè)性簽名、頭像、群聊、公眾號(hào)等。 其中...
摘要:一鍵生成屬于自己的歷史報(bào)告,看看你對(duì)自己的了解程度有多深簡(jiǎn)介近幾年,由于微信的流行,大部分人不再頻繁使用,所以我們對(duì)于自己的數(shù)據(jù)并不是特別了解。這里要說(shuō)明的是,加密函數(shù)的獲取,需要具備一定的抓包基礎(chǔ)才能獲取得到。 [TOC] 一鍵生成屬于自己的QQ歷史報(bào)告,看看你對(duì)自己的QQ了解程度有多深? 簡(jiǎn)介 近幾年,由于微信的流行,大部分人不再頻繁使用QQ,所以我們對(duì)于自己的QQ數(shù)據(jù)并不是特別了...
摘要:藍(lán)湖通過(guò)幫助設(shè)計(jì)師更好地向團(tuán)隊(duì)展示設(shè)計(jì)圖描述頁(yè)面之間的跳轉(zhuǎn)關(guān)系。如果設(shè)計(jì)圖出現(xiàn)改動(dòng)和更新,藍(lán)湖也能自動(dòng)添加新版本。藍(lán)湖基于這些反饋快速迭代,而自動(dòng)標(biāo)注功能就是其中一項(xiàng)。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫(xiě)博客,記錄點(diǎn)滴。 工欲善其事,必先利其器。我只是...
摘要:藍(lán)湖通過(guò)幫助設(shè)計(jì)師更好地向團(tuán)隊(duì)展示設(shè)計(jì)圖描述頁(yè)面之間的跳轉(zhuǎn)關(guān)系。如果設(shè)計(jì)圖出現(xiàn)改動(dòng)和更新,藍(lán)湖也能自動(dòng)添加新版本。藍(lán)湖基于這些反饋快速迭代,而自動(dòng)標(biāo)注功能就是其中一項(xiàng)。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫(xiě)博客,記錄點(diǎn)滴。 工欲善其事,必先利其器。我只是...
閱讀 1135·2023-04-26 00:12
閱讀 3275·2021-11-17 09:33
閱讀 1069·2021-09-04 16:45
閱讀 1196·2021-09-02 15:40
閱讀 2181·2019-08-30 15:56
閱讀 2969·2019-08-30 15:53
閱讀 3557·2019-08-30 11:23
閱讀 1939·2019-08-29 13:54