1. 程式人生 > 程式設計 >Python 將 QQ 好友頭像生成祝福語的實現程式碼

Python 將 QQ 好友頭像生成祝福語的實現程式碼

本文我們來看一下如何使用 Python 將 QQ 好友頭像拼成“五一快樂”四個字。我們可以將整個實現過程分為兩步:爬取 QQ 好友頭像、利用好友頭像生成文字。

爬取頭像

爬取 QQ 好友頭像我們需要藉助於 QQ 郵箱,首先我們從瀏覽器上登入 QQ 郵箱,之後按 F12 鍵開啟開發者工具並用滑鼠選中 Network 選項,如下圖所示:

Python 將 QQ 好友頭像生成祝福語的實現程式碼

再接著我們按 F5 鍵重新整理一下網頁,然後在 Filter 中輸入 laddr_lastlist ,如下圖所示:

Python 將 QQ 好友頭像生成祝福語的實現程式碼

我們再點 Name 下的連結,點選之後右側會出現一個視窗,我們用滑鼠選中 Response 項,如下圖所示:

Python 將 QQ 好友頭像生成祝福語的實現程式碼

我們最後將 Response 下面出現的內容複製到 txt 檔案。

獲取了爬取需要用到的東西后我們就可以開始實現爬取了,我們使用 requests 庫將頭像圖片爬取來下存到本地,程式碼實現如下所示:

# 獲取頭像
def get_head():
 file = codecs.open('qqfriends.txt','rb','utf-8')
 s = file.read()
 pattern = re.compile(r'\[email protected]')
 # 正則表示式匹配所有的 qq 號
 all_mail = pattern.findall(s)
 # 用於儲存需要訪問的連結
 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)
 # 初始化下載圖片數量
 i = 0
 # 獲取朋友頭像數量
 friends_count = len(all_link)
 print('共{}個頭像'.format(friends_count))
 # 遍歷連結,下載頭像
 for link in all_link:
 i += 1
 saveurl = 'head/' + str(i) + '.png'
 print('第 %d 個' % i,end=' ')
 sava2img(link,saveurl)
 return True

# 儲存圖片函式,picurl 是圖片的 URL,saveurl 是本地儲存位置
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('用時: %.2f秒' % (time_))
 return True
 except:
 print('出錯了...')

生成文字

現在 QQ 頭像圖片已經有了,我們再看一下如何用這些圖片生成文字,這裡需要用到一下第三方庫 PIL ,安裝使用 pip install Pillow ,我們需要先將 “五一快樂” 四個字轉化為漢字型檔的點陣資料再使用,現在看一下具體實現:

# 將字轉化為漢字型檔的點陣資料
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):
 # 將工作路徑轉移至頭像資料夾
 os.chdir(folder)
 # 獲取資料夾內頭像列表
 imgList = os.listdir(folder)
 # 獲取頭像圖片個數
 numImages = len(imgList)
 # 設定頭像裁剪後尺寸
 eachSize = 100
 # 變數 n 用於迴圈遍歷頭像圖片
 n=0
 # 變數 count 用於為最終生成的單字圖片編號
 count = 0
 # 初始化顏色列表,用於背景著色
 colorlist = ['#FFFACD','#F0FFFF','#BFEFFF','#b7facd','#ffe7cc','#fbccff','#d1ffb8','#febec0','#E0EEE0']
 # index 用來改變不同字的背景顏色
 index = 0
 # 每個 item 對應不同字的點陣資訊
 for item in outlist:
 # 將工作路徑轉到頭像所在資料夾
 os.chdir(folder)
 # 新建一個帶有背景色的畫布,16 * 16點陣,每個點處填充 2 * 2 張頭像圖片,故長為 16 * 2 * 100
 canvas = Image.new('RGB',(3200,3200),colorlist[index]) # 新建一塊畫布
 # index 變換,用於變換背景顏色
 index = (index+1)%9
 count += 1
 # 每個 16 * 16 點陣中的點,用四張 100 * 100 的頭像來填充
 for i in range(16*16):
  # 點陣資訊為 1,即代表此處要顯示頭像來組字
  if item[i] == "1":
  # 迴圈讀取連續的四張頭像圖片
  x1 = n % len(imgList)
  x2 = (n+1) % len(imgList)
  x3 = (n+2) % len(imgList)
  x4 = (n+3) % len(imgList)
  # 以下四組 try,將讀取到的四張頭像填充到畫板上對應的一個點位置
  # 點陣處左上角圖片 1/4
  try:
   # 開啟圖片
   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))
  # 點陣處右上角圖片 2/4
  try:
   img = Image.open(imgList[x2])
  except IOError:
   print("有1張圖片讀取失敗,已使用備用影象替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize,Image.ANTIALIAS)
   canvas.paste(img,(((i % 16) * 2 + 1) * eachSize,(i // 16) * 2 * eachSize))
  # 點陣處左下角圖片 3/4
  try:
   img = Image.open(imgList[x3])
  except IOError:
   print("有1張圖片讀取失敗,已使用備用影象替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize,((i // 16) * 2 + 1 ) * eachSize))
  # 點陣處右下角圖片 4/4
  try:
   img = Image.open(imgList[x4])
  except IOError:
   print("有1張圖片讀取失敗,已使用備用影象替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize,((i // 16) * 2 + 1) * eachSize))
  #調整 n 以讀取後續圖片
  n= (n+4) % len(imgList)
 os.chdir(workspace)
 # 建立資料夾用於儲存輸出結果
 if not os.path.exists('output'):
  os.mkdir('output')
 os.chdir('output')
 # 儲存將拼接後的圖片,quality 為圖片質量,1 - 100,100 最高
 canvas.save('result%d.jpg'% count,quality=100)

看一下實現效果:

Python 將 QQ 好友頭像生成祝福語的實現程式碼

到此這篇關於用 Python 將 QQ 好友頭像生成祝福語的文章就介紹到這了,更多相關python qq好友祝福語內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!