场景编程集锦– 妖兔闹春

时间:2023-01-17 17:01:12

场景描述

场景编程集锦– 妖兔闹春


为庆祝中国农历春节,中国邮政每年都发行生肖纪念邮票。2023葵卯年兔年生肖纪念邮票是一只蓝色的卡通兔。最近一段时间以来,这只小小的兔子搅动了中国互联网舆论场。关于这枚邮票美与丑的评论呈现出了巨大反差。有人赞赏它,是因为兔年邮票充分体现了设计者童心未泯,匠心独运。蓝色的兔子,血红的眼睛,长出了两颗小板牙,活泼而不失童趣;然而无数网友对此并不买账,纷纷吐槽。有网友说:这只兔子牙尖嘴利、狰狞恐怖、透出一股妖气,左手生死簿,右手钩魂笔,活脱脱的一只阎王兔,小朋友看到它会被吓哭的;还有人说:这只兔子身着蓝色的防护服,左手拿处方,右手拿钢笔,120也为它站台加持,画风与疫情肆虐相呼应,十分应景,这就是一只新冠兔;也有一些网友评价意见比较中肯和温和:这枚兔年生肖邮票缺乏了节日喜庆的传统元素和主题,很难烘托出中国春节吉庆祥和的节日氛围。当然在互联网上还有许多对兔年邮票的不同解读,可以说是仁者见仁,智者见智。尽管如此,这枚邮票已引发和掀起了互联网舆论场的激烈争论,这是一个不争的事实,或许这是邮票发行方乐于见到的传播影响力吧。

中国人欢度春节的形式多样,但是拜年是必不可少的内容。 拜年是中国民间的传统习俗,是人们辞旧迎新、相互表达美好祝愿的一种方式。大家相互拜年能增进感情,增进友谊,互相表达美好的祝愿和问候。在这里我们回顾和盘点近40多年来春节拜年方式变迁,从一个特殊的视角,展现了中国社会发展、科技进步以及民生品质的提升。

串门拜年:80年代之前,人们主要以上门拜年的方式互致节日问候和美好的祝福;

明信片拜年:80年代初期开始流行邮寄明信片致以节日问候;

传呼机拜年:90年代,随着传呼机的推广应用,人们更多地使用BB机发送节日的祝福信息;

电话拜年:98年随着中国电信取消电话初装费后,家用电话装机量呈现出爆发式增长,家用座机电话逐步走进百姓家中,人们开始通过电话拜年,与亲朋好友通话,互致以节日的问候;

短信拜年:2005年左右,普通手机开始在中国大地上快速普及,人们开始使用手机短信功能,发送节日的问候信息,传递节日的祝福。

微信拜年:2013年以后,我们迎来了智能手机时代,人们开始使用微信等社交软件进行交流,它支持文字、图片、语音和视频。使用微信拜年,节日祝福的内容的形式更加丰富多彩。

为迎接2023兔年春节的到来,我们使用Python定制个性化电子贺年卡,并通过微信实现批量发送。


编程思路

我们在本案例中要解决两个关键性问题,一个是如何制作个性化的电子贺年卡;另一个问题是如何实现电子贺年卡的批量发送。

制作贺年卡

使用Python的图片处理模块PIL(Python Image Library),可以方便地实现图片剪切、粘贴、缩放、镜像、水印、颜色块、滤镜、图像格式转换、图片上书写文字等等,功能十分强大。利用PIL模块,我们可以比较轻松地定制电子贺年卡。如果你要使用PIL模块,需要安装Pillow模块。

微信批量发送

要实现Python程序控制微信,实现自动化批处理方式发送电子贺年卡,我们需要用到一个Python第三方库:pyautogui。这个模块允许你通过编写程序的方式直接操作鼠标和键盘。如果我们在电脑上安装微信的电脑版,我们就可以使用程序控制鼠标和键盘,全真模仿在电脑上手动操作微信,实现发送信息的全过程,这种技术也称之为“图形用户界面自动化”或者“GUI自动化”。使用这种技术,当你执行程序的时候,就好像有一个真人坐在计算机面前操作鼠标和键盘,使用微信(PC电脑版)逐一向你的微信好友发送兔年贺年卡。这个模块需要单独安装pyautogui


程序代码

本案例程序由以下6个文件或模块构成:

  1. make_cards.py :制作电子贺年卡。
"""
make_cards.py : 批量制作贺年卡
"""
from common.NewYear_card import *

def main():
greetings = ['兔年快乐\n\n心想事成\n\n家庭和睦\n\n幸福安康',
'兔年吉祥\n万事顺意\n幸福安康\n',
'祝全家新春快乐,\n来年事事顺心!']
# 贺年卡模板文件
infile = 'card_template.jpg'
out_folder = 'cards/'

names = load_namelist('name_list.txt')

for user, name in names.items():
# 制作贺年卡文件
outfile = out_folder + user.strip() + '.jpg'
card = NYCard(infile, outfile)
card.set_font('华文隶书')
card.set_fontsize(100)
card.set_color('red')
card.output_text((600, 680), '祝'+name+':')
card.output_text((700, 860), greetings[0])
card.set_color('green')
card.output_text((650, 2000), '罗杰 . 恭贺')
card.save()

if __name__ == '__main__':
main()

2. send_cards.py :利用微信批量发送电子贺年卡。

"""
send_cards.py : 批量向微信好友发送电子贺年卡
"""
import time
from PIL import Image
from io import BytesIO
import pyautogui
import pyperclip
import win32clipboard as clip
import win32con
from common.NewYear_card import load_namelist

def send_image(filename):
"""打开图像文件,放入剪贴板中"""
# 打开剪贴板
clip.OpenClipboard()
# 清除剪贴板内容
clip.EmptyClipboard()
im = Image.open(filename)
buffer = BytesIO()
im.convert('RGB').save(buffer, 'BMP')
img_data = buffer.getvalue()[14:]
buffer.close()
clip.SetClipboardData(win32con.CF_DIB, img_data)
clip.CloseClipboard()
time.sleep(1)
# 组合键ctrl+v,粘贴剪贴板内容
pyautogui.hotkey('ctrl', 'v')
# 模拟Enter键,发送图片内容
pyautogui.press('enter')

def main():
# 获取微信好友列表
friends = load_namelist('name_list.txt').keys()
# Ctrl + alt + w 打开微信
pyautogui.hotkey('ctrl', 'alt', 'w')

for friend in friends:
pyautogui.hotkey('ctrl', 'f')
# 复制好友名到剪贴板
pyperclip.copy(friend)
# 模拟键盘 ctrl + v 粘贴
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)
# 进入好友聊天界面
pyautogui.press('enter')
filename = 'cards/' + friend.strip() + '.jpg'
send_image(filename)

if __name__ == '__main__':
main()

3. NewYear_card.py :制作电子贺年卡的基础模块,包含图片处理的底层函数,特别是在图片上打印文本字符串内容。

"""
NewYear_card.py : 制作贺年卡公共基础模块
"""
from PIL import Image, ImageDraw, ImageFont
import os
from common.fonts import *

class NYCard:
"""贺年卡 - New Year Card """
def __init__(self, infile, outfile):
self.im = Image.open(infile)
self.outfile = outfile
self.font = '微软雅黑'
self.fontsize = 22
self.color = 'black'
self.font_folder = r'C:\Windows\Fonts'

def set_font(self, font):
"""设置字体"""
self.font = font

def set_color(self, color):
"""设置字体颜色"""
self.color = color

def set_fontsize(self, size):
"""设置字体大小"""
self.fontsize = size

def set_outfile(self, filename):
"""设置贺年卡图片的文件名"""
self.outfile = filename

def output_text(self, xy, greetings):
draw = ImageDraw.Draw(self.im)
use_font = ImageFont.truetype(os.path.join(self.font_folder, chinese_font[self.font]), self.fontsize)
draw.text(xy, greetings, fill=self.color, font=use_font)

def save(self):
self.im.save(self.outfile)

def load_namelist(filename):
""" 加载微信用户与用户称呼 """
name_dict = {}
with open(filename, encoding='utf8') as infile:
for line in infile:
if line.strip():
user, name = line.strip().split('\t')
name_dict[user] = name

return name_dict

4. fonts.py :定义中文字体文件。

"""
fonts.py : 定义中文字体
"""
chinese_font = {
'宋体': 'SIMSUN.TTF',
'黑体': 'SIMHEI.TTF',
'楷体': 'SIMKAI.TTF',
'仿宋': 'SIMFANG.TTF',
'华文彩云': 'STCAIYUN.TTF',
'微软雅黑': 'MSYHL.TTC',
'华文隶书': 'STLITI.TTF',
'华文楷体': 'STKAITI.TTF',
'华文新魏': 'STXINWEI.TTF',
'华文仿宋': 'STFANGSO.TTF',
'思源标准': 'SourceHanSansCN-Normal.otf',
}

模块NewYear_card.py和模块fonts.py 均是存放在包common中。

5. card_template.jpg :电子贺年卡模板图片,图片如下所示:

场景编程集锦– 妖兔闹春


6. name_list.txt :定义微信好友和以及贺年卡上的称谓,之间使用制表键tab分隔,其内容格式如下:

51CTO博客运营-可可 可可

有一片蓝天 李拓总经理

周立可 周工

我是使用Windows notepad编辑的这个文件,注意需要以UTF-8的格式保存name_list.txt


执行效果

环境安装

在Windows环境中安装微信电脑版和相关Python模块。

pip install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

pip install pyautogui -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

pip install pywin32 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

代码组织

程序的目录结构如下:

D:\cases\妖兔闹春>dir

2023/01/16  17:08    <DIR>          cards

2022/04/18  11:05         1,266,369 card_template.jpg

2023/01/16  17:00    <DIR>          common

2023/01/16  16:50               989 make_cards.py

2023/01/16  17:00                84 name_list.txt

2023/01/16  14:43             1,482 send_cards.py


D:\cases\妖兔闹春>cd common

D:\cases\妖兔闹春\common>dir

 2023/01/16  17:00               450 fonts.py

2023/01/16  16:58             1,527 NewYear_card.py

2022/04/17  17:08               103 __init__.py


D:\cases\妖兔闹春\common>

其中common是一个Python包,包含模块NewYear_card.py和模块fonts.py。

执行程序

  1. 启动微信电脑版,进行登录,需要在手机上确认登录,实现消息同步。
  2. python make_cards.py

生成电子贺年卡,贺年卡图片文件是存放在目录cards中。效果如下所示:

场景编程集锦– 妖兔闹春


 3. python send_cards.py

    通过微信实现电子贺年卡批量发送。


程序优化

截止目前,本案例中的程序已经可以实现定制个性化电子贺年卡、微信批量发送贺年卡的功能,具有一个的实用性。但是程序中有部分功能还可以进一步优化提升:

更多贺年卡模板

目前程序中只提供了一个贺年卡图片模板文件:card_template.jpg。如果读者有兴趣,可以增加多个贺年卡图片模板;当然你也完全可以把自己手机上的照片作为贺年卡图片模板,以此可以彰显专属定制电子贺年卡的稀有性和独特性。

定时发送贺年卡

显而易见,定时发送贺年卡有着现实的需求。要实现这个功能,对于Python来说,真的是小菜一碟。我们需要使用一个Python的定时作业模块schedule,就可轻松实现贺年卡的定时发送功能。

图片写字功能完善

在common包中有一个模块NewYear_card.py,其中定义的类NYCard,用于对贺年卡图片进行个性化处理。方法output_text()实现了在图片上打印文字,当前这个版本没有对输出文字是否超出图片的边界范围进行特殊处理,需要在程序的升级中解决这个问题。


更多案例

如果您对Python场景编程感兴趣,下面列出了更多的学习案例,供交流学习和分享。

    1. 场景编程集锦 - 大奖在招手,你要HOLD住
    2. 场景编程集锦 - 世界那么大,我想去看看
    3. 场景编程集锦 - BMI指数与健身达人
    4. 场景编程集锦 - 你是谁?
    5. 场景编程集锦 - 吉米的总统梦想
    6. 场景编程集锦 - 乒坛争锋:孙颖莎vs伊藤美城
    7. 场景编程集锦 - 捏紧你的钱袋子
    8. 场景编程集锦 - 懵懂的青春
    9. 场景编程集锦 - 月光族的期待
    10. 场景编程集锦 - 应对能源危机
    11. 场景编程集锦 - 电闪雷鸣的数学联想