天气越来越冷,利用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 = ['[email protected]']
        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 = ['********[email protected]']
        send_mail = PostWeatherEmail(to_address)
        send_mail.send_mail()
    except Exception as e:
        print(e)


发布了36 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_20183817/article/details/102901010