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的请求链接如下:

请求方式是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 效果展示

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

4 后记

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

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

关注公众号「Python专栏」,后台回复:zsxq05,获取本文全套代码!

python自动发微信新闻网_用python自制微信机器人,定时发送天气预报相关推荐

  1. 钉钉python 自动发消息软件_利用Python自动发送钉钉数据消息,一个简单的上手小项目...

    现在大部分公司都使用钉钉作为内部的主要沟通工具,钉钉消息基本都上都能快速有效的被阅读,打开率会比邮件高上不少.所以准备使用钉钉来播报平台每日的成交额,并附上一些鼓励的话和图片.起到一个激励团队的作用 ...

  2. python自动发outlook邮件_使用python自动发邮件(163、QQ、outlook邮箱)

    import smtplib fromemail.mime.text import MIMEText fromemail.utils import formataddr fromdatetime im ...

  3. python自动推送消息_使用Python制作自动推送微信消息提醒的备忘录功能

    日常工作生活中,事情一多,就会忘记一些该做未做的事情.即使有时候把事情记录在了小本本上或者手机.电脑端备忘录上,也总会有查看不及时,导致错过的尴尬.如果有一款小工具,可以及时提醒,而不用再主动去查备忘 ...

  4. python自动推送消息_用Python设计一个可以自动推送微信消息提醒的备忘录

    请关注微信公众号:金融数学 FinancialMathematics日常工作生活中,事情一多,就会忘记一些该做未做的事情.即使有时候把事情记录在了小本本上或者手机.电脑端备忘录上,也总会有查看不及时, ...

  5. python自动生成word报告_利用Python实现报告自动生成

    前几天,在网上看到一篇介绍利用Python组件实现MS word内容生成的文章.可能是很久没接触编码,感觉在技术领域变得有点孤陋寡闻了,看见一些实用的功能都觉的屌屌的.以前经常通过代码写Excel文件 ...

  6. python自动点击脚本_用Python实现鼠标自动点击

    前言: 最近玩某页游时遇到一个重复任务,需要不停的接/交任务道具,数量巨大又十分麻烦,想去网上下脚本又找不到合适的,于是整了一个可以实现鼠标自动点击的小玩意.因为我之前没有任何编程基础,这两天自学又走 ...

  7. python自动生成分析报告_利用PYTHON全自动生成分析报告

    日常工作当中,特别是金融行业当中,有不少人的工作是提取数据,分析数据,得到可视化图表,并加入自已的研究分析结论,最终生成分析报告,并且有不少报告是定期生成,存在不少重复手工劳动.本文通过一个简单实例, ...

  8. python自动卸载win程序_利用python实现自动扫雷程序

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 h ...

  9. python自动接收邮件验证码_「 python 」 python 实现发送邮件验证码

    当我们在注册一个网页时,有的网页会让必须要短信验证.邮箱验证,才可以进行账号的注册.其实,我们在项目中会遇到很多问题,比如:当我们进行爬虫的时候,很容易由于网页的改版,造成我们事先写好的爬虫突然无效, ...

最新文章

  1. 如何才能建立起似然函数
  2. linux运维防火墙考题,Linux运维工程师:30道面试题整理 | 张戈博客
  3. figma设计_5位来自杂乱无章的设计师的Figma技巧
  4. Oracle官方并发教程之不可变对象
  5. idea 配置mysql逆向_idea逆向工程配置
  6. java课设单链式存储心得报告_队列的链式存储方式的实现(Java语言描述)
  7. 【代码优化】for-each代替普通的for循环或者while循环
  8. JSLIU 的 wxWindows 入门
  9. 软件工程之需求说明书
  10. 高级终端termux下载不了Python_最新Termux安装MSF(metasploit)教程
  11. 第2章 业务:数据驱动运营
  12. 彻底卸载JDK的-并只依赖配置环境安装JDK(不依赖注册表)-解决Error opening registry key‘software\Javasoft\Java Runti问题
  13. 投资 - 出口 - 消费
  14. 火狐浏览器firefox检测不到U盾证书
  15. 浙大计算机学院app开发,App Inventor - 零基础Android移动应用开发
  16. 图解Windows10+优麒麟双系统安装
  17. 达内终端端mysql命令_如何从Windows命令行启动MySQL
  18. AtCoder Beginner Contest 203 Pond(二分+二维前缀和)
  19. mac微信怎么设置代理服务器,微信Mac版怎么管理群成员?微信Mac版管理群成员的方法...
  20. Centos7.6挂载IPSAN【iscsi存储】并应用为LVM分区

热门文章

  1. 旅游系统(SSM框架+MySQL+Redis+VUE)前端页面代码
  2. M1芯片 Mac安装Docker、ElasticSearch等
  3. JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码、数据库)
  4. android 杀死进程回收资源,Android之进程回收机制LMK(Low Memory Killer)
  5. “互联网+”背景下使用微信公众号增强班主任工作与整合教学资源(泰微课)...
  6. 马云蝉联2020中国首富,背后一个定律价值连城
  7. 同频信号干扰解决办法
  8. redis --- RDB(Redis Data Base)
  9. 参加美国大学生数学建模竞赛,为什么通过数模乐园辅助报名?
  10. 记一次spring boot项目启动失败