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