from wxpy import * #該庫主要是用來模擬與對接微信操作的 import requests from datetime import datetime import time import schedule from apscheduler.schedulers.blocking import BlockingScheduler #定時框架
首先引入所需要的庫,如果不存在,請先使用pip進行安裝
pip install schedule
接下來進行微信登錄
bot = Bot(cache_path=True)
cache_path = True表示開啟緩存,這樣在緩存生效的時間內可以避免每次啟動程序都進行微信掃碼了
然后我們寫一個變量,用來存在圖靈機器人的key,后面會用到(去圖靈申請一個免費的機器人即可)
tuling = Tuling(api_key="圖靈機器人的key")
接下來就是主要內容了,在這里我們將對微信好友發送天氣提醒,所以先創建一個函數,用來維護接收該消息的好友名單
"""推送名單維護""" def weather_friend(): #定義一個名為weather_friend的函數 # 天氣推送名單 my_friends = [] # 創建一個空列表,用來存放好友名單 my_friends.append(bot.friends().search(u'單伊夏')[0]) # 搜索指定好友並添加至列表 my_friends.append(bot.friends().search(u'🔥')[0]) my_friends.append(bot.friends().search(u'佐之格⊙魅殤')[0]) return my_friends
此處搜索指定好友時,可以根據好友的微信名稱進行搜索。假如你有一個特別愛換昵稱的好友,我們也可以用備注名稱來搜索,語句都是一樣的。
發送名單有了,我們該准備發送的內容了:
def Weather(location): # 定義一個發送天氣的函數,並需要接收一個參數(該參數是好友在微信中設置的地點) #准備url地址 path ='http://api.map.baidu.com/telematics/v3/weather?location=%s&output=json&ak=TueGDhCvwI6fOrQnLM0qmXxY9N0OkOiQ&callback=?' url = path % location response = requests.get(url) # 對該地址和參數進行get請求 result = response.json() # 將返回的結果轉成json串
# 為了防止因好友未設置地點而導致程序報錯,所以需要對返回的error參數進行判斷 if int(result['error']) != 0: # 當error為0時,搜索是正常的,一旦不等於0,表示存在錯誤 location = '北京' # 此時將地址設為一個默認地址 如北京 url = path % location # 拼接新的url response = requests.get(url) # 在對新的url進行get請求 result = response.json()
# 下面就是對正確請求到數據后的結果進行處理了 # 問候語 greetings = (' 早上好!這是今天的天氣預報!……\n機器人:你的小野貓\n') try: # 此處增加異常處理是因為當好友設置的地區為國外的時候,error返回值不會報錯,但不會有results # 取出天氣結果 results = result['results'] except: return "啊哦,我迷路了,找不到地點!" # 當沒有該地區的結果時,函數直接返回字符串,此時函數結束
# 當正常取出結果后,繼續進行下列操作
# 取出數據字典第一天數據 data1 = results[0] # 取出城市 city = data1['currentCity'] str1 = ' 你的城市: %s\n' % city # 取出pm2.5值 pm25 = data1['pm25'] str2 = ' PM值: %s\n' % pm25 # 評估空氣質量 pollution = calculate(pm25) # 此時調用calculate函數進行計算,所以該函數要寫在此函數之前 str3 = ' 污染指數: %s\n' % pollution result1 = results[0] weather_data = result1['weather_data'] data = weather_data[0] temperature_now = data['date'] str4 = ' 當前溫度: %s\n' % temperature_now wind = data['wind'] str5 = ' 風向 : %s\n' % wind weather = data['weather'] str6 = ' 天氣 : %s\n' % weather str7 = ' 溫度 : %s\n' % data['temperature'] try: # 此處異常操作是因為有時候返回結果里面不存在下方內容 message = data1['index'] str8 = ' 穿衣 : %s\n' % message[0]['des'] str9 = ' 我很貼心: %s\n' % message[2]['des'] str10 = ' 運動 : %s\n' % message[3]['des'] str11 = ' 紫外線 : %s\n' % message[4]['des'] str = greetings + str1 + str2 + str3 + str4 + str5 + str6 + str7 + str8 + str9 + str10 + str11 except: str = greetings + str1 + str2 + str3 + str4 + str5 + str6 + str7 return str
此段代碼是我從網上找來的,由於源代碼存在一些問題,很容易報錯,所以有的地方加了異常處理
補充上計算pm2.5的函數
# 計算pm2.5的程度 def calculate(pm): if pm == '': pm25 = -1 else: pm25 = int(pm) # 通過pm2.5的值大小判斷污染指數 if 0 <= pm25 < 35: pollution = '優' elif 35 <= pm25 < 75: pollution = '良' elif 75 <= pm25 < 115: pollution = '輕度污染' elif 115 <= pm25 < 150: pollution = '中度污染' elif 150 <= pm25 < 250: pollution = '重度污染' elif pm25 >= 250: pollution = '嚴重污染' else: pollution = '希望你健在' return pollution
下面我們創建一個發送函數
# 1- 天氣推送 def send_weather(): my_friends = weather_friend() # 發送給好友 for friend in my_friends: friend.send(Weather(friend.city)) # friend.city 可獲取到好友在微信上設置的地點 # 給文件傳輸助手發送消息 bot.file_helper.send('天氣推送完畢')
最后我們創建一個定時器,時間一到,就調用發送函數
"""推送時間維護""" print('star') sched = BlockingScheduler() sched.add_job(send_weather, 'cron', month='1-12', day='1-31', hour=7, minute=0) # 表示每天的7點發送 sched.start()
故此,結束了
整理一下整體思路:定時器,時間一到就調用發送函數,發送函數調用好友函數並獲取位置,傳給天氣函數,天氣函數進行處理並返回發送內容,最后發送給相關好友了