一步步教你用python給女朋友寫個(gè)微信自動(dòng)提醒的程序
事件背景是經(jīng)常有很多瑣碎的事情需要在某個(gè)時(shí)間點(diǎn)去做,光靠人力去記,容易出現(xiàn)偏差,尤其是對(duì)容易迷糊的選手。
所以動(dòng)手寫了一套代碼,可以按需要通過微信發(fā)送消息,不論是給自己充當(dāng)自動(dòng)提醒的備忘錄還是給其他人發(fā)送定時(shí)消息,都可以在這套代碼的基礎(chǔ)上實(shí)現(xiàn)。
首先放上最終成果示例:
圖中的文字都是可以根據(jù)自身需要而進(jìn)行修改的,所以文章中附上的代碼也只是拋磚引玉,讀者可以根據(jù)自身需要而進(jìn)行調(diào)整。本篇文章會(huì)分三個(gè)部分,依次介紹實(shí)現(xiàn)的方式,分別是
- 文本內(nèi)容的確定
- 微信端發(fā)送消息的實(shí)現(xiàn)
- 定時(shí)任務(wù)的設(shè)置
第一步:文本內(nèi)容的確定
這里說的“文本內(nèi)容”實(shí)際指的就是你想要發(fā)送的信息,所以其內(nèi)容是大相徑庭的,需要根據(jù)自身需要進(jìn)行調(diào)整,作者也就簡單介紹一下截圖里內(nèi)容對(duì)應(yīng)的代碼,截圖中的第一行“每日早安”是微信發(fā)消息時(shí)設(shè)置的,第二行是簡單的打招呼,純文字即可,此處按下不表。
第三行“現(xiàn)在是2021-10-07 11:25,星期四”,發(fā)送消息時(shí)的日期與星期數(shù),其對(duì)應(yīng)的python腳本如下:
# 發(fā)送內(nèi)容 今日日期與星期數(shù) import datetime import calendar import time sysdate = datetime.date.today() # 只獲取日期 now_time = datetime.datetime.now() # 獲取日期加時(shí)間 week_day = sysdate.isoweekday() # 獲取周幾 week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'] text_date = '現(xiàn)在是' + str(now_time)[0:16] + ',' + week[week_day -1 ] print(text_date)
第四行“天氣情況是晴,溫度是8~19攝氏度”,這里會(huì)涉及一個(gè)簡單的爬蟲,需要我們?nèi)ヌ鞖饩W(wǎng)站上爬取當(dāng)前天氣情況,腳本如下:
#發(fā)送內(nèi)容:天氣情況 import requests from bs4 import BeautifulSoup import datetime url = 'http://www.weather.com.cn/weather/101010300.shtml' sysdate=datetime.date.today() r = requests.get(url, timeout=30) # 用requests抓取網(wǎng)頁信息 r.raise_for_status() # 可以讓程序產(chǎn)生異常時(shí)停止程序 r.encoding = r.apparent_encoding #編碼格式 html=r.text final_list = [] soup = BeautifulSoup(html, 'html.parser') # 用BeautifulSoup庫解析網(wǎng)頁 #soup里有對(duì)當(dāng)前天氣的建議 body = soup.body #從soup里截取body的一部分 data = body.find('div', {'id': '7d'}) ul = data.find('ul') lis = ul.find_all('li') for day in lis: temp_list = [] date = day.find('h1').string # 找到日期 if date.string.split('日')[0]==str(sysdate.day): temp_list = [] date = day.find('h1').string # 找到日期 temp_list.append(date) info = day.find_all('p') # 找到所有的p標(biāo)簽 temp_list.append(info[0].string) if info[1].find('span') is None: # 找到p標(biāo)簽中的第二個(gè)值'span'標(biāo)簽——最高溫度 temperature_highest = ' ' # 用一個(gè)判斷是否有最高溫度 else: temperature_highest = info[1].find('span').string temperature_highest = temperature_highest.replace('℃', ' ') if info[1].find('i') is None: # 找到p標(biāo)簽中的第二個(gè)值'i'標(biāo)簽——最高溫度 temperature_lowest = ' ' # 用一個(gè)判斷是否有最低溫度 else: temperature_lowest = info[1].find('i').string temperature_lowest = temperature_lowest.replace('℃', ' ') temp_list.append(temperature_highest) # 將最高氣溫添加到temp_list中 temp_list.append(temperature_lowest) # 將最低氣溫添加到temp_list中 final_list.append(temp_list) # 將temp_list列表添加到final_list列表中 text_weather = '天氣情況是' + final_list[0][1] + ',溫度是' + final_list[0][3].strip() + '~' + final_list[0][2].strip() + '攝氏度'
第五行“剛發(fā)的工資,請(qǐng)對(duì)它好一點(diǎn)哦”,這里是計(jì)算出距離發(fā)工資日期的天數(shù),畢竟打工人最關(guān)心的莫過于此了。
import datetime import calendar import time import emoji # 獲取當(dāng)前月最后一天 next_month = sysdate.replace(day=28) + datetime.timedelta(days=4) # 獲取到下個(gè)月 minus = datetime.timedelta(days=next_month.day) # 獲取next_month的天數(shù) salary_date=next_month - minus # next_month減去自身的天數(shù),即可得到本月的月底最后一天 # 判斷實(shí)際發(fā)工資日期,目前只考慮了周末,未考慮節(jié)假日 if salary_date.isoweekday() == 6: salary_date_actual = salary_date - datetime.timedelta(days=1) # 若發(fā)工資日期為周六,則實(shí)際會(huì)在周五發(fā)放,提前1天 elif salary_date.isoweekday() == 7: salary_date_actual = salary_date - datetime.timedelta(days=2) # 若發(fā)工資日期為周日,則實(shí)際會(huì)在周五發(fā)放,提前2天 else: salary_date_actual=salary_date # 實(shí)際發(fā)放工資日期 # 獲取當(dāng)前日期與發(fā)工資日的天數(shù)差距 day_between = salary_date_actual.day - sysdate.day if day_between == 0: text_salary = '今天發(fā)工資啦!沖鴨!?。? elif day_between < 0 or day_between > 20: text_salary = '剛發(fā)的工資,請(qǐng)對(duì)它好一點(diǎn)哦' + emoji.emojize(':wink:', use_aliases=True) else: text_salary = '距離發(fā)工資還有' + str(day_between) + '天'
至此,截圖中的文本內(nèi)容已經(jīng)得以實(shí)現(xiàn),可以看到,這一步的代碼是和實(shí)際需求緊密相關(guān)的,所以各位讀者可以根據(jù)自身需要完成這一步。
第二步:微信端發(fā)送消息的實(shí)現(xiàn)
當(dāng)我們確定好文本內(nèi)容后,就需要通過微信將信息發(fā)送出去,前幾年還有itchat之類的第三方庫使用,但最近這些庫好像都沒法使用,所以就只能尋找其他思路。微信公眾號(hào)是有一個(gè)主動(dòng)給用戶發(fā)送消息的權(quán)限,所以考慮通過微信公眾號(hào)來實(shí)現(xiàn)這一功能,所以作者嘗試使用自己申請(qǐng)的個(gè)人微信公眾號(hào),但發(fā)現(xiàn)主體為個(gè)人的,是沒有這個(gè)權(quán)限的,而如果要申請(qǐng)企業(yè)類型的,還得自掏腰包,所以就只能放棄使用自己的微信公眾號(hào)。
轉(zhuǎn)而將目光轉(zhuǎn)移到市面上現(xiàn)有的可提供主動(dòng)發(fā)消息的微信公眾號(hào):喵提醒。
直接搜索這個(gè)名字應(yīng)該就可以搜到,關(guān)注后找到“添加提醒”,按順序完成即可,注意我們?cè)诘谝徊嚼锇聪虏槐淼牡谝恍袃?nèi)容“每日早安”這四個(gè)字,實(shí)際就是在喵提醒里設(shè)置的,即這個(gè)提醒的名稱?!疤嵝逊绞健眲t選擇“公眾號(hào)文字提醒”,畢竟只有這個(gè)是免費(fèi)的。
當(dāng)你在喵提醒內(nèi)完成提醒的設(shè)置后,系統(tǒng)會(huì)給你返回一個(gè)“喵碼”,這個(gè)喵碼是一定要存下來的,只有當(dāng)你訪問這個(gè)喵碼對(duì)應(yīng)的網(wǎng)址時(shí),公眾號(hào)才會(huì)給對(duì)你進(jìn)行消息的發(fā)送。
當(dāng)你完成這一步之后,就只需要通過python腳本訪問喵碼對(duì)應(yīng)的網(wǎng)址,并傳上你需要發(fā)送的內(nèi)容,公眾號(hào)就會(huì)將內(nèi)容再發(fā)到微信上了,訪問的代碼如下:
from urllib import request, parse import json #訪問喵提醒,發(fā)送微信消息 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": "此處填寫喵碼", "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 = f""" 早上好呀❤❤❤❤❤❤❤❤ {text_date} {text_weather} {text_salary} """ message = Message(text) message.push() # 完成推送
這段代碼里的text就是你需要發(fā)送的內(nèi)容,代碼中“此處填寫喵碼”是需要將上面提到的喵碼復(fù)制進(jìn)來,“早上好呀”這個(gè)打招呼的內(nèi)容就是在這里手動(dòng)寫上去的,而{text_date}、{text_weather}、{text_salary}就是我們?cè)诘谝徊嚼餃?zhǔn)備好的內(nèi)容。
有一點(diǎn)需要注意,這里是通過喵碼發(fā)送信息,所以這個(gè)喵碼對(duì)應(yīng)的用戶是誰,這條信息就會(huì)發(fā)給誰,所以如果是由你的賬戶申請(qǐng)的喵碼,但內(nèi)容又是希望發(fā)給別人的,則需要手動(dòng)轉(zhuǎn)發(fā)或者換成別人的喵碼。
但是這個(gè)方法目前是存在一個(gè)弊端的,以文本方式發(fā)送的話,需要你每48小時(shí)給微信公眾號(hào)發(fā)送任意一條消息,不然公眾號(hào)將失去給你主動(dòng)發(fā)消息的權(quán)限,不過就實(shí)際使用情況來說,這個(gè)弊端還是能接收的,因?yàn)楫?dāng)公眾號(hào)給你發(fā)消息后,隨便回一條消息即可,當(dāng)然如果有更好的方式,還請(qǐng)各位讀者進(jìn)行指點(diǎn)。
第三步:定時(shí)任務(wù)的設(shè)置
前兩步完成后,當(dāng)你調(diào)用python腳本,就可以實(shí)現(xiàn)讓微信公眾號(hào)給你發(fā)送消息了,但在實(shí)際場(chǎng)景中,肯定是希望定時(shí)自動(dòng)調(diào)用腳本,而非手動(dòng)執(zhí)行,為了實(shí)現(xiàn)這個(gè)目標(biāo),本來是考慮通過schedule庫來定時(shí)操作,但后來發(fā)現(xiàn)用這個(gè)庫的話,這個(gè)腳本需要一直在后臺(tái)運(yùn)行,而且還不能進(jìn)行其他操作,所以我們?cè)谶@里選用了WIN10系統(tǒng)自帶的“計(jì)劃程序”功能,對(duì)應(yīng)路徑是:控制面板-系統(tǒng)和安全-管理工具-任務(wù)計(jì)劃程序。
在進(jìn)行設(shè)置計(jì)劃之前,還有一個(gè)準(zhǔn)備工作需要做,因?yàn)閃IN10系統(tǒng)無法直接調(diào)用python腳本,所以我們需要先準(zhǔn)備一個(gè)txt文件,其內(nèi)容是
python xxx.py
xxx對(duì)應(yīng)的就是寫好的python腳本名稱,完成內(nèi)容后,再將這個(gè)txt文件的后綴修改為.bat,并讓這個(gè)bat文件和python腳本在同一個(gè)文件夾內(nèi),這樣就形成了一個(gè)可以由WIN10系統(tǒng)調(diào)用的bat文件了,并且這個(gè)bat文件的內(nèi)容就是調(diào)用你指定的python腳本。
完成這個(gè)準(zhǔn)備工作后,我們?cè)凇坝?jì)劃程序”面板,選擇“創(chuàng)建基本任務(wù)”
填寫計(jì)劃名稱和描述,點(diǎn)擊下一步后,是選擇調(diào)度的頻率,根據(jù)自身需要選擇即可
如果是選擇每天的話,還需要選擇具體時(shí)間,根據(jù)自身需要選擇即可。
下一步的“操作”也只能選擇“啟動(dòng)程序”
再下一步的“啟動(dòng)程序”,就需要我們提前準(zhǔn)備好的bat文件了,在“程序或腳本”下面選擇bat文件,“起始于”后面的框框里填上bat文件所在的文件路徑。
事情到這里還差最后一點(diǎn)點(diǎn)。
當(dāng)完成上述操作后,在計(jì)劃程序面板會(huì)出現(xiàn)你剛剛命名的計(jì)劃,選中后右鍵,進(jìn)入“屬性”,選擇“不管用戶是否登錄都要運(yùn)行”,避免用戶不同導(dǎo)致程序沒有執(zhí)行。
再去“條件”中修改電源配置,建議取消限制,如果是筆記本電腦的話,勾選了紅框內(nèi)的方框,則在沒有連接電源的情況下,是不會(huì)執(zhí)行腳本的。
至此,大功告成,各位讀者可以根據(jù)自身需求修改對(duì)應(yīng)內(nèi)容,如文章內(nèi)有何錯(cuò)誤,或有其他建議,煩請(qǐng)各位不吝賜教。
全文完整代碼如下:
from urllib import request, parse import json import emoji # 發(fā)送內(nèi)容 今日日期與星期數(shù) import datetime import calendar import time sysdate = datetime.date.today() # 只獲取日期 now_time = datetime.datetime.now() # 獲取日期加時(shí)間 week_day = sysdate.isoweekday() # 獲取周幾 week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'] text_date = '現(xiàn)在是' + str(now_time)[0:16] + ',' + week[week_day -1 ] # 獲取當(dāng)前月最后一天 next_month = sysdate.replace(day=28) + datetime.timedelta(days=4) # 獲取到下個(gè)月 minus = datetime.timedelta(days=next_month.day) # 獲取next_month的天數(shù) salary_date=next_month - minus # next_month減去自身的天數(shù),即可得到本月的月底最后一天 # 判斷實(shí)際發(fā)工資日期,目前只考慮了周末,未考慮節(jié)假日 if salary_date.isoweekday() == 6: salary_date_actual = salary_date - datetime.timedelta(days=1) # 若發(fā)工資日期為周六,則實(shí)際會(huì)在周五發(fā)放,提前1天 elif salary_date.isoweekday() == 7: salary_date_actual = salary_date - datetime.timedelta(days=2) # 若發(fā)工資日期為周日,則實(shí)際會(huì)在周五發(fā)放,提前2天 else: salary_date_actual=salary_date # 實(shí)際發(fā)放工資日期 # 獲取當(dāng)前日期與發(fā)工資日的天數(shù)差距 day_between = salary_date_actual.day - sysdate.day if day_between == 0: text_salary = '今天發(fā)工資啦!沖鴨!?。? elif day_between < 0 or day_between > 20: text_salary = '剛發(fā)的工資,請(qǐng)對(duì)它好一點(diǎn)哦' + emoji.emojize(':wink:', use_aliases=True) else: text_salary = '距離發(fā)工資還有' + str(day_between) + '天' #發(fā)送內(nèi)容:天氣情況 import requests from bs4 import BeautifulSoup import datetime url = 'http://www.weather.com.cn/weather/101010300.shtml' sysdate=datetime.date.today() r = requests.get(url, timeout=30) # 用requests抓取網(wǎng)頁信息 r.raise_for_status() # 可以讓程序產(chǎn)生異常時(shí)停止程序 r.encoding = r.apparent_encoding #編碼格式 html=r.text final_list = [] soup = BeautifulSoup(html, 'html.parser') # 用BeautifulSoup庫解析網(wǎng)頁 #soup里有對(duì)當(dāng)前天氣的建議 body = soup.body #從soup里截取body的一部分 data = body.find('div', {'id': '7d'}) ul = data.find('ul') lis = ul.find_all('li') for day in lis: temp_list = [] date = day.find('h1').string # 找到日期 if date.string.split('日')[0]==str(sysdate.day): temp_list = [] date = day.find('h1').string # 找到日期 temp_list.append(date) info = day.find_all('p') # 找到所有的p標(biāo)簽 temp_list.append(info[0].string) if info[1].find('span') is None: # 找到p標(biāo)簽中的第二個(gè)值'span'標(biāo)簽——最高溫度 temperature_highest = ' ' # 用一個(gè)判斷是否有最高溫度 else: temperature_highest = info[1].find('span').string temperature_highest = temperature_highest.replace('℃', ' ') if info[1].find('i') is None: # 找到p標(biāo)簽中的第二個(gè)值'i'標(biāo)簽——最高溫度 temperature_lowest = ' ' # 用一個(gè)判斷是否有最低溫度 else: temperature_lowest = info[1].find('i').string temperature_lowest = temperature_lowest.replace('℃', ' ') temp_list.append(temperature_highest) # 將最高氣溫添加到temp_list中 temp_list.append(temperature_lowest) # 將最低氣溫添加到temp_list中 final_list.append(temp_list) # 將temp_list列表添加到final_list列表中 text_weather = '天氣情況是' + final_list[0][1] + ',溫度是' + final_list[0][3].strip() + '~' + final_list[0][2].strip() + '攝氏度' #訪問喵提醒,發(fā)送微信消息 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": "此處填寫喵碼", "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 = f""" 早上好呀❤❤❤❤❤❤❤❤ {text_date} {text_weather} {text_salary} """ message = Message(text) message.push() # 完成推送
全文到此結(jié)束。
總結(jié)
到此這篇關(guān)于用python給女朋友寫了個(gè)自動(dòng)提醒程序的文章就介紹到這了,更多相關(guān)python寫個(gè)自動(dòng)提醒程序內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。