使用itchat庫,實現微信的登錄和好友信息的獲取,將獲取的好友頭像進行拼接生成照片牆,拼接時加限制條件生成心形照片牆,
獲取好友個性簽名生成詞雲。
涉及:
1. itchat的簡單使用
2. 圖像拼接
3. 按照指定規則進行圖像拼接,生成心形圖像
4. wordcloud生成詞雲
詳解:
-
相關庫的安裝
pip install itchat 微信接口模塊
pip install wordcloud 詞雲模塊
pip install jieba jieba分詞模塊
-
登錄微信,獲取好友頭像及個性簽名
def get_wechat(self):
try:
# 加上hotReload=True,就會保留登錄的狀態,至少在後面的幾次登錄過程中不會再次掃描二維碼,
# 該參數生成一個靜態文件itchat.pkl用於存儲登錄狀態
# itchat.auto_login(hotReload=True)
# 掃碼登錄
itchat.auto_login()
except:
print("請檢查網絡,再重試")
# 獲取微信好友
friends = itchat.get_friends(update=True)
# 創建photo_image文件夾來保存微信頭像圖片
if not os.path.exists('photo_image'):
# 若文件夾不存在,則創建目錄
os.mkdir('photo_image')
num=0
for friend in friends:
# 根據用戶名獲取對應的微信頭像
img=itchat.get_head_img(userName=friend['UserName'])
# 圖片路徑名
img_name=''.join(['photo_image/img',str(num),'.jpg'])
# 保存圖片
with open(img_name,'wb') as f:
f.write(img)
num+=1
# 獲取生成詞雲需要的所有好友的個性簽名
signature=friend['Signature'].strip()
# 剔除個性簽名爲空以及含span標籤的,將所有簽名通過空格拼成字符串
if len(signature)>0 and not '<span class=' in signature:
self.signature_txt+=signature+' '
-
拼接頭像,生成照片牆
def merge_image(self):
# 獲取指定路徑下的文件列表
all_image=os.listdir('photo_image')
# 設定每個頭像的大小
each_size=int(math.sqrt(float(1024*1024)/len(all_image)))
# 照片牆的行數
lines=int(1024/each_size)
print(lines)
# 創建Image對象,初始化大小
image=Image.new('RGBA',(1024,1024))
x,y=0,0
for i in range(len(all_image)):
try:
img = Image.open(''.join(['photo_image/img', str(i), '.jpg']))
# 重新設置圖像大小
img = img.resize((each_size, each_size), Image.ANTIALIAS)
# 根據x,y座標位置拼接圖像
image.paste(img, (x * each_size, y * each_size))
# 更新下一張圖像位置
x += 1
except:
pass
finally:
# 一行一行拼接
if x == lines:
x = 0
y += 1
# 保存生成的照片牆
# RGBA意思是紅色,綠色,藍色,Alpha的色彩空間,Alpha指透明度。而JPG不支持透明度,所以要麼丟棄Alpha,要麼保存爲.png文件
image.save('photo_image/photo_wall.png')
itchat.send_msg('好友頭像照片牆', 'filehelper')
# 發送圖像到微信文件傳輸助手,打開手機微信可查看
itchat.send_image('photo_image/photo_wall.png','filehelper')
-
心形函數
在直角座標系中,愛心線的方程的python 表達爲:
x** 2+ y** 2 + a * x= a * sqrt(x** 2+y** 2)
x** 2+ y** 2 - a * x= a * sqrt(x** 2+y** 2)
# 計算心形,判斷圖像的座標是否在心形函數內
@classmethod
def get_heart_shape(cls,x,y):
y1 = 0.618 * np.abs(x) - 0.7 * np.sqrt(262144 - x ** 2)
y2 = 0.618 * np.abs(x) + 0.7 * np.sqrt(262144 - x ** 2)
if y<y1 or y>y2:
return False
else:
return True
-
拼接心形照片牆
# 拼接爲心形照片牆
def merge_love_image(self):
# 獲取指定路徑下的文件列表
all_image=os.listdir('photo_image')
# 設定每個頭像的大小
each_size=int(math.sqrt(float(1024*1024)/len(all_image)))
# 一行的圖像個數,若爲偶數個,則+1轉換爲奇數個,修改每個圖像的大小,使最後的心形對稱好看
num=int(1024/each_size)
if num%2==0:
num+=1
each_size=int(1024/num)
# 照片牆的行數
lines=int(1024/each_size)
print(lines)
# 創建Image對象,初始化大小,其大小不直接設定爲(1024*1024),因爲照片拼接出的尺寸不是正好等於1024,故用實際拼接的尺寸
image=Image.new('RGBA',(lines*each_size,lines*each_size))
x,y=0,0
for i in range(len(all_image)):
try:
# 由於圖像座標從(0,0)開始,而心形函數對應左上角座標爲(-512,512),故此在判斷座標時,稍作轉換
is_heart_part=self.get_heart_shape(-512+x * each_size,512-y * each_size)
if not is_heart_part:
pass
else:
img = Image.open(''.join(['photo_image/img', str(i), '.jpg']))
# 重新設置圖像大小
img = img.resize((each_size, each_size), Image.ANTIALIAS)
# 根據x,y座標位置拼接圖像
image.paste(img, (x * each_size, y * each_size))
# 更新下一張圖像位置
x += 1
except:
pass
finally:
# 一行一行拼接
if x == lines:
x = 0
y += 1
-
個性簽名生成詞雲
# 生成詞雲
def get_wordcloud(self):
try:
image = np.array(Image.open('./namei.jpeg'))
# jieba分詞
signature_txt_list = jieba.cut(self.signature_txt, cut_all=False)
jieba_txt = ' '.join(signature_txt_list)
# 生成詞雲
wordcloud = WordCloud(font_path=r'C:\Windows\Fonts\msyh.ttc', # 調用系統自帶字體(微軟雅黑)
background_color='white', # 背景色
max_words=500, # 最大顯示單詞數
max_font_size=60, # 頻率最大單詞字體大小
mask=image # 自定義顯示的效果圖
).generate(jieba_txt)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
# 保存爲圖片
wordcloud.to_file('./signature_wordcloud.png')
itchat.send_msg('好友個性簽名詞雲', 'filehelper')
# tips: 發送的圖片名稱必須爲英文,若爲中文,會發送失敗
itchat.send_image('signature_wordcloud.png', 'filehelper')
except:
print('詞雲生成失敗,請重試')
運行結果:
運行程序,彈出二維碼,掃描登錄
等待圖像下載拼接,結果將發送到微信的文件傳輸助手
直接拼接的照片牆
心形圖
心形照片牆
個性簽名詞雲
背景圖
詞雲