导航菜单
首页 » 好莱客家居 » 正文

继承者们-用Python一键生成微信个人交际前史

你是否想过生成一份归于你的微信个人数据陈述,了解你的微信交际前史。现在,咱们依据python对微信老友进行全方位数据剖析,包含:昵称、性别、年纪、区域、补白名、特性签名、头像、群聊和大众号等。

其间,在剖析老友类型方面,首要计算出你的陌生人、星标老友、不让他看我的朋友圈的老友、不看他的朋友圈的老友数据。在剖析区域方面,首要计算一切老友在全国的散布以及对老友数最多的省份进行进一步剖析。在其他方面,计算出你的老友性别份额、猜出你最密切的老友,剖析你的特别老友,找出与你地点一起群聊数最多的老友数据,对你的老友特性签名进行剖析,对你的老友头像进行剖析,并进一步检测出运用真人头像的老友数据。

现在网上关于这方面的数据剖析文章比较多,可是运转起来比较费事,而本程序的运转十分简略,只需求扫码登录一步操作即可。

功用截图


怎么运转

# 跳转到当时目录

cd 目录名

# 先卸载依靠库

pip uninstall -y -r requirement.txt

# 再重新装置依靠库

pip install -r requirement.txt

# 开端运转

python generate_wx_data.py

怎么打包成二进制可履行文件

# 装置pyinstaller

pip install pyinstaller

# 跳转到当时目录

cd 目录名

# 先卸载依靠库

pip uninstall -y -r requirement.txt

# 再重新装置依靠库

pip install -r requirement.txt

# 更新 setuptools

pip install --upgrade setuptools

# 开端打包

pyinstaller generate_wx_data.py

编写思路

首要,进行初始化,并依据不同操作系统,启用微信机器人。

# 初始化所需文件夹

init_folders()

# 发动微信机器人,主动依据操作系统履行不同的指令

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"无法辨认你的操作系统类型,请自己设置")

exit()

1. 登录完微信后,开端获取误惹妖孽王爷老友数据和群聊数据。

# 获取一切老友

friends = bot.friends(update=False)

# 获取一切活泼群聊

groups = bot.groups()

2. 一起地点群聊成员剖析,顺次对每个老友进行检测。

def group_common_in():

# 获取一切活泼的群聊

groups = bot.groups()

# 每个老友与你相同的群聊个数

dict_common_in = {}

# 遍历一切老友,第0个为你自己,所以去掉

for x in friends[1:]:

# 顺次在每个群聊中查找

for y in groups:

# x在y中

if(x in y):

# 获取微信称号

name = x.nick_name

# 判别是否有补白,有的话就运继承者们-用Python一键生成微信个人交际前史用补白

if(x.remark_name and x.remark_name != ''):

name = x.remark_name

# 添加计数

if(name in dict_common_in.keys()):

dict_common_in[name] += 1

else:

dict_common_in[name] = 1

3. 获取微信老友头像,以便进一步剖析。这儿下载头像比较慢,所以采纳多线程方法进行下载。在多线程中,运用行列保存咱们的头像url,不同线程从行列中获取头像url,并下载到本地。# 创立一个行列,用于多线程下载头像,进步下载速度

queue_head_image = Queue()

# 将每个老友元素存入行列中

# 假如为了便利调试,能够只是刺进几个数据,friends[1:10]

for user in friends:

queue_head_image.put(user)

# 发动10个线程下载头像

for i in range(1, 10):

t = Thread(target=download_head_image,args=(i,))

t.start()

其间download_head_image的具体实现为:

# 下载老友头像,此过程耗费时间比较长

def download_head_image(thread_name):

# 行列不为空的状况

while(not queue_head_image.empty()):

# 取出一个老友元素

user = queue_head_image.get()

# 下载该老友头像,并保存到指定方位,生成一个15位数的随机字符串

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'线程%d:正在下载微信老友头像数据,进展%d/%d,请耐性等候……' %(thread_name, len(friends)-queue_head_image.qsize(), len(friends)))

4. 进行性别、区域计算,并将出产的html文件保存到本地。这儿没什么难度,所以就不具体展开了。

# 剖析老友性别份额

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 = ['男性', '女人', '未设置']

num_list = [male, female, other]

pie = Pie("微信老友性别份额")

pie.add("", name_list, num_list, is_label_show=True)

pie.render('data/老友性别份额.html')

5. 剖析你知道的老友、最密切的人以及特别老友。以特别老友为例,咱们将老友分为星标老友(很重要的人), 不让他看我的朋友圈的老友, 不看他朋友圈的老友, 音讯置顶老友, 陌生人。这儿分类的依据是依据itchat中的StarFriend和ContactFlag而来的。依据经历可知,StarFriend为1表明为星标老友,ContactFlag为1和3表明老友,259和330继承者们-用Python一键生成微信个人交际前史27表明不让他看我的朋友圈,65539和65537和66051表明不看他的朋友圈,65795表明两项设置全制止, 73731表明陌生人。

# 特别老友剖析

def analyze_special_friends():

# 星标老友(很重要的人), 不让他看我的朋友圈的老友, 不看他朋友圈的老友, 音讯置顶老友, 陌生人

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:

# 星标老友为1,为0表明非星标,不存在星标选项的为陌生人

if('StarFriend' in (user.raw).keys()):

if((user.raw)['StarFriend'] == 1):

star_friends += 1

else:

stranger_friends += 1

# 老友类型及权限:1和3老友,259和33027不让他看我的朋友圈,65539和65537和66051不看他的朋友圈,65795两项设置全制止, 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=['星标', '不让他看我朋友圈', '不看他朋友圈', '音讯置顶', '陌生人'], 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')

6. 对老友特性签名进行剖析,并制作出词语。这儿比较复杂,首要将特性签名列表转化为字符串,调用nlp处理接口,对回来的数据进行过滤。一起,对短语进行分词,过滤,词频计算操作。最终,运用pyechart进行制作词语图。代码中注释十分多,根本都能看懂,所以在此也无需再具体展开了。

# 剖析特性签名

def analyze_signature():

# 特性签名列表

data = []

for user in friends:

# 铲除签名中的微信表情emoj,即

# 运用正则查找并替换方法,user.signature为源文本,将替换成空

new_signature = re.sub(re继承者们-用Python一键生成微信个人交际前史.compile(r"", re.S), "", user.signature)

# 只保存签名为1行的数据,过滤为多行的签名

if(len(new_signature.split('\n')) == 1):

data.append(new_signature)

# 将特性签名列表转为string

data = '\n'.join(data)

# 进行分词处理,调用接口进行分词

# 这儿不运用jieba或snownlp的原因是无法打包成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')

# 将回来的分词成果json字符串转化为python目标,并做一些处理

data = data.split("=====================================")[0]

# 将分词成果转化为list,依据分词成果,能够知道以2个空格为分隔符

data = data.split(' ')

# 对分词成果数据进行去除一些无意义的词操作

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', '\'', '‘', '’', '“', '”', '的', '了', '是', '你', '我', '他', '她','=', '\r', '\n', '\r\n', '\t', '以下关键词', '[', ']', '{', '}', '(', ')', '(', ')', 'span', '<', '>', 'class', 'html', '?', '就', '于', '下', '在', '吗', '嗯']

tmp_data = []

for word in data:

if(word not in stop_words_list):

tmp_data.append(word)

data = tmp_data

# 进行词频计算,成果存入字典signature_dict中

signature_dict = {}

for index, word in enumerate(data):

print(u'正在计算老友签名数据,进展%d/%d,请耐性等候……' % (index + 1, len(data)))

if(word in signature_dict.keys()):

signature_dict[word] += 1

else:

signature_dict[word] = 1

# 开端制作词云

name = [x for x in signature_dict.keys()]

value = [x for x in signature_dict.values()]

wordcloud = WordCloud('微信老友特性签名词云图')

wordcloud.add("", name, value, shape='star', word_size_range=[1,100])

wordcloud.render('data/老友特性签名词云.html')

7. 拼接一切老友头像,这儿运用到PIL的图画处理功用,首要仇人像个数进行计算,自适应生成矩形图片。因为咱们知道微信头像尺度为640 * 640,所以处理起来就很便利了。

# 拼接一切微信老友头像

def merge_head_image():

# 拼接头像

pics = listdir('image') # 得到user目录下的一切文件,即各个老友头像

numPic = len(pics)

eachsize = int(math.sqrt(float(640 * 640) / numPic)) # 先圈定每个正方形小头像的边长,假如嫌小能够加大

numrow = int(640 / eachsize)

numcol = int(numPic / numrow) # 向下取整

toImage = Image.new('RGB', (eachsize 继承者们-用Python一键生成微信个人交际前史* numrow, eachsize * numcol)) # 先生成头像集模板

x = 0 # 小头像拼接时的左上角横坐标

y = 0 # 小头像拼接时的左上角纵坐标

for index, i in enumerate(pics):

print(u'正在拼接微信老友头像数据,进展%d/%d,请耐性等候……' % (index + 1, len(pics)))

try:

# 翻开图片

img = Image.open('image/' + i)

except IOError:

print(u'Error: 没有找到文件或读取文件失利')

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")

8. 检测运用人脸作为头像的老友数量,这儿运用到opencv的人脸检测功用,运用opencv默许的模型进行检测。首要载入图片,并进行灰度处理,最终加载人脸辨认模型进行检测,若检测到脸数大于0,则阐明存在。一起要注意的是,对过错的头像要进行放弃操作。

# 检测运用实在人脸的老友个数

def detect_human_face():

# 得到user目录下的一切文件称号,即各个老友头像

pics = listdir('image')

# 运用人脸的头像个数

count_face_image = 0

# 存储运用人脸的头像的文件名

list_name_face_image = []

# 加载人脸辨认模型

face_cascade = CascadeClassifier('model/haarcascade_frontalface_default.xml')

for index, file_name in enumerate(pics):

print(u'正在进行人脸辨认,进展%d/%d,请耐性等候……' % (index+1, len(pics)))

# 读取图片

img = imread('image/' + file_name)

# 检测图片是否读取成功,失利则越过

if img is None:

continue

# 对图片进行灰度处理

gray = cvtColor(img, COLOR_BGR2GRAY)

# 进行实践的人脸检测,传递参数是scaleFactor和minNeighbor,别离表明人脸检测过程中每次迭代时图

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

if (len(faces) > 0):

count_face_image += 1

list_name_face_image.app继承者们-用Python一键生成微信个人交际前史end(file_name)

print(u'运用人脸的头像%d/%d' %(count_face_image,len(pics)))

9. 一切数据计算完后,咱们出产一个总的html网页文件,便利咱们直接检查。

# 生成一个html文件,并保存到文件file_name中

def generate_html(file_name):

with open(file_name, 'w', encoding='utf-8') as f:

data = '''

一键生成微信个人专属数据陈述(了解你的微信交际前史)

'''

f.write(data)

欢迎我们重视我的头条号,私信“python",学习材料包免费共享给需求的朋友,还有python学习沟通群,能够沟通学习拓宽人脉。

二维码