大家好,我是早起。

今天是大年初二,本來是可以好好在家休息,但是考慮到明天就是

情人節

了,加上最近後臺求往期情人節/520/七夕表白文章的程式碼人數又多了起來,我就再給大家分享一招

每天早上用Python給TA的微信傳送問候

大致效果如下,只要程式寫好了每天早上就會自動給小姐姐傳送一條問候訊息。

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

思路分析

看上去有點複雜,又要爬天氣又要爬路況,但只要將思路分析清楚就能輕鬆搞定,本專案大致分為三塊

爬取相關資訊(日期、時間、路況)

構建內容並推送訊息至微信

每天定時執行

下面我們來逐個擊破。

爬取相關資訊

首先我們需要先把後面要用到的相關資訊爬取並存儲,先匯入相關庫

import requests

import re

from bs4 import BeautifulSoup

import time

import datetime

import random

import pandas as pd

from urllib import request, parse

import warnings

warnings。filterwarnings(“ignore”)

1、日期和天氣

第一步是日期和天氣,那妹子所在的城市肯定需要有,之後隨便找一個天氣預報網站,此處以天氣網為例

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

我們需要把圖中紅框部分提取,這裡沒什麼難點,使用requests即可,因為頁面很簡單

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

甚至也不需要什麼反爬措施,畢竟每天就請求一次,完整程式碼如下

r = requests。get(‘https://www。tianqi。com/hangzhou/’)

soup = BeautifulSoup(r。text)

date = soup。find_all(‘dd’,class_ = ‘week’)[0]。text。strip()

date = re。sub(u‘\u3000’, “,”, date)

time_now = time。strftime(“%H:%M:%S”, time。localtime())

weather =soup。select(‘dd > span’)[0]。text

air = soup。select(‘dd > h5’)[0]。text

time1 = datetime。datetime。strptime(time_now,“%H:%M:%S”)

time2 = datetime。datetime。strptime(‘9:30:00’,“%H:%M:%S”)

time3 = round((time2 - time1)。total_seconds() / 60)

requests。ge

t請求,

bs4

解析儲存資料,最後用datetime模組去計算時間差即可。現在日期和天氣就搞定了。

2、交通訊息

這一步需要完成的就是計算小姐姐家庭地址到公司的交通耗時、路況等資訊,所以至少你要知道妹子家住哪裡,公司又位於何處。

之後要做的是將地址轉換為經緯度,方便程式碼去識別。

完成這一個需求可以使用爬蟲透過線上的經緯度轉換網站來實現,也可以使用一些專業的API比如百度、高德等,這裡我們使用百度地圖開放平臺。

使用API並不是直接就能呼叫,首先需要去申請一個AK,開啟百度地圖開放平臺

http://lbsyun。baidu。com/

登陸之後依次點選

控制檯#FormatImgID_7#建立應用#FormatImgID_8#選擇服務端

,按照指示建立一個地圖視覺化應用,以申請到AK結束

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

之後啟動

Jupyter Notebook

,只要不到十行程式碼就能將地址轉成經緯度,直接看程式碼,沒有什麼特別需要解釋的,利用地址和AK

構造查詢UR

L,之後使用requests請求並取出經緯度,程式碼拿走就能用

import pandas as pd

import requests

AK = “替換為你申請的AK”

def get_

position(name

,AK):

url = f‘http://api。map。baidu。com/geocoding/v3/?address={name}&output=json&ak={AK}’

res = requests。get(url)

val = res。json()

retval = {‘地址’:name,‘

經度

’:val[‘result’][‘location’][‘lng’],‘緯度’:val[‘result’][‘location’][‘lat’],‘地區標籤’:val[‘result’][‘level’],‘是否精確查詢’:val[‘result’][‘precise’]}

longitude = retval[‘經度’]

latitude = retval[‘緯度’]

return(longitude,latitude)

我們來測試一下

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

可以看到,現在給它一個地址,就能返回經緯度,再

返回地圖驗證一下經緯度,沒有問題

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

搞定了經緯度之後,一些交通訊息都可以透過百度地圖API來得到。比如駕車路線與路況,只需要透過起止位置與你剛剛申請的AK就可以輕鬆返回

#駕車

data = requests。get(‘http://api。map。baidu。com/directionlite/v1/driving?origin=40。01116,116。339303&destination=39。936404,116。452562&ak=你的AK’)

data = data。content。decode(‘

unicode_escape

’)

data = json。loads(data)

distance = data[‘result’][‘routes’][0][‘distance’]/1000 #駕車距離

time_cost = round(data[‘result’][‘routes’][0][‘duration’]/60) #駕車耗時

lukuang = data[‘result’][‘routes’][0][‘traffic_condition’]

lukuang = ‘暢通’ if lukuang == 1 else ‘緩行’ if lukuang == 2 else ‘擁堵’ if lukuang == 3 else ‘嚴重擁堵’ #路況

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

類似公交地鐵路線可以同樣使用上方程式碼搞定,至於附近推薦上車點也是有API

#上車點

data2 = requests。get(‘http://api。map。baidu。com/parking/search?location=120。11614538041329,30。294761455511946&coordtype=bd09ll&ak=你的AK’)

num = len(json。loads(json。loads(json。dumps(data2。text, ensure_ascii=False)))[‘recommendStops’])

data2 =json。loads(json。loads(json。dumps(data2。text, ensure_ascii=False)))[‘recommendStops’]

shangche = []

for i in range(num):

shangche。append(data2[i][‘name’])

shangche = ‘、’。join(shangche)

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

當然還有更多的查詢API你可以再百度開放平臺官網根據文件去使用,此處就不再一一介紹

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

推送訊息至微信

在搞定了相關欄位之後,我們先把這些資訊組合成一個

字串

,方便後面傳送

text = f“”“

哈嘍,冰冰,早上好!

今天是{date}。

現在已經{time_now}啦,距離上班還有{time3}分鐘。

外面的天氣情況不是很好,{weather},{air},記得帶傘哦~

根據現在的路況,路況{lukuang},總共{distance}千米,打車去公司需要{time_cost}分鐘,坐公交地鐵的話需要{time_cost1}分鐘。

如果需要打車去公司的話,最近的上車點為{shangche}。

加油,打工人,再上一天班就放假咯!

”“”

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

接下來就是將這段字串推送到微信,理論上直接用你的微信發過去是最理想的。

但是由於

itchat

等第三方介面目前都不能使用,所以我們只能藉助一些其他工具,這裡我選擇的是喵提醒

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

其實

本質上就是你將資訊傳送至喵提醒,喵提醒再透過它的公眾號推送給指定的人

。喵提醒目前支援多種提醒渠道,分別為:公眾號提醒,簡訊提醒,語音電話提醒和 APP 提醒。

但涉及到一個很重要的欄位 ID,也就是

喵碼

,獲取教程參考官方文件,傻瓜式操作即可,地址如下

https://mp。weixin。qq。com/s?__biz=MzIxNjQ1NzU2Mw==&mid=100000042&idx=6&sn=c9656c8b242972f62fe5840ddf7487db&scene=19#wechat_redirect

簡單來說,不論你是忽悠她操作還是自己偷偷操作,你需要讓小姐姐的微信關注喵提醒,再建立一個提醒並拿到對應的ID,這一步很重要,重要到我沒法教,相信你一定有辦法。

之後就可以透過這個ID給小姐姐發訊息,並且官方已經給出了傳送提醒的 API,所以很容易構建傳送的程式碼如下,拿走就能用

from urllib import request, parse

import json

class Message(object):

def __init__(self,text):

self。text = text

def push(self):

# 重要,在id中填寫自己繫結的id

page = request。urlopen(“http://miaotixing。com/trigger?” + parse。urlencode({“id”: “xxxxxx”, “text”: self。text, “type”: “json”}))

result = page。read()

jsonObj = json。loads(result)

if (jsonObj[“code”] == 0):

print(“\nReminder message was sent successfully”)

else:

print(“\nReminder message failed to be sent,wrong code:” + str(jsonObj[“code”]) + “,describe:” + jsonObj[“msg”])

text = ‘xxx’

message = Message(text)

message。push() # 完成推送

可以看到,程式碼很簡單,你在使用時,只需要替換上面的

ID

為小姐姐的ID,之後替換

text

為我們剛剛寫好的內容,執行程式碼後就推送到了微信上。

定時執行

最後我們需要讓程式每天指定時間執行,這裡用到了

定時指令

schedule

,先看程式碼

import schedule

import time

def job():

print(“I‘m working。。。”)

schedule。every(10)。minutes。do(job)

schedule。every()。hour。do(job)

schedule。every()。day。at(“10:30”)。do(job)

schedule。every(5)。to(10)。minutes。do(job)

schedule。every()。monday。do(job)

schedule。every()。wednesday。at(“13:15”)。do(job)

schedule。every()。minute。at(“:17”)。do(job)

while True:

schedule。run_pending()

time。sleep(1)

可以看到

schedule

庫裡的方法都非常通俗易懂,整個

定時框架

就是建立死迴圈並檢測時間,在

schedule

預設的要求中執行

job()

函式。如本文的需求,用定時框架可以寫作:

import schedule

import time

def job():

pass

schedule。every()。day。at(“8:00”)。do(job)

while True:

schedule。run_pending()

time。sleep(600)

只需要把上面的job方法裡面的內容替換成我們在第一步爬取與構造傳送文字的全部內容,並執行程式碼,程式就會在每天指定的時間傳送一條問候至小姐姐的微信啦~

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

最後總結一下,其實整個過程看似複雜,但是程式碼部分並不難,都是十分基礎的爬蟲程式碼與解析,要我來說,最難的還是如何讓妹子乖乖的把它的喵ID發給你

當然,我只是簡單的想了一下,你可以根據我的程式碼進行修改,來發送任意你想要的內容,進一步,如果你嘗試建立提醒,你會發現還有

共享提醒

功能

情人節,教你用Python定時給小姐姐微信傳送專屬問候!

開啟這個按鈕,你就擁有

群發功能

,可以讓更多的小姐姐收到你用心“寫下的問候”,當然一定要注意每個人的稱呼不要搞錯了,萬一把冰冰的發給冪冪,那麻煩就大了[逃~]

最後我也將相關程式碼上傳到了GitHub,大家可以自己下載後替換相關Key使用