详解用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 相关文章推荐
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
玩转python爬虫之正则表达式
Feb 17 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
Django自定义manage命令实例代码
Feb 11 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
Flask框架配置与调试操作示例
Jul 23 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
在python中实现对list求和及求积
Nov 14 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Python模块、包(Package)概念与用法分析
May 31 Python
通过实例解析python描述符原理作用
Jan 22 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
Thinkphp微信公众号支付接口
2016/08/04 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
定义select的边框颜色
2008/04/28 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
Python字符串处理之count()方法的使用
2015/05/18 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python生成器generator原理及用法解析
2020/07/20 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
网络优化专员求职信
2014/05/04 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis