1. 程式人生 > >Python 打造最強表白程式(原始碼)

Python 打造最強表白程式(原始碼)

此程式結合資料抓取 + 微信自動發訊息 + 定時任務,實現一個能每天自動定時給你心愛的 ta 傳送:

你們相識相戀天數 + 情話 + 我愛你的圖片。具體的訊息如下:

每天傳送的訊息格式如下:

    message = """
    親愛的{}:

    早上好,今天是你和 Koc 相戀的第 {} 天~

    今天他想對你說的話是:

    {}

    最後也是最重要的!
    """.format("你的好友名稱", str(inLoveDays), love_word)

這裡需要填寫的第一個欄位是 ta 的稱呼,inLoveDays 為你們相識相戀的天數。

love_word 是每天為 ta 精心準備情話內容,當然如果你的文筆好也可以自己寫。

當然最後也是最重要的!每天不盡相同的「我愛你」圖片!

 

程式思路

本次程式執行的環境是 windows10 + Python 3.6,此次主要用到的庫有 selenium、itchat、request。程式主要分為兩部分第一資料的抓取,一些情話資訊和圖片資訊。另一部就是利用 itchat 自動傳送訊息給你的好友。

情話資訊

如果對你的文筆有信心,那你可以自己寫些情話。當然大部分人的文筆跟我一樣是比較差的,所以這時候我們就可以利用網上的資源,比如下面的情話網站。

http://www.binzz.com/yulu2/3588.html

在抓取這個網站的情話時,如果你利用普通的爬取思路,即利用 request 進行請求,你會發現網頁獲取的資料是亂碼並且不完整。所以在這塊為了操作方便,我利用了 selenium 的 PhantomJS 無頭瀏覽器,來獲取網站的資訊。

通過 selenium + xpath 我們就可以很輕鬆的獲取到網頁情話,最後把獲取到的資料儲存到當前目錄下的「love_word.txt」方便之後的讀取。

表白圖片資源

為了配合此次七夕表白程式,我專門去找了些帶有「我愛你」的圖片資源。通過下面的貼吧貼子,我們就可以獲取到大量的這樣資源。

http://tieba.baidu.com/p/3108805355

 

此貼並沒有很強的反爬措施,所以我簡單的利用 request + re 來獲取到圖片資源,並儲存到當前目錄的下「img」檔案裡。

在儲存圖片資源之前,我會先檢查當前目錄下是否有「img」資料夾,如果沒有則會自動建立。

 

表白程式原始碼

此次表白程式主要有 5 個函式

crawl_Love_words()

此函式通過 selenium + xpath 來抓取情話網站的資源,並存入到當前目錄下的「love_word.txt」檔案。
 

def crawl_Love_words():
    print("正在抓取情話...")
    browser = webdriver.PhantomJS()
    url = "http://www.binzz.com/yulu2/3588.html"
    browser.get(url)
    html = browser.page_source
    Selector = etree.HTML(html)
    love_words_xpath_str = "//div[@id='content']/p/text()"
    love_words = Selector.xpath(love_words_xpath_str)
    for i in love_words:
        word = i.strip("\n\t\u3000\u3000").strip()
        with open(love_word_path, "a") as file:
            file.write(word + "\n")
    print("情話抓取完成")

crawl_love_image()

此函式用來爬取貼吧帶有「我愛你」的圖片資源,通過 request + re 來實現。程式碼並不複雜,在正則表示式那也簡單的寫了一個,用來匹配當前也所有的圖片資源。

def crawl_love_image():
    print("正在抓取我愛你圖片...")
    for i in range(1, 22):
        url = "http://tieba.baidu.com/p/3108805355?pn={}".format(i)
        response = requests.get(url)
        html = response.text
        pattern = re.compile(r'<div.*?class="d_post_content j_d_post_content.*?">.*?<img class="BDE_Image" src="(.*?)".*?>.*?</div>', re.S)
        image_url = re.findall(pattern, html)
        for j, data in enumerate(image_url):
            pics = requests.get(data)
            mkdir(pic_path)
            fq = open(pic_path + '\\' + str(i) + "_" + str(j) + '.jpg', 'wb')  # 下載圖片,並儲存和命名
            fq.write(pics.content)
            fq.close()
    print("圖片抓取完成")

 

mkdir(path)

此函式用來在當前目錄下建立一個新的資料夾,以便儲存相應的資料。

def mkdir(path):
    folder = os.path.exists(path)

    if not folder:  # 判斷是否存在資料夾如果不存在則建立為資料夾
        os.makedirs(path)  # makedirs 建立檔案時如果路徑不存在會建立這個路徑
        print("---  new folder...  ---")
        print("---  OK  ---")
    else:
        print("正在儲存圖片中...")

 

send_new()

此函式通過利用 itchat 庫,實現給你的微信好友自動傳送訊息。在這個函式中我利用 datetime 來計算你們之間相識相戀的時間。並且在登入的時候添加了一個「hotReload=True」,這樣你就可以不用每次執行程式的時候都要登入。關於 itchat 更多的操作,大家可以去網上查詢相應的資料。

def send_news():

    # 計算相戀天數
    inLoveDate = datetime.datetime(2018, 8, 15) # 相戀的時間
    todayDate = datetime.datetime.today()
    inLoveDays = (todayDate - inLoveDate).days

    # 獲取情話
    file_path = os.getcwd() + '\\' + love_word_path
    with open(file_path) as file:
        love_word = file.readlines()[inLoveDays].split(':')[1]

    itchat.auto_login(hotReload=True) # 熱啟動,不需要多次掃碼登入
    my_friend = itchat.search_friends(name=u'你的好友名稱')
    girlfriend = my_friend[0]["UserName"]
    print(girlfriend)
    message = """
    親愛的{}:

    早上好,今天是你和 Koc 相戀的第 {} 天~

    今天他想對你說的話是:

    {}

    最後也是最重要的!
    """.format("你的好友名稱", str(inLoveDays), love_word)
    itchat.send(message, toUserName=girlfriend)

    files = os.listdir(pic_path)
    file = files[inLoveDays]
    love_image_file = "D:\\img\\" + file
    try:
        itchat.send_image(love_image_file, toUserName=girlfriend)
    except Exception as e:
        print(e)

main()

main() 函式就是我們主邏輯函式,程式執行的邏輯順序就是在這個函式裡規定的。在 main() 裡我首先判斷下當前路徑下是否有「love_word.txt」檔案,如果有則提示相應的資訊,沒有的話才去執 crawl_Love_words() 函式,去網上抓取一些情話資料。

其次再判斷下當前目錄下是否有「img」資料夾,用來判斷我們是否有圖片資源,沒有則執行 crawl_love_image() 來抓取貼吧上的圖片資源。

最後我們所需的資料都已準備完善,則呼叫 send_news() 函式,整理下要傳送的資料格式,然後自動給你的 ta 傳送訊息。

定時任務

每天定時傳送我主要是用 while True 簡單的實現,通過判斷當前的時間是否是你所需要傳送的時間,來達到每天定時傳送。

if __name__ == '__main__':
    while True:
        curr_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        love_time = curr_time.split(" ")[1]
        if love_time == "22:46:01":
            main()
            time.sleep(60)
        else:
            print("愛你的每一天都是如此美妙,現在時間:" + love_time)

表白程式使用教程

首先你把相應的原始碼下載下來,後臺回覆「表白」即可獲取。其次把相應的庫先事先安裝好,隨後執行程式則會顯示一個微信網頁登入的二維碼,掃描登入即可。

 

因為我在登入時添加了「hotReload=True」,所以程式在下次執行時就無需再重新登入。

總結

文章標題寫著「最強表白程式」,雖然有點誇張了,但此次的程式還有很多可以繼續新增的地方。比如對於傳送的訊息欄位,我們還可以繼續新增天氣資訊、星座資訊、娛樂新聞、最近的趣事、最近好看的電影等等。只要你能想到的內容,都可以新增上去。

這些資訊在網上都可以獲取的到,我們只要通過同樣的思路,先抓取到本地,然後進行讀取。當然如果你覺得儲存本地會有被刪的風險,那麼你也可以儲存到雲端,在雲端上進行儲存。

原始碼:

連結: https://pan.baidu.com/s/182pk50dLEy0kNYk1uM_mqw 密碼: t9py