悄咪咪告诉你们,事情的缘由是这样的,A week ago, one of my best friends told me that he was in short sleeves on a rainy day ,Is almost freezing him to death, so I promised him to remind him of the weather every morning. 但是上次我说了,我是个B型血的人,干什么事情总是又太多的不确定因素,再加上我那朋友还批评我说我老是说话不算数,我一想到任何重复的事情都可以用代码解决,我就很开心的写了个脚本,去爬了一个天气网站上面的数据,给程序设置了定时任务,用微信的一个接口实现了自动实时播报天气的功能。
之所以用微信的原因是因为好像qqbot这个接口出问题了,qq用不了我也懒得去折腾了,so...
为了使程序执行的更加人性化,我设置了随机函数,会在每天早上的不同时刻发送天气情况给好友
还有一个原因就是 最近刷题难受了,我感觉我快要牺牲了,可能等不到比赛了,转移一下注意力
首先,要用到的几个包的导入:
from __future__ import unicode_literals
from threading import Timer
from wxpy import *
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import random
import re
然后就是去天气网站上爬数据的部分:
这里我只爬了 天气情况,最高温,最低温,风级 四个数据
def get_weather():
resp=urlopen('http://www.weather.com.cn/weather/101270101.shtml')
soup=BeautifulSoup(resp,'html.parser') //找到所需内容的html文件
tagDate=soup.find('ul', class_="t clearfix") //找到要爬取数据的class名称
Today=soup.find('p', class_="tem")
try:
High=Today.span.string
except AttributeError as e:
High=Today.find_next('p', class_="tem").span.string //最高温
Low=Today.i.string //最低温
weather=soup.find('p', class_="wea").string //天气状况
Wind=soup.find('p',class_="win")
winL=Wind.i.string //风力级数
return weather, Low, High, winL,
然后就是自动发消息的函数了:
这里我要说一下,就是我设置的定时,在还没爬数据以前测试的时候,我给设置了每秒一条消息然后发给我的一个微信好友,可是没想到,两分钟以后,大概发了几百条吧,我的微信号被封了,刚开始我还以为是好友把我屏蔽了,结果完全就是跟所有人都发不出去消息了。。。,是因为消息发的太频繁被微信的后台发现了,可能微信的anomaly detection 算法起作用了,事发现场是这样的。。。
定时器结合随机函数代码:
t = Timer(1, send_news) #这行代码实现一秒钟发送一次你的内容
# 每86400秒(1天),发送1次
t = Timer(1, send_news)
# 为了防止时间太固定,于是决定对其加上随机数
ran_int = random.randint(1000,3000)
t = Timer(86400 + ran,send_news)
t.start()
最后部分就是输出了,我这里设置了一个若失败返回消息发送失败的代码:
try:
contents = get_weather()
# 好友的微信名称
my_friend = bot.friends().search('')[0]
my_friend.send(u"早上好呀,慧子来给您按时播报天气情况啦")
my_friend.send(u"今天的天气状况:" + contents[0])
my_friend.send(u"最低温度:" + contents[1])
my_friend.send(u"最高温度:" + contents[2])
my_friend.send(u"风级:" + contents[3])
# 每86400秒(1天),发送1次
t = Timer(1, send_news)
# 为了防止时间太固定,于是决定对其加上随机数
ran_int = random.randint(1000,3000)
t = Timer(86400 + ran,send_news)
t.start()
except:
# 你的微信名称
my_friend = bot.friends().search('')[0]
my_friend.send(u"今天消息发送失败了")
但是有个缺点就是程序要一直挂着,因为这个接口执行的时候是会出来一个二维码用手机扫了以后点击登陆才能以你的微信账号执行代码,我也去找了能不能自动登陆微信不用扫二维码的方法,想像自动签到一样再加个自动登陆,可是网页版的微信登陆也需要手机扫二维码的验证,so..... 只能用这个接口了。
下面是效果,为了达到提醒效果,我又皮了一下下,哈哈哈:
故事的结尾:
在接受批评以后,改正了代码,加个判断,如果下雨提醒穿长袖带伞,出太阳提醒穿短袖,
可是我那位朋友还是不满意,我还是每天早上手动播报吧.....
你看我这么好,感动不感动
我待你好 ~
#上面的代码确实很生硬
#为了使他更加有人情味,可以自行添加多个判断语句
weather=soup.find('p', class_="wea").string
if(weather == "小雨"):
weather = " 今天下雨哦,请穿长袖 并且带好您的雨伞"
elif....
#此处可自行发挥,亦可写多条语句再设置个随机函数,让相同天气状况的问候语都不一样,更加人性化
温馨提示:各位男同学请注意啦,各位男同学请注意啦,此功能稍加修改,来设置一个给你的女朋友每天发晚安的功能岂不是很有意思,千万记得设随机函数呀,要不然每天定时定点太容易被看穿辽~