from wxpy import * #该库主要是用来模拟与对接微信操作的
importrequestsfrom datetime importdatetimeimporttimeimportschedulefrom 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
此处搜索指定好友时,可以根据好友的微信名称进行搜索。假如你有一个特别爱换昵称的好友,我们也可以用备注名称来搜索,语句都是一样的。
发送名单有了,我们该准备发送的内容了:
defWeather(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 +str11except:
str= greetings + str1 + str2 + str3 + str4 + str5 + str6 +str7return str
此段代码是我从网上找来的,由于源代码存在一些问题,很容易报错,所以有的地方加了异常处理
补充上计算pm2.5的函数
#计算pm2.5的程度
defcalculate(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- 天气推送
defsend_weather():
my_friends=weather_friend()#发送给好友
for friend inmy_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()
故此,结束了
整理一下整体思路:定时器,时间一到就调用发送函数,发送函数调用好友函数并获取位置,传给天气函数,天气函数进行处理并返回发送内容,最后发送给相关好友了