場景編程集錦– 妖兔鬧春

2023-01-17 12:09:20 來源:51CTO博客

場景描述

為慶祝中國農歷春節,中國郵政每年都會發行生肖紀念郵票。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個文件或模塊構成:

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 timefrom PIL import Imagefrom io import BytesIOimport pyautoguiimport pyperclipimport win32clipboard as clipimport win32confrom common.NewYear_card import load_namelistdef 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, ImageFontimport osfrom 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

cards

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

2023/01/16 17:00

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\妖兔鬧春>cdcommon

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

2023/01/1617: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。

執行程序

啟動微信電腦版,進行登錄,需要在手機上確認登錄,實現消息同步。python make_cards.py

生成電子賀年卡,賀年卡圖片文件是存放在目錄cards中。效果如下所示:?

3. python send_cards.py?

通過微信實現電子賀年卡批量發送。


程序優化

截止目前,本案例中的程序已經可以實現定制個性化電子賀年卡、微信批量發送賀年卡的功能,具有一個的實用性。但是程序中有部分功能還可以進一步優化提升:?

更多賀年卡模板

目前程序中只提供了一個賀年卡圖片模板文件:card_template.jpg。如果讀者有興趣,可以增加多個賀年卡圖片模板;當然你也完全可以把自己手機上的照片作為賀年卡圖片模板,以此可以彰顯專屬定制電子賀年卡的稀有性和獨特性。

定時發送賀年卡

顯而易見,定時發送賀年卡有著現實的需求。要實現這個功能,對于Python來說,真的是小菜一碟。我們需要使用一個Python的定時作業模塊schedule,就可輕松實現賀年卡的定時發送功能。

圖片寫字功能完善

在common包中有一個模塊NewYear_card.py,其中定義的類NYCard,用于對賀年卡圖片進行個性化處理。方法output_text()實現了在圖片上打印文字,當前這個版本沒有對輸出文字是否超出圖片的邊界范圍進行特殊處理,需要在程序的升級中解決這個問題。


更多案例

如果您對Python場景編程感興趣,下面列出了更多的學習案例,供交流學習和分享。

場景編程集錦 - 大獎在招手,你要HOLD住場景編程集錦 - 世界那么大,我想去看看場景編程集錦 - BMI指數與健身達人場景編程集錦 - 你是誰?場景編程集錦 - 吉米的總統夢想場景編程集錦 - 乒壇爭鋒:孫穎莎vs伊藤美城場景編程集錦 - 捏緊你的錢袋子場景編程集錦 - 懵懂的青春場景編程集錦 - 月光族的期待場景編程集錦 - 應對能源危機場景編程集錦 - 電閃雷鳴的數學聯想

標簽: 設置字體 節日問候

上一篇:全球快資訊丨JumpServer 常見問題處理
下一篇:全球焦點!如何理解 logrotate 實用工具?請收下這份保姆級教程