Python打造最強表白程式

AI科技大本營發表於2019-02-16

640?wx_fmt=png


作者 | 痴海

轉載自公眾號痴海(ID:ch726612)


情人節剛過,朋友圈又是刷屏的節奏。但熱鬧總是別人的,我們好像只有吃狗糧的份。時間總是飛快流逝,很多事情早已改變,但彷彿只有你的單身狀態從未改變。


單身久的我們,好像覺得一個人過也沒什麼的。但即使非常享受單身生活,大家也要保持“可勾搭”的待機狀態,因為促進荷爾蒙分沁有益身心健康。


在這個人人都在秀的時候,做為程式設計師我們也要操作起來!散發你們的荷爾蒙!今天就大家奉獻上最強表白程式!此程式結合資料抓取 + 微信自動發訊息 + 定時任務,實現一個能每天自動定時給你心愛的 ta 傳送:你們相識相戀天數 + 情話 + 我愛你的圖片。具體的訊息如下。


640?wx_fmt=png


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


    message = """
    親愛的{}:

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

    今天他想對你說的話是:

    {}

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


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


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


640?wx_fmt=png


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


640?wx_fmt=jpeg


程式思路


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


情話資訊


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


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


640?wx_fmt=png


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


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


表白圖片資源


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


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


640?wx_fmt=png


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


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


表白程式原始碼


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


640?wx_fmt=png


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(122):
        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(2018815# 相戀的時間
    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 簡單的實現,通過判斷當前的時間是否是你所需要傳送的時間,來達到每天定時傳送。


表白程式使用教程


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


640?wx_fmt=png


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


總結


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


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


(本文為AI科技大本營原創文章,轉載請微信聯絡 1092722531)

精彩推薦

640?wx_fmt=png

推薦閱讀:

                         640?wx_fmt=png

點選“閱讀原文”,開啟CSDN APP 閱讀更貼心。

相關文章