详解用python自制微信机器人,定时发送天气预报


Posted in Python onMarch 25, 2019

0 引言

前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己。最近无意中发现了wxpy库,用它来做再合适不过了。以下是wxpy库的简介:

wxpy基于itchat,使用了 Web 微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信登录、收发消息、搜索好友、数据统计、微信公众号、微信好友、微信群基本信息获取等功能。

废话不多说,代码写起来。

1 环境

操作系统:Windows / Linux

Python版本:3.7.2

2 代码实现

我们要实现用Python来发微信,发送的内容是每天最新的天气信息。很明显我们需要完成两部分的准备,先来看看获取天气信息这部分内容。

2.0 准备工作

本文我们用到的第三方库有requests、wxpyy,若环境还没有,按如下方式进行安装即可。

pip install wxpy
pip install requests

 2.1 获取天气信息

这里我使用的API的请求链接如下:

http://t.weather.sojson.com/api/weather/city/city_code

请求方式是GET方法,使用时注意更换为自己城市对应的city_code,除此之外不用带任何参数。

请求是restfull风格,city_code为9位数字,如下示例:

{
 "_id": 58,
 "id": 59,
 "pid": 3,
 "city_code": "101230201",
 "city_name": "厦门"
}

大家可以从_city.json文件中获取各个城市对应的编号。该文件我已经放在Github本文章对应的目录下了,大家可自行查询使用。

# weather API的URL,此处的城市编号,参看_city.json
url = 'http://t.weather.sojson.com/api/weather/city/101010200'
header = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'
}

# 请求Weather API并拿到服务器返回的数据
rep = requests.get(url, headers = header)
rep.encoding = "utf-8"
result = ''
weather = rep.tex

这个API接口的返回值内容很多,以下仅展示返回的部分信息。实际使用中仅用到三块内容,首先是城市信息。

"cityInfo": {
 "city": "海淀区", //请求城市
 "cityId": "101010200", //城市ID
 "parent": "北京市", //上级,一般是省份
 "updateTime": "09:02" //天气更新时间
}

其次是,该城市当前天气的空气相关指数。

"data": {
 "shidu": "32%", //湿度
 "pm25": 35.0, //pm2.5
 "pm10": 97.0, //pm10
 "quality": "良", //空气质量
 "wendu": "7", //温度
 "ganmao": "极少数敏感人群应减少户外活动", //感冒提醒(指数)
}

第三部分,该城市当前天气的温度风力等另外一些指数。

"forecast": [ //今天+未来14天
 {
  "date": "16", //日期
  "sunrise": "06: 28",
  "high": "高温 20.0℃",
  "low": "低温 2.0℃",
  "sunset": "18: 21",
  "aqi": 48.0, 
  "ymd": "2019-03-16", //年月日
  "week": "星期六",
  "fx": "西北风", //风向
  "fl": "3-4级", //风力
  "type": "晴",
  "notice": "愿你拥有比阳光明媚的心情"
 }
]

注:这个API接口返回值完整的示例,请见Github中本文章目录下的weather.json文件。

拿到返回值之后,需要解析,并转换组装成我们想要的格式。

# 解析服务器返回的数据,具体可参考weather.json文件
index_cityInfo = weather.find("cityInfo")
index_cityId = weather.find("cityId")
index_shidu = weather.find("shidu")
index_pm25 = weather.find("pm25")
index_pm10 = weather.find("pm10")
index_quality = weather.find("quality")
index_wendu = weather.find("wendu")
index_ganmao = weather.find("ganmao")
index_forecast = weather.find("forecast")
index_ymd = weather.find("ymd", index_forecast)
index_week = weather.find("week", index_forecast)
index_sunset = weather.find("sunset", index_forecast)
index_high = weather.find("high", index_forecast)
index_low = weather.find("low", index_forecast)
index_fx = weather.find("fx", index_forecast)
index_fl = weather.find("fl", index_forecast)
index_aqi = weather.find("aqi", index_forecast)
index_type = weather.find("type", index_forecast)
index_notice = weather.find("notice", index_forecast)

这是我最终想达到的效果如下:

# 今日天气预报
# 年月日 + 星期 + 所在地城市
# 天气类型 + 风向 + 风力
# 温度范围(最低温度~最高温度)
# 污染指数:PM2.5/PM10/AQI
# 空气质量
# 当前温度 + 空气湿度
# Notice信息

 转换化具体代码就是这样子的:

result = '今日天气预报' + '\n' \
 + weather[index_ymd + 6:index_week - 3] + " " \
 + weather[index_week + 7:index_fx - 3] + " " \
 + weather[index_cityInfo + 19:index_cityId - 3] + '\n' \
 + "天气: " + weather[index_type + 7:index_notice - 3] + " " \
 + weather[index_fx + 5:index_fl - 3] \
 + weather[index_fl + 5:index_type - 3] + '\n' \
 + "温度范围:" + weather[index_low + 9:index_sunset - 3] + " ~" \
 + weather[index_high + 10:index_low - 3] + '\n' \
 + "污染指数: PM2.5:" + weather[index_pm25 + 6:index_pm10 - 1] + "" \
 + "PM10:" + weather[index_pm10 + 6:index_quality - 1] + " " \
 + "AQI:" + weather[index_aqi + 5:index_ymd - 2] + '\n' \
 + "空气质量:" + weather[index_quality + 10:index_wendu - 3] + '\n' \
 + "当前温度:" + weather[index_wendu + 8:index_ganmao - 3] + " " \
 + "空气湿度:" + weather[index_shidu + 8:index_pm25 - 3] + '\n' \
 + weather[index_notice + 9:weather.find('}', index_notice) - 1]

这样我们的第一步,获取天气信息就完成了。接下来就是登录微信定时发送消息了。

2.2 登录微信定时发送消息

首先要登录微信,一行代码就搞定了。这里实际上是扫二维码登录了一个Web版的微信。

# 初始化机器人,扫码登陆微信,适用于Windows系统
bot = Bot()

# Linux系统,执行登陆请调用下面的这句
bot = Bot(console_qr=2, cache_path="botoo.pkl")

然后我们需要定义一个发送消息的函数,将获取并解析好的天气信息发送给指定微信好友。

# 调用get_weather函数
GW = get_weather()
# 填入你朋友的微信昵称,注意这里不是备注,也不是微信帐号
my_friend = bot.friends().search(u'一个昵称')[0]
# 发送微信消息
my_friend.send(u"早上好Y(^o^)Y,这里是今日份的天气信息请查收!")
my_friend.send(GW) 
my_friend.send(u"Have a Nice Day!")

# 每隔86400秒(1天),发送1次
t = Timer(86400, auto_send)
t.start()

接下来,你可以使用try...except...语句来实现在消息失败时发出告警:

try:
 '''此处为发送消息的代码,即上一段内容'''
except:
 # 你的微信昵称,注意这里不是备注,也不是微信帐号
 my_friend = bot.friends().search('&娴敲棋子&')[0]
 my_friend.send(u"报告老板,今日份的信息发送失败了!")

最后运行主函数,调用发送消息的函数即可。

# 调用函数进行消息发送
auto_send()

3 效果展示

这是我清晨收到的微信消息截图,看上去还不错。没白忙活?

详解用python自制微信机器人,定时发送天气预报

4 后记

我把这个脚本丢在了我的树莓上,挂在后台一直运行,简直完美。

这里仅是实现一个最简单的定时发送,后续考虑如何实现多个时间点的定时发送,还准备加上早间新闻资讯以及火车放票信息等内容。

以上所述是小编给大家介绍的用python自制微信机器人,定时发送天气预报详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现调用其他python脚本的方法
Oct 05 Python
Python探索之Metaclass初步了解
Oct 28 Python
python并发2之使用asyncio处理并发
Dec 21 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python实现数据分析与建模
Jul 11 Python
python中几种自动微分库解析
Aug 29 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python换行与不换行的输出实例
Feb 19 Python
Python2 与Python3的版本区别实例分析
Mar 30 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
Python3.5实现的三级菜单功能示例
Mar 25 #Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 #Python
Python for循环与range函数的使用详解
Mar 23 #Python
详解Python读取yaml文件多层菜单
Mar 23 #Python
详解Python数据分析--Pandas知识点
Mar 23 #Python
详解Python基础random模块随机数的生成
Mar 23 #Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 #Python
You might like
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
php 字符串函数收集
2010/03/29 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PHP echo()函数讲解
2019/02/15 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
php实现简单四则运算器
2020/11/29 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
python fabric实现远程部署
2017/01/05 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
python实例化对象的具体方法
2020/06/17 Python
Python urllib3软件包的使用说明
2020/11/18 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
计算机专业毕业生的自我评价
2013/11/18 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
挂靠协议书范本
2014/04/22 职场文书
教师节标语大全
2014/10/07 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
千与千寻观后感
2015/06/04 职场文书