itchat实现微信定时发送天气情况

前言(废话):最近买了个服务器,有点激动,就想着拿它来干点啥。之前学习过一点爬虫皮毛,我想我可以写一个微信自动发送天气到手机上的程序,到时候放我的服务器上一挂,每天都能准时收到天气提醒,岂不美滋滋。

说干就干,首先得爬取天气信息,这里我直接调用了一个返回天气信息的api,对这个url访问,我们可以得到json数据,对这个数据进行解析,我们就可以得到所需要的信息。于是我用了postman进行访问,可以看到,我们需要的正是forecast这个键所对的值信息。当然,这里面有很多天的数据,然而,过于远的时间气候预测准确率可能会不高,所以我只获取今日和明日的信息。

现在,我们对返回的json数据进行解析,获取我们需要的信息。json就是列表、字典的嵌套,我们只要使用对列表和字典一样的操作就可从中获取数据,这个很简单的。

import requests
import json

url='http://t.weather.sojson.com/api/weather/city/101110101'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0'}
response = requests.get(url, headers=headers)
data = json.loads(response.text)

# 今日信息
today = data['data']['forecast'][0]['ymd']
today_hightem = data['data']['forecast'][0]['high']
today_lowtem = data['data']['forecast'][0]['low']
today_win = data['data']['forecast'][0]['fx']+' '+data['data']['forecast'][0]['fl']
today_wea = data['data']['forecast'][0]['type']
notice = data['data']['forecast'][0]['notice']

# 明日信息
tomorrow = data['data']['forecast'][1]['ymd']
tomorrow_hightem = data['data']['forecast'][1]['high']
tomorrow_lowtem = data['data']['forecast'][1]['low']
tomorrow_win = data['data']['forecast'][1]['fx'] + ' ' + data['data']['forecast'][1]['fl']
tomorrow_wea = data['data']['forecast'][1]['type']

为了我们发送到微信上的信息美观,我们将信息进行整合,将最终信息放进info这个列表。

today_data = '['+today +']' + '\n    ' + '温度:' + today_hightem  + '/' + today_lowtem + '\n    ' + '天气:' + today_wea + '\n    ' + '风力:' + today_win + '\n\n'
tomorrow_data = '['+tomorrow +']' + '\n    ' + '温度:' + tomorrow_hightem  + '/' + tomorrow_lowtem + '\n    ' + '天气:' + tomorrow_wea + '\n    ' + '风力:' + tomorrow_win
notice = '\n\n温馨提醒:' + notice
info = [today_data, tomorrow_data, notice]

信息获取到了,我们该使用itchat模块登录微信,实现信息的发送。如果是之前没有下载过这个模块,这里也有安装方法。

> pip install itchat    # windows安装
$ pip3 install itchat    # linux安装

这里只是使用itchat中简单的功能,关于itchat的详细使用,请访问该项目原作者的教程:https://itchat.readthedocs.io/zh/latest/

import itchat

itchat.auto_login(hotReload=True, enableCmdQR=True)    # hotReload=True, 即使程序关闭,一定时间内重新开启也可以不用重新扫码; enableCmdQR=True, 可以在登陆的时候使用命令行显示二维码  
account = itchat.get_friends(NickName)    # 这里的NickName是你给微信好友的备注
for item in account:
    if item['RemarkName'] == NickName:    # 由于每次登录时朋友的UserName都会变,所以我们这样做
        user = item['UserName']           # 获取微信朋友的UserName

# 给自己发送信息,发送至文件传输助手
itchat.send('【西安天气】\n\n' + info[0] + info[1] + info[2], toUserName='filehelper')

# 给朋友发送信息
itchat.send('【西安天气】\n\n' + info[0] + info[1] + info[2], toUserName=user)

下面,我们写一个定时功能,获取系统时间,当系统时间与我们设定的相同时,开始发送消息。貌似有个datatime可以干这事,所以我们可以不用做这个繁琐的事了,能简单就简单。

import datetime

TIME = '090000'    # 这里你设置自己需要的时间090000代表9时0分0秒
time = str(datetime.datetime.now().strftime('%H%M%S'))
if time == TIME:
   run()       # 执行代码

代码写好,下面我们将其部署到服务器上,可以在windows下使用Xshell登录,或者在linux下使用ssh远程登录。这里我使用的是Xshell,选择哪个问题不大。登陆后,我将脚本放入写在了weather.py文件。注意:下面使用的命令都是在ubuntu下操作的,如果系统是centos,可能会不太一样。

本来想用supervisor使脚本不断运行,但在使用的时候,报了错,显示ERROR(spawn error),查了很多资料,还是没有解决。所以用nohup使脚本不断运行吧!这就很难受。好,我们开始操作!

关于nohup

$ python3 weather.py &    # 将python3 weather.py任务放到后台 ,关闭Xshell,对应的任务也跟着停止。
$ nohup python3 weather.py    # 将python3 weather.py任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
$ nohup python3 weather.py &    # 将python3 weather.py任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。

我们使用nohup python3 weather.py &命令。

注意:在正式使用前,先将代码中的时间改到最近的时间运行一下,使用微信登录,下次这个代码就能直接运行,运行完后,再将代码中时间改至你想定时发送消息的时间。

效果图:

 源码:https://github.com/kingdowliu/Weather

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值