天天看點

python實作騷操作,表白神技:整個朋友圈都是愛你的樣子

你還在為撩不到妹而煩惱嗎?

是你不夠帥嗎?

還是不夠幽默?

不,是因為你沒有關注我!

關注學一波騷操作,學完撩妹,妹子都排到火車站了。

今天要給大家分享一手操作是教你如何用微信好友的頭像拼成想要的文字。

我給這個項目取了一個好聽的名字叫“整個朋友圈都是愛你的樣子!”

不多bb,我們先看一下效果圖。

當然我們的效果圖不會像下面這張圖所說那樣子。

python實作騷操作,表白神技:整個朋友圈都是愛你的樣子

當然值得一提的是,這裡提供思路和代碼,同時還有很大的發展空間可以讓這個項目更加的有魅力。

效果圖

python實作騷操作,表白神技:整個朋友圈都是愛你的樣子

bb兩句上面的到底是啥東西。

上面的三個大字“愛你哦”,是用我的500好友的頭拼接而成的,是不是很血腥!

不,是我朋友圈的所有好友的頭像,拼接而成的,這不就是“整個朋友圈都是愛你的樣子!”

這13裝的,我給你滿分,多一分都不行。

OK,客套話結束了,接下來就是展示真功夫的時候。

直接上項目:https://github.com/pengfexue2/pic2char

稍微介紹一下,項目的主要内容:

python實作騷操作,表白神技:整個朋友圈都是愛你的樣子

代碼說明: wx2char.py用來掃碼登入微信,擷取微信好友頭像存儲到本地,将頭像圖檔拼接成inpt = "二零一九新年快樂!"中的文本内容。 1.需要先安裝PIL和itchat庫 2.運作代碼時需要掃碼登入微信網頁版 3.目前點陣庫是依靠漢字庫實作的,即檔案夾中的HZK16檔案,輸入文本時要求是漢字和中文标點,否則可能導緻報錯 4.若出現“有1位朋友的頭像讀取失敗,已使用本人頭像替代”字樣,是正常現象,因為有的微信好友頭像格式問題擷取不到

pic2char.py是假設你想用别的圖檔來組成文字圖檔,無需擷取微信頭像,直接輸入漢字用圖檔來拼接展示 1.需要PIL庫 2.需要HZK16檔案來擷取漢字點陣資訊 3.運作代碼前,要将圖檔檔案夾放到代碼檔案夾中,将代碼中的user="TED"改為檔案夾名稱,同時準備一張備用圖檔将路徑指派給self用作讀取圖檔失敗時備選替代

使用說明: 拿到代碼後,可以選擇修改wx2char.py中要輸出的文本内容,儲存後直接運作,會跳出二維碼圖檔,掃碼登入微信網頁版,生成微信好友頭像的檔案夾(例如:TED檔案夾),本人的微信頭像(TED.jpg),和最終結果圖檔的檔案夾(TED_output)

因為如果好友數目太多會導緻讀取微信頭像耗時較長,是以準備了pic2char.py用來玩把圖檔轉成漢字的功能,提前準備好圖檔檔案夾和一張備用圖檔,在代碼中對應修改好即可運作

握草。這麼能BB的嗎?

Talk is cheap. Show me the code

那麼我們 直接開始實戰操作的講解吧

(1)wx2char.py用來掃碼登入微信,擷取微信好友頭像存儲到本地,将頭像圖檔拼接成inpt = "愛你哦!"中的文本内容。

import binascii
import os
from PIL import Image
import itchat

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
                    #print('0', end=' ')
                else:
                    output.append('0')
                    #print('.', end=' ')
            #print()

        target.append(''.join(output))
    return target

def getHeadImgs():
    #通過二維碼登入微信網頁版
    itchat.auto_login()
    #擷取微信好友資訊清單
    friendList = itchat.get_friends(update=True)

    #這裡會用到的微信好友資訊如下: User= {'UserName': '@8238e922e8be7356b1750c306cb75768','PYQuanPin': 'TED','NickName': 'TED'}
    #擷取使用者個人昵稱,用于之後檔案夾命名、使用者頭像命名
    if friendList[0]['PYQuanPin']:
        user = friendList[0]['PYQuanPin']
    else:
        user = friendList[0]['NickName']

    #先讀取使用者本人頭像,存儲名為使用者名稱
    selfHead = "{}/{}.jpg".format(os.getcwd(),user)
    with open(selfHead,'wb') as f:
        head = itchat.get_head_img(friendList[0]['UserName'])
        f.write(head)

    #建立檔案夾用于存儲好友頭像
    if not os.path.exists(user):
        os.mkdir(user)

    #工作路徑轉到建立檔案夾中
    os.chdir(user)
    #擷取建立檔案夾路徑
    userspace = os.getcwd()


    #開始讀取好友頭像寫入建立檔案夾中
    print("開始讀取%d位好友頭像..."%(len(friendList)-1))
    for i in range(1,len(friendList)):
        if i % 100 ==0:
            print("已讀取%d位好友頭像,請耐心等待~"%i)
        try:
            friendList[i]['head_img'] = itchat.get_head_img(userName=friendList[i]['UserName'])
            friendList[i]['head_img_name'] = "%s.jpg" % friendList[i]['UserName']
        except ConnectionError:
            print('Fail to get %s' % friendList[i]['UserName'])

        with open(friendList[i]['head_img_name'],'wb') as f:
            f.write(friendList[i]['head_img'])
    print("讀取好友頭像完畢!")

    #儲存頭像的檔案夾路徑和使用者本人頭像路徑傳回
    return user, selfHead

def head2char(workspace,user,self,outlist):

    folder = "{}\\{}".format(workspace,user)
    #将工作路徑轉移至頭像檔案夾
    os.chdir(folder)
    #擷取檔案夾内頭像清單
    imgList = os.listdir(folder)
    #擷取頭像圖檔個數
    numImages = len(imgList)
    #設定頭像裁剪後尺寸
    eachSize = 100

    #變量n用于循環周遊頭像圖檔,即當所需圖檔大于頭像總數時,循環使用頭像圖檔
    n=0

    #變量count用于為最終生成的單字圖檔編号
    count = 0

    #img = Image.open(self)

    #初始化顔色清單,用于背景着色:FFFACD黃色 #F0FFFF白  #BFEFFF 藍  #b7facd青色 #ffe7cc淺橙色  #fbccff淺紫色 #d1ffb8淡綠 #febec0淡紅 #E0EEE0灰
    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
        #如果想要白色背景,将colorlist[index]改為'#FFFFFF'
        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, 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, eachSize), Image.ANTIALIAS)  # 縮小圖檔
                    canvas.paste(img, ((i % 16) * 2 * 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, eachSize), Image.ANTIALIAS)  # 縮小圖檔
                    canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, ((i // 16) * 2 + 1) * eachSize))  # 拼接圖檔
                #調整n以讀取後續圖檔
                n= (n+4) % len(imgList)

        os.chdir(workspace)
        # 建立檔案夾用于存儲輸出結果
        if not os.path.exists('{}_output'.format(user)):
            os.mkdir('{}_output'.format(user))
        os.chdir('{}_output'.format(user))
        #quality代表圖檔品質,1-100
        canvas.save('result%d.jpg'% count, quality=100)



if __name__=="__main__":
    #将想轉化的字賦給字元串
    inpt = "生日快樂,事事順心!"

    #将字轉化為漢字庫的點陣資料
    outlist = char2bit(inpt)

    #擷取目前檔案夾路徑
    workspace = os.getcwd()

    #擷取使用者本人名稱和使用者本人頭像路徑
    user,self = getHeadImgs()

    #将頭像圖檔按點陣拼接成單字圖檔
    head2char(workspace,user,self,outlist)
    print("Well done!")      

注意修改:主函數中的inpt的漢字内容,同時注意window和linux中的路徑中“\”和“/”的不同,進行修改否則會出錯(對于pic2char.py也是一樣的)

(2)pic2char.py是假設你想用别的圖檔來組成文字圖檔,無需擷取微信頭像,直接輸入漢字用圖檔來拼接展示

使用

這裡我使用的是python3.6

在運作代碼前,需先安裝PIL和itchat庫

(1)無好友頭像庫的情況:

wx2char.py運作後,掃描二維碼,即可登入并讀取好友,等待片刻即可輸出結果