天气越来越冷,利用Python做一个监控天气的程序,发邮件

完成这个任务需要三个步骤:

  • 1、查询天气
  • 2、发送邮件
  • 3、代码实现

查询天气,主要是通过api来发送请求得到json数据串,并通过postman来测试请求。

查询天气接口

要获取天气情况,需要一个查询天气的接口,网上找了一下,一般都是注册后送一定调用次数的,我选择了一个,免费送 500 次查询次数的。

我们看看接口的 API 文档。

其中城市名 cityname 和 key 是必填项。

http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY

key 值在 juhe.cn 我的接口那一栏中可以看到。

 

 

我们也可以事先在 Postman 工具中调试看看接口能否调通。

Postman 接口工具没用过的没关系,他们网页上也提供了调试工具。

 

 

查询天气方法

我们直接用 requests 库请求接口就能获得 json 格式的天气信息,json 数据中包含了当天和未来几天的天气信息,这里我只需要当天的,当天数据都在 result 下的 today 里,提取出来用 return 返回。

 

2、发送邮件

    def send_mail(self):
        # 设置邮件信息
        city_name, day_temp, day_weather, weather_date, city_id = self.get_weather()
        print(city_name)
        weather = "城市:{}\n温度:{}\n天气状况:{}\n天气日期:{}\n城市代码:{}"\
            .format(city_name, day_temp, day_weather, weather_date, city_id)
        print(weather)
        msg = MIMEText(weather, 'plain', 'utf-8')
        msg['Subject'] = Header('天气状态', 'utf-8').encode()
        msg['From'] = self._format_addr('中国气象网 <%s>' % self.from_addr)
        for to_addr in to_address:
            msg['To'] = self._format_addr('天气状态 <%s>' % to_addr)
            # 发送邮件
            server = smtplib.SMTP(self.SmtpServer, 25)
            server.login(self.from_addr, self.password)
            server.sendmail(self.from_addr, [to_addr], msg.as_string())
            server.quit()

发送邮件实例:

这样,小工具就完成了,你也可以在上面扩展,加上其他功能,这样就更完善了。

3、代码实现

完整代码如下:

# coding:utf-8
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import requests
import smtplib


class PostWeatherEmail(object):
    def __init__(self, to_address):
        # 发件人地址
        self.from_addr = '***********@163.com'
        # 邮箱密码
        self.password = '******'
        self.SmtpServer = 'smtp.163.com'
        # 收件人地址
        self.to_address = ['66666666@163.com']
        self.mail_text = ''
        self. url = 'http://v.juhe.cn/historyWeather/weather?city_id=1&weather_' \
                    'date=2019-11-01&key=59d5c0a48f07f6a6e333dcb86aef55fb'

    def _format_addr(self, s):
        """
        转化地址
        :param s:
        :return: 指定格式
        """
        name, addr = parseaddr(s)
        self.url
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def get_weather(self):
        """
        根据api获取天气信息
        :return: 天气信息文本
        """
        weather_json = requests.get(self.url).json()
        city_id = weather_json['result']['city_id']
        day_temp = weather_json['result']['day_temp']
        day_weather = weather_json['result']['day_weather']
        city_name = weather_json['result']['city_name']
        weather_date = weather_json['result']['weather_date']
        return city_name, day_temp, day_weather, weather_date, city_id

    def send_mail(self):
        # 设置邮件信息
        city_name, day_temp, day_weather, weather_date, city_id = self.get_weather()
        print(city_name)
        weather = "城市:{}\n温度:{}\n天气状况:{}\n天气日期:{}\n城市代码:{}"\
            .format(city_name, day_temp, day_weather, weather_date, city_id)
        print(weather)
        msg = MIMEText(weather, 'plain', 'utf-8')
        msg['Subject'] = Header('天气状态', 'utf-8').encode()
        msg['From'] = self._format_addr('中国气象网 <%s>' % self.from_addr)
        for to_addr in to_address:
            msg['To'] = self._format_addr('天气状态 <%s>' % to_addr)
            # 发送邮件
            server = smtplib.SMTP(self.SmtpServer, 25)
            server.login(self.from_addr, self.password)
            server.sendmail(self.from_addr, [to_addr], msg.as_string())
            server.quit()


if __name__ == '__main__':
    try:
        to_address = ['********8@qq.com']
        send_mail = PostWeatherEmail(to_address)
        send_mail.send_mail()
    except Exception as e:
        print(e)


 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值