在社交网络盛行的当下,微信好友数据蕴含着丰富的信息,对其进行分析能让我们更好地了解自己的社交圈子。今天,就来和大家分享一个微信好友数据分析项目,涵盖从功能实现、界面设计到打包发布的完整过程。
一、项目设计思想
本项目旨在打造一个多功能的微信好友数据分析工具,通过对微信好友多维度数据的收集、处理和可视化,为用户提供深入了解好友群体特征的途径。设计时注重模块化和可扩展性,以便后续添加更多功能和优化现有功能。同时,考虑到用户使用的便捷性,计划开发图形化界面,并将项目打包成可执行文件,方便在不同环境中使用。
二、项目功能实现
数据获取与保存
微信目前并没有直接开放获取好友全部信息的接口,这里假设我们通过合法合规的方式(如用户手动导出特定格式数据)获取到了好友信息,将其保存到文件中。在 Python 中,使用json
模块将数据以 JSON 格式保存,方便后续读取和处理。
import json
def save_friends_info(friends_info, file_path):
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(friends_info, f, ensure_ascii=False, indent=4)
friends_info
是包含好友信息的字典或列表,file_path
是保存文件的路径。
好友信息交互功能
给好友发送信息的功能,由于微信官方对个人账号发送消息的接口限制,这里以企业微信为例。利用企业微信的开发接口,先获取访问令牌,再发送消息。
import requests
import json
def send_message_to_friend(corpid, corpsecret, touser, msg):
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}"
response = requests.get(url)
access_token = response.json()['access_token']
send_url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}"
data = {
"touser": touser,
"msgtype": "text",
"text": {
"content": msg
}
}
response = requests.post(send_url, json=data)
return response.json()
corpid
和corpsecret
是企业微信的凭证,touser
是接收消息的好友标识,msg
是消息内容。
数据可视化
- 好友性别可视化:用
pyecharts
库绘制饼图展示好友性别分布。
from pyecharts.charts import Pie
from collections import Counter
import json
def visualize_gender(friends_info_file):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
genders = [friend['性别'] for friend in friends_info]
gender_count = Counter(genders)
pie = (
Pie()
.add("", [(gender, count) for gender, count in gender_count.items()])
.set_global_opts(title_opts=opts.TitleOpts(title="好友性别分布"))
)
pie.render('gender_visualization.html')
- 好友所在省份和城市可视化:使用
pyecharts
的Map
和Bar
图分别展示好友所在省份和城市分布。
from pyecharts.charts import Map, Bar
from collections import Counter
import json
def visualize_location(friends_info_file, location_type='省份'):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
if location_type == '省份':
locations = [friend['省份'] for friend in friends_info]
location_count = Counter(locations)
map_chart = (
Map()
.add("好友数量", [(loc, count) for loc, count in location_count.items()], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="好友省份分布"),
visualmap_opts=opts.VisualMapOpts(max_=max(location_count.values()))
)
)
map_chart.render('province_visualization.html')
elif location_type == '城市':
locations = [friend['城市'] for friend in friends_info]
location_count = Counter(locations)
bar = (
Bar()
.add_xaxis(list(location_count.keys()))
.add_yaxis("好友数量", list(location_count.values()))
.set_global_opts(title_opts=opts.TitleOpts(title="好友城市分布"))
)
bar.render('city_visualization.html')
- 特殊好友可视化:特殊好友可以根据多种条件定义,如聊天频率高、星标好友等。假设我们以星标好友为例,筛选出特殊好友后,分析其性别分布并可视化。
import json
from pyecharts.charts import Pie
from collections import Counter
def visualize_special_friends(friends_info_file):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
special_friends = [friend for friend in friends_info if friend.get('是否星标', False)]
genders = [friend['性别'] for friend in special_friends]
gender_count = Counter(genders)
pie = (
Pie()
.add("", [(gender, count) for gender, count in gender_count.items()])
.set_global_opts(title_opts=opts.TitleOpts(title="特殊好友性别分布"))
)
pie.render('special_friends_gender_visualization.html')
- 签名词云化:依据
test02.py
中对文本处理的思路,利用wordcloud
库生成好友签名词云。
from wordcloud import WordCloud
import jieba
import json
import matplotlib.pyplot as plt
def generate_signature_wordcloud(friends_info_file):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
signatures = " ".join([friend['个性签名'] for friend in friends_info if friend['个性签名']])
words = " ".join(jieba.lcut(signatures))
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(words)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig('signature_wordcloud.png')
好友头像分析
- 头像集成:利用
Pillow
库将多个好友头像整合到一张图片上,方便查看。
from PIL import Image
import json
def integrate_avatars(friends_info_file):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
avatars = []
for friend in friends_info:
try:
img = Image.open(friend['头像路径'])
img = img.resize((100, 100))
avatars.append(img)
except FileNotFoundError:
pass
num_avatars = len(avatars)
rows = (num_avatars - 1) // 5 + 1
new_img = Image.new('RGB', (500, rows * 100))
for i, img in enumerate(avatars):
x = (i % 5) * 100
y = (i // 5) * 100
new_img.paste(img, (x, y))
new_img.save('integrated_avatars.jpg')
- 2人脸识别与头像分类分析:使用
face_recognition
库进行人脸识别,根据识别结果对头像分类,如识别出戴眼镜的好友头像。
import face_recognition
import json
def analyze_friends_avatars(friends_info_file):
with open(friends_info_file, 'r', encoding='utf-8') as f:
friends_info = json.load(f)
glasses_friends = []
for friend in friends_info:
try:
image = face_recognition.load_image_file(friend['头像路径'])
face_landmarks_list = face_recognition.face_landmarks(image)
for face_landmarks in face_landmarks_list:
if face_landmarks.get('left_eye_glasses') or face_landmarks.get('right_eye_glasses'):
glasses_friends.append(friend)
break
except FileNotFoundError:
pass
with open('glasses_friends.json', 'w', encoding='utf-8') as f:
json.dump(glasses_friends, f, ensure_ascii=False, indent=4)
三、项目界面设计(使用 Tkinter)
Tkinter 是 Python 自带的标准 GUI 库,使用它来创建项目界面。
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
class WeChatFriendAnalyzerUI:
def __init__(self, master):
self.master = master
master.title("微信好友数据分析工具")
self.save_button = tk.Button(master, text="保存好友信息", command=self.save_friends_info_gui)
self.save_button.pack()
self.send_button = tk.Button(master, text="给好友发消息", command=self.send_message_gui)
self.send_button.pack()
self.gender_button = tk.Button(master, text="好友性别可视化", command=self.visualize_gender_gui)
self.gender_button.pack()
self.province_button = tk.Button(master, text="好友省份可视化", command=self.visualize_province_gui)
self.province_button.pack()
self.city_button = tk.Button(master, text="好友城市可视化", command=self.visualize_city_gui)
self.city_button.pack()
self.special_button = tk.Button(master, text="特殊好友可视化", command=self.visualize_special_friends_gui)
self.special_button.pack()
self.wordcloud_button = tk.Button(master, text="签名词云化", command=self.generate_signature_wordcloud_gui)
self.wordcloud_button.pack()
self.avatar_integrate_button = tk.Button(master, text="集成好友头像", command=self.integrate_avatars_gui)
self.avatar_integrate_button.pack()
self.avatar_analyze_button = tk.Button(master, text="分析好友头像", command=self.analyze_friends_avatars_gui)
self.avatar_analyze_button.pack()
def save_friends_info_gui(self):
file_path = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
if file_path:
# 这里应调用实际保存好友信息的函数,需传入正确的好友信息数据
save_friends_info([], file_path)
messagebox.showinfo("提示", "好友信息保存成功!")
def send_message_gui(self):
# 这里应实现获取用户输入的corpid、corpsecret、touser和msg,并调用发送消息的函数
messagebox.showinfo("提示", "发送消息功能暂未完全实现!")
def visualize_gender_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
visualize_gender(file_path)
messagebox.showinfo("提示", "好友性别可视化图表已生成!")
def visualize_province_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
visualize_location(file_path, '省份')
messagebox.showinfo("提示", "好友省份可视化图表已生成!")
def visualize_city_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
visualize_location(file_path, '城市')
messagebox.showinfo("提示", "好友城市可视化图表已生成!")
def visualize_special_friends_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
visualize_special_friends(file_path)
messagebox.showinfo("提示", "特殊好友可视化图表已生成!")
def generate_signature_wordcloud_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
generate_signature_wordcloud(file_path)
messagebox.showinfo("提示", "签名词云已生成!")
def integrate_avatars_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
integrate_avatars(file_path)
messagebox.showinfo("提示", "好友头像集成完成!")
def analyze_friends_avatars_gui(self):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
if file_path:
analyze_friends_avatars(file_path)
messagebox.showinfo("提示", "好友头像分析完成!")
root = tk.Tk()
app = WeChatFriendAnalyzerUI(root)
root.mainloop()
界面上每个按钮对应一个功能,通过文件对话框获取文件路径,调用相应功能函数,并使用消息框提示用户操作结果。
四、项目打包(使用 PyInstaller)
使用PyInstaller
将项目打包成可执行文件(.exe)。在命令行中进入项目目录,执行以下命令:
pyinstaller --onefile your_script_name.py
--onefile
参数表示将所有依赖打包到一个文件中,方便发布和使用。
五、项目总结与未来展望
项目总结
本项目实现了微信好友数据的多维度分析与可视化,涵盖了从数据保存、交互到复杂分析和界面展示的多个功能。通过模块化的设计,每个功能相对独立,便于维护和扩展。然而,项目也存在一些不足之处。例如,微信数据获取受限制,导致部分功能依赖用户手动导出数据;部分功能的算法可以进一步优化,如人脸识别和特殊好友筛选的准确性等。
未来展望
- 数据获取优化:持续关注微信官方接口的变化,探索合法获取更多微信好友数据的方式,减少对用户手动操作的依赖。
- 功能拓展与优化:在数据分析方面,引入更先进的自然语言处理技术分析签名,更精准地识别头像特征;在可视化方面,增加更多图表类型和交互功能,提升可视化效果;在界面设计上,优化布局和交互逻辑,提高用户体验。
- 跨平台应用:考虑将项目拓展到更多平台,如开发移动端应用,方便用户随时随地分析自己的微信好友数据。
希望通过不断地完善和拓展,这个项目能为大家带来更全面、便捷的微信好友数据分析体验,让我们更好地理解自己的社交网络。