模块安装
pip install itchat
pip install Pillow
获取微信好友头像
本源码来源于硫酸锌01/流水线,本文提供源码有所改动
运行wxAvatars_1.1_chatrooms.py,输入群名(不需要完整群名包含关键字就行,建议保存群聊到通讯录),扫码登陆微信网页版(如果你的微信登录不了微信网页版,右上角关闭网页,无解)
拼接头像
不知道从那扒下的代码了,在源代码的基础上增加了根据头像数开根号取整,拼成一个正方形,而不是所有人头像拼接。
源码
wxAvatars_1.1_chatrooms.py
import os
import sys # non_bmp_map 用到
import itchat
import PIL.Image as Image
# 转载请注明出处
# 原文标题:微信好友头像拼接
# 原文地址:https://github.com/znsoooo/wxAvatars
# 原文作者:硫酸锌01/流水线
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
name = input('''
请输入群名
群名可以不是全称
只要搜索到没有歧义就行
''')
name_chatrooms = [name]
user = 'avatars'
num_all = 0
all_friends = []
if not os.path.exists(user):
os.makedirs(user)
itchat.auto_login(hotReload=True)
def log(text):
f=open('log.txt','w',encoding = 'utf-8')
f.write(str(text))
f.close()
text = '\nfriends:\n\n'
'''
friends = itchat.get_friends()[0:]
num_all = 0
for friend in friends:
all_friends.append(friend["UserName"])
''''''
#当只是需要输出好友列表而不需要下载头像时可以注释掉此段
img = itchat.get_head_img(userName=friend["UserName"])
fileImage = open(user + "/" + str(num_all) + ".jpg",'wb')
fileImage.write(img)
fileImage.close()
''''''
text = text + str(num_all) + ".jpg " + friend["NickName"] + '\n'
num_all += 1
print('friends finished:', len(all_friends))
'''
for name_chatroom in name_chatrooms:
chatrooms = itchat.search_chatrooms(name_chatroom)
if chatrooms != []:
chatroom = chatrooms[0]
chatroom_id = chatroom['UserName']
try:
print('chatroom:', chatroom['NickName'].translate(non_bmp_map))
text = text + '\nchatroom: ' + chatroom['NickName'] + '\n\n'
except:
print('chatroom name error')
print('MemberCount:', chatroom['MemberCount'])
memberList = itchat.update_chatroom(chatroom_id, detailedMember=True)
chatroom = memberList
num = 0
print(len(chatroom))
for member in chatroom['MemberList']:
if member["UserName"] not in all_friends:
all_friends.append(member["UserName"])
''''''
#当只是需要输出好友列表而不需要下载头像时可以注释掉此段
img = itchat.get_head_img(userName=member["UserName"],chatroomUserName=chatroom_id)
fileImage = open(user + "/" + str(num_all) + ".jpg",'wb')
try:
fileImage.write(img)
fileImage.close()
except:
print('img error:', member["UserName"])
''''''
text = text + str(num_all) + ".jpg " + member["NickName"] + '\n'
num += 1
num_all += 1
if num < 10:
try:
print(num, member["NickName"].translate(non_bmp_map))
except:
print('nickname error')
else:
pass
# print('duplicate:', member["NickName"].translate(non_bmp_map))
else:
print('Not found chatroom:', name_chatroom)
print('MemberCount:', 0)
print('chatroom finished:', len(all_friends))
log(text)
cut.py
# -*- coding: utf-8 -*-
import math
from PIL import Image
import os
avatar_dir = os.getcwd() + "\\avatars\\"
def joint_avatar(path):
# 获取文件夹内头像个数
length = len(os.listdir(path))
# 设置画布大小
image_size = 2560
# 设置每个头像大小
each_size = math.ceil(2560 / math.floor(math.sqrt(length)))
# 计算所需各行列的头像数量
x_lines = int(length ** 0.5)
y_lines = int(length ** 0.5)
image = Image.new('RGB', (each_size * x_lines, each_size * y_lines))
x = 0
y = 0
for (root, dirs, files) in os.walk(path):
for pic_name in files:
# 增加头像读取不出来的异常处理
try:
with Image.open(path + pic_name) as img:
img = img.resize((each_size, each_size))
image.paste(img, (x * each_size, y * each_size))
x += 1
if x == x_lines:
x = 0
y += 1
except IOError:
print("头像读取失败")
img = image.save(os.getcwd() + "/wechat.png")
print('微信好友头像拼接完成!')
if __name__ == '__main__':
avatar_dir = os.getcwd() + "\\avatars\\"
joint_avatar(avatar_dir)
附件下载
百度云盘 提取码: anxc