Python 將 QQ 好友頭像生成祝福語(yǔ)的實(shí)現(xiàn)代碼
本文我們來(lái)看一下如何使用 Python 將 QQ 好友頭像拼成“五一快樂(lè)”四個(gè)字。我們可以將整個(gè)實(shí)現(xiàn)過(guò)程分為兩步:爬取 QQ 好友頭像、利用好友頭像生成文字。
爬取頭像
爬取 QQ 好友頭像我們需要借助于 QQ 郵箱,首先我們從瀏覽器上登錄 QQ 郵箱,之后按 F12 鍵打開(kāi)開(kāi)發(fā)者工具并用鼠標(biāo)選中 Network 選項(xiàng),如下圖所示:

再接著我們按 F5 鍵刷新一下網(wǎng)頁(yè),然后在 Filter 中輸入 laddr_lastlist ,如下圖所示:

我們?cè)冱c(diǎn) Name 下的鏈接,點(diǎn)擊之后右側(cè)會(huì)出現(xiàn)一個(gè)窗口,我們用鼠標(biāo)選中 Response 項(xiàng),如下圖所示:

我們最后將 Response 下面出現(xiàn)的內(nèi)容復(fù)制到 txt 文件。
獲取了爬取需要用到的東西后我們就可以開(kāi)始實(shí)現(xiàn)爬取了,我們使用 requests 庫(kù)將頭像圖片爬取來(lái)下存到本地,代碼實(shí)現(xiàn)如下所示:
# 獲取頭像
def get_head():
file = codecs.open('qqfriends.txt', 'rb', 'utf-8')
s = file.read()
pattern = re.compile(r'\d+@qq.com')
# 正則表達(dá)式匹配所有的 qq 號(hào)
all_mail = pattern.findall(s)
# 用于存儲(chǔ)需要訪問(wèn)的鏈接
all_link = []
url = 'http://qlogo.store.qq.com/qzone/'
for mail in all_mail:
qq = mail.replace('@qq.com', '')
l = url + qq + '/' + qq + '/100'
all_link.append(l)
# 初始化下載圖片數(shù)量
i = 0
# 獲取朋友頭像數(shù)量
friends_count = len(all_link)
print('共{}個(gè)頭像'.format(friends_count))
# 遍歷鏈接,下載頭像
for link in all_link:
i += 1
saveurl = 'head/' + str(i) + '.png'
print('第 %d 個(gè)' % i, end=' ')
sava2img(link, saveurl)
return True
# 存儲(chǔ)圖片函數(shù),picurl 是圖片的 URL,saveurl 是本地存儲(chǔ)位置
def sava2img(picurl, saveurl):
try:
start = time.time()
response = requests.get(picurl, stream=True)
# 下載圖片到本地
with open(saveurl, 'wb') as file:
file.write(response.content)
print('下載完成...', end=' ')
end = time.time()
time_ = end - start
print('用時(shí): %.2f秒' % (time_))
return True
except:
print('出錯(cuò)了...')
生成文字
現(xiàn)在 QQ 頭像圖片已經(jīng)有了,我們?cè)倏匆幌氯绾斡眠@些圖片生成文字,這里需要用到一下第三方庫(kù) PIL ,安裝使用 pip install Pillow ,我們需要先將 “五一快樂(lè)” 四個(gè)字轉(zhuǎn)化為漢字庫(kù)的點(diǎn)陣數(shù)據(jù)再使用,現(xiàn)在看一下具體實(shí)現(xiàn):
# 將字轉(zhuǎn)化為漢字庫(kù)的點(diǎn)陣數(shù)據(jù)
def char2bit(textStr):
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
target = []
global count
count = 0
for x in range(len(textStr)):
text = textStr[x]
rect_list = [] * 16
for i in range(16):
rect_list.append([] * 16)
gb2312 = text.encode('gb2312')
hex_str = binascii.b2a_hex(gb2312)
result = str(hex_str, encoding='utf-8')
area = eval('0x' + result[:2]) - 0xA0
index = eval('0x' + result[2:]) - 0xA0
offset = (94 * (area-1) + (index-1)) * 32
font_rect = None
with open("HZK16", "rb") as f:
f.seek(offset)
font_rect = f.read(32)
for k in range(len(font_rect) // 2):
row_list = rect_list[k]
for j in range(2):
for i in range(8):
asc = font_rect[k * 2 + j]
flag = asc & KEYS[i]
row_list.append(flag)
output = []
for row in rect_list:
for i in row:
if i:
output.append('1')
count+=1
else:
output.append('0')
target.append(''.join(output))
return target
# 生成圖片文字
def head2char(workspace,folder,self,outlist):
# 將工作路徑轉(zhuǎn)移至頭像文件夾
os.chdir(folder)
# 獲取文件夾內(nèi)頭像列表
imgList = os.listdir(folder)
# 獲取頭像圖片個(gè)數(shù)
numImages = len(imgList)
# 設(shè)置頭像裁剪后尺寸
eachSize = 100
# 變量 n 用于循環(huán)遍歷頭像圖片
n=0
# 變量 count 用于為最終生成的單字圖片編號(hào)
count = 0
# 初始化顏色列表,用于背景著色
colorlist = ['#FFFACD','#F0FFFF','#BFEFFF','#b7facd','#ffe7cc','#fbccff','#d1ffb8','#febec0','#E0EEE0']
# index 用來(lái)改變不同字的背景顏色
index = 0
# 每個(gè) item 對(duì)應(yīng)不同字的點(diǎn)陣信息
for item in outlist:
# 將工作路徑轉(zhuǎn)到頭像所在文件夾
os.chdir(folder)
# 新建一個(gè)帶有背景色的畫(huà)布,16 * 16點(diǎn)陣,每個(gè)點(diǎn)處填充 2 * 2 張頭像圖片,故長(zhǎng)為 16 * 2 * 100
canvas = Image.new('RGB', (3200, 3200), colorlist[index]) # 新建一塊畫(huà)布
# index 變換,用于變換背景顏色
index = (index+1)%9
count += 1
# 每個(gè) 16 * 16 點(diǎn)陣中的點(diǎn),用四張 100 * 100 的頭像來(lái)填充
for i in range(16*16):
# 點(diǎn)陣信息為 1,即代表此處要顯示頭像來(lái)組字
if item[i] == "1":
# 循環(huán)讀取連續(xù)的四張頭像圖片
x1 = n % len(imgList)
x2 = (n+1) % len(imgList)
x3 = (n+2) % len(imgList)
x4 = (n+3) % len(imgList)
# 以下四組 try,將讀取到的四張頭像填充到畫(huà)板上對(duì)應(yīng)的一個(gè)點(diǎn)位置
# 點(diǎn)陣處左上角圖片 1/4
try:
# 打開(kāi)圖片
img = Image.open(imgList[x1])
except IOError:
print("有1張圖片讀取失敗,已使用備用圖像替代")
img = Image.open(self)
finally:
# 縮小圖片
img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
# 拼接圖片
canvas.paste(img, ((i % 16) * 2 * eachSize, (i // 16) * 2 * eachSize))
# 點(diǎn)陣處右上角圖片 2/4
try:
img = Image.open(imgList[x2])
except IOError:
print("有1張圖片讀取失敗,已使用備用圖像替代")
img = Image.open(self)
finally:
img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, (i // 16) * 2 * eachSize))
# 點(diǎn)陣處左下角圖片 3/4
try:
img = Image.open(imgList[x3])
except IOError:
print("有1張圖片讀取失敗,已使用備用圖像替代")
img = Image.open(self)
finally:
img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
canvas.paste(img, ((i % 16) * 2 * eachSize, ((i // 16) * 2 + 1 ) * eachSize))
# 點(diǎn)陣處右下角圖片 4/4
try:
img = Image.open(imgList[x4])
except IOError:
print("有1張圖片讀取失敗,已使用備用圖像替代")
img = Image.open(self)
finally:
img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, ((i // 16) * 2 + 1) * eachSize))
#調(diào)整 n 以讀取后續(xù)圖片
n= (n+4) % len(imgList)
os.chdir(workspace)
# 創(chuàng)建文件夾用于存儲(chǔ)輸出結(jié)果
if not os.path.exists('output'):
os.mkdir('output')
os.chdir('output')
# 存儲(chǔ)將拼接后的圖片,quality 為圖片質(zhì)量,1 - 100,100 最高
canvas.save('result%d.jpg'% count, quality=100)
看一下實(shí)現(xiàn)效果:

到此這篇關(guān)于用 Python 將 QQ 好友頭像生成祝福語(yǔ)的文章就介紹到這了,更多相關(guān)python qq好友祝福語(yǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python裝飾器入門(mén)學(xué)習(xí)教程(九步學(xué)習(xí))
裝飾器(decorator)是一種高級(jí)Python語(yǔ)法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。本文給大家介紹Python裝飾器入門(mén)學(xué)習(xí)教程(九步學(xué)習(xí)),對(duì)python裝飾器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例
這篇文章主要介紹了Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Pytorch中expand()的使用(擴(kuò)展某個(gè)維度)
這篇文章主要介紹了Pytorch中expand()的使用(擴(kuò)展某個(gè)維度),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python編程項(xiàng)目中線上問(wèn)題排查與解決
因?yàn)闃I(yè)務(wù)上的設(shè)計(jì)存在問(wèn)題,導(dǎo)致數(shù)據(jù)庫(kù)表總是被鎖,而且是不定期的鎖定,導(dǎo)致服務(wù)器運(yùn)行異常,今天就來(lái)跟大家說(shuō)說(shuō)該如何避免這種問(wèn)題2021-11-11
在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程
這篇文章主要介紹了在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程,本文選擇以flask框架作為示例,需要的朋友可以參考下2015-05-05
pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹
這篇文章主要介紹了pytorch之關(guān)于PyTorch結(jié)構(gòu)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
pycharm激活碼2020最新分享適用pycharm2020最新版親測(cè)可用
這篇文章主要介紹了pycharm激活碼2020最新分享適用pycharm2020最新版親測(cè)可用,同時(shí)也支持Intellij IDEA激活碼,PHPStorm激活碼大家可以放心使用需要的朋友可以參考下2020-11-11
使用python腳本自動(dòng)創(chuàng)建pip.ini配置文件代碼實(shí)例
這篇文章主要介紹了使用python腳本自動(dòng)創(chuàng)建pip.ini配置文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

