利用Python生成微信好友全家福
背景
最近看到某个人公众号的作者与国内某“消费科技领域”媒体刚正面,这事儿大D是选择支持个人公众号的作者的。
“引流”,说白了就是为了个流量,但是某媒体做的实在是不够讲究。
这个事儿跟这篇水文有啥关系呢?凑热闹来写代码生成自己的微信好友头像全家福。
实现
依赖
本文代码基于Pillow、ItChat两个库,在此对开源库的作者表示感谢。
ItChat: https://github.com/littlecodersh/ItChat
Pillow: https://github.com/python-pillow/Pillow
原理
简述
使用ItChat库登陆微信网页版,获取好友头像后进行拼合。
需要做的事
- 登陆
- 获取好友列表
- 获取好友头像并保存本地
- 计算显示数量(一行放几个,一共多少行)
- 缩小好友头像到指定大小
- 将缩小后的头像按照计算出的现实方式拼合到新图上(实际上是将图片打开后按照x, y坐标值粘贴)
- 输出最后的合成图
代码实现
登陆并获取头像
登陆并获取好友头像是利用ItChat库完成的,好友列表从1开始遍历是因为列表内首个数据是自己。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/usr/bin/python # -*- coding: utf-8 -*- # @Time : 2019/5/6 16:40 # @Author : Derek.S # @Site : # @File : wx.py import itchat def getHeadImg(): """ login weixin, get friends lists, download friends head image :return: None """ itchat.auto_login(hotReload=True) print("获取头像") friends = itchat.get_friends() for item in friends[1:]: img = itchat.get_head_img(userName=item["UserName"]) fileImg = open("headimg/" + str(item["UserName"]) + ".jpg", "wb") fileImg.write(img) fileImg.close() |
拼合头像
拼合头像使用Pillow库来完成。
由于微信好友头像大小不一,都缩小成300px边长的小图来用。
大致思路:获取存储目录下的头像数量,计算该数量的所有整除数,作为行显示数量。把所有的整除结果(除1及自身之外)的结果存储在num内,这样就得到方向不同的图,根据自己的需要选择一个用就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/usr/bin/python # -*- coding: utf-8 -*- # @Time : 2019/5/6 16:42 # @Author : Derek.S # @Site : # @File : plece.py import PIL.Image as Image import os def plece(): """ get head images, plece to one image :return: None """ print("拼合图像,会根据数量拼合多种尺寸以供选择") fileList = os.listdir("headimg") imgCount = len(fileList) num = [] # computational arrangement for i in range(2, imgCount+1): if not (imgCount % i): if i != imgCount: num.append([i, int(imgCount / i)]) # create new image for item in num: x = 0 y = 0 newImg = Image.new("RGB", (item[0] * 300, item[1] * 300)) for eachImg in fileList: headImg = Image.open("headimg/" + str(eachImg)) reHeadImg = headImg.resize((300,300), Image.ANTIALIAS) newImg.paste(reHeadImg, (x * 300, y * 300)) x += 1 if( x == item[0] ): x = 0 y += 1 newImg.save("all" + "-" + str(item[0]) + "_" + str(item[1]) + ".jpg" ) |
结果
贴张图上来
注意事项
由于微信官方并没有直接提供API,所以使用第三方的ItChat库(不限于,还有很多开源的微信库),有可能会造成网页端限制登陆(手机、PC、平板端不受影响)等问题,请酌情使用。
Github
所有代码已经上传到Github,地址如下:
https://github.com/derek-s/wx_familyportrai
版权声明
转载保留版权: 大D技研室 | 《利用Python生成微信好友全家福》
本文链接地址:https://www.dadclab.com/archives/7401.jiecao
转载须知:如果您需要转载本文,请将版权信息,版权授权方式,以及本文的链接地址注明,谢谢合作。
已有 2 条评论
发表评论
电子邮件地址不会被公开。 必填项已标注。
好像我关注过你说的正面刚的那个公众号。微信上抄袭别人东西的太多了。
现在抄袭的、洗稿的简直多。
还好我就一小博客主,写的东西也不值钱,随他去。