(左)2019拜年定制贺卡:春联送福
(
点这里看2019贺卡
)
(右)2018拜年定制贺卡:词云朵朵
(点这里看2018贺卡)
快试试效果如何吧~
01
什么是itchat?
看本文的你不知道是否对Python已经有所耳闻,没有的话推荐你搜一搜Python这个语言,相信你会爱上ta的。当然如果没听过python也不要紧,本文就当了解啦!
但是实现本文的功能,只需要掌握4行代码
登陆
itchat.auto_login(hotReload=True)
获取好友列表
friends = itchat.get_friends(update=True)
获取头像
himg=itchat.get_head_img(i["UserName"])
发送图片
itchat.send_image("test.jpg",i["UserName"])
什么?有点惊讶?哎呀,这正是python的魅力,绝对让你克服编程恐惧症!接下来我们就来详细说一下这四行代码
1.1
登陆
itchat.auto_login没什么说的,就是登陆,这时会弹出一张二维码,就是微信网页版的二维码,扫码就能登陆微信,hotReload是一个记忆功能,可以让微信保持在线一段时间,这样下次再启动程序就不用再登陆了,当然时间过去太长或者在手机端关闭网页版微信也会失去这个记忆功能。
登陆成功
1.2
获取好友列表
itchat.get_friends可以获取好友列表,返回的是一个列表(list)可以通过下标索引到不同的好友,比如friends[0]就是自己的微信号,返回的是一个类字典的数据
包含各种信息
里面包含了很多信息如名字、性别、地区、签名、标签等,但最重要的是区分UserName、NickName、RemarkName
UserName
本次登陆列表中好友的唯一身份标识(每次登陆都会变化),用于信息发送以及头像获取等
NickName
好友昵称,就是原始的名字,往往有个性的朋友会用一些特殊符号作为自己的名字,这时处理这个字符串就要特别小心编码的问题,所以不建议用这个名字
RemarkName
好友备注,这就是显示在你微信上的名字,建议在群发前把备注都标识正确这样也会便于你的操作,同时还要注意:当好友昵称和备注一样时,备注会变成空字符串!!!这个尤其小心,另外还要当心重名的问题。
这里我还得对真想试一试的你提几句:群发并不是每个好友都能成功的,因此需要具备断点续发的功能,但是用户列表friends是可能变化的,UserName更是每次都不一样,所以只能靠NickName、RemarkName综合定位确保用户的唯一性
#过滤已发送对象
if(filterlist!=[]):
if ([i['RemarkName'],i['NickName']] in filterlist):
print("已跳过%s,%s"%(i['RemarkName'],i['NickName']))
continue
1.3
获取头像
itchat.get_head_img用的是好友的UserName,这必须注意,并且返回的是二进制数据,可以用如下代码保存到文件中:
with open("文件名.jpg",'wb') as f:
f.write(himg)
1.4
发送消息
文字消息可以用这句话发送
itchat.send_msg("TEXT",UserName)
图片消息可以用这句话发送
itchat.send_image("test.jpg",UserName)
警告
图片和文字发送一定不能过于频繁!
否则微信网页版会被封(显示:微信网页版初始化失败)解封时间在2小时左右
图片发送总量一定要控制好,经测试20分钟内总量超过100张照片就会出现无法发送的情况(显示:微信网页版一直转圈不能发出去,python端发送完成但手机端没图片)解封时间在1小时左右
所以最好办法是利用time.sleep()函数,但是前万不要吝啬你的延时时间,我试过10s都不行,建议30s起步,总之越长越好,宁可花的总时间长一点也不要被封号了
02
什么是pillow?
Pillow是在PIL(Python Imaging Library)的基础上更新的图像处理标准库,简而言之就是python版的PS。对吧,你会很惊讶怎么什么都有python版的?没错,就以我目前拿python干过的事来看,word、excel有python版的,音频剪辑有python版的,可以说功能很强大了。
因为我们要做个性化贺卡,那就必须得根据每个好友的特性来定制,这个个性化定制才是使用pillow的意义所在,毕竟你不能每张图都自己ps吧!
操作pillow的时候有点ps基础会显得得心应手,但是没有也没关系,下面我就以今年主题为春联送福的贺卡为例子给大家解读一下:
2.1
制作模板
pillow毕竟是用命令来作图,坐标定位就没有图形化的界面方便,所以建议先用ps做出模板来
白框为五处需要用命令替换的区域
因为春联有七字也有八字,所有要做两份模板,这样才不失美观
图片导入pillow中可以用下面的命令
导入图片
im = Image.open('BG7.jpg')
2.2
文字添加
文字是贺卡的重头,也是最能表现创意的地方。今年的贺卡接入了春联AI,可以根据每个好友的姓名作出一幅专属春联,关于如何接入春联AI,那是下一篇推送我要给大家呈现的,现在我们先来了解如何给图片自动化添加文字
创建绘图对象
drawObject=ImageDraw.Draw(im)
就像ps中键入文本框,这里也要创建文本框,也就是绘图对象
字体读取
Font1=ImageFont.truetype("STXINGKA.TTF",200)
STXINGKA.TTF是字体的路径,可以下载一些艺术字体,200是字体的字号
绘图
drawObject.text(text_pos,text,'black',font=Font1)
text_pos是文字的位置,为一个列表(x,y);text为文字;'black'为颜色,是16进制的颜色,font是字体就是刚才读取的字体
因为春联是纵向排版,pillow没有提供纵向排版需要自己设计,所以可以在每个字后面加上\n
2.3
头像添加
好友的头像那肯定是必须用到的图像元素啦,但是直接粘上去就显得太俗太丑,所以我们可以利用蒙版的方式和福字叠加在一起
左图就是元素ele,中图就是蒙版mask,右图是最终的合成效果。因为蒙版和元素尺寸并不相同,所以必须先进行尺寸更改,让他们俩保证为相同尺寸才能重合
更改尺寸
size=(500,500)
ele=ele.resize(size)
mask=mask.resize(size)
这种蒙版属于剪贴蒙版,即用元素的r、g、b通道与蒙版的alpha通道结合为新的图片,所以我们得先提取alpha通道
alpha通道提取
alpha = mask.split()[3]
最后我们把各个通道合并,就大功告成啦,其中ele_pos为粘贴的位置(x,y),size为尺寸,这里一定注意按这种格式来写,不然会出现图片不匹配的错误
元素粘贴
im.paste(ele,(ele_pos[0], ele_pos[1], ele_pos[0]+size[0],ele_pos[1]+size[1]),mask = alpha )
2.4
图片输出
最后就是图片输出了,可以用下面这个命令
图片导出
im.save(savepath, "JPEG")
是不是总体来看也不是想象中的那么难?
是不是还挺炫酷滴?
03
源码获取
本着开源精神,我已经把2018、2019两年的拜年源码放在GitHub主页上了,大家可以自行下载
https://github.com/HILMR/HappyNewYear
API文件夹是每年拜年的核心内容,比如2018年是识别头像,我就把这部分内容封装成API供大家调用,2019年是春联AI,我也把这个封装好了可以直接单独使用(比如2020年也可以用这个,只要改一下背景模板就行~当然明年我还会有新的创意哈哈~)
如果大家喜欢,希望能赏颗⭐~
欢迎交流
领取专属 10元无门槛券
私享最新 技术干货