python获取Yahoo天气数据并发送邮件通知

共三个模块

getweather.py #获取天气信息
smtpmail.py #发送邮件
reporter.py #主程序入口,定时发送邮件
  • 仅为练手项目

getweather.py

#!/usr/bin/python
# encoding: utf-8

import urllib2
import urllib
import json

class Weather(object):
    def weathersettings(self, woeid):
        self.woeid = woeid
        # woeid,类似城市代码 可以在 http://woeid.rosselliot.co.nz/ 查询
        baseurl = "https://query.yahooapis.com/v1/public/yql?"
        yql_query = "select wind from weather.forecast where woeid=" + woeid
        yql_url = baseurl + urllib.urlencode({'q':yql_query}) + "&format=json"
        result = urllib2.urlopen(yql_url).read()
        data = json.loads(result) # dict类型数据
        return data

smtpmail.py

#!/usr/bin/python
# encoding: utf-8

import smtplib
from email.mime.text import MIMEText
from email.header import Header

class Smtpmail(object):
    def mailsettings(self, subject, body):
        self.subject = subject
        self.body = body
        sender = 'xxxx@163.com' # 发送邮件地址
        receiver = 'yyy@gmail.com'  # 接收邮件地址
        smtpserver = 'smtp.163.com'  # smtp服务器地址
        port = 25 # smtp端口
        username = 'xxxx@163.com'  # 用户名
        password = 'password'  # 密码

        msg = MIMEText(body,'plain','utf-8')
        msg['Subject'] = Header(subject, 'utf-8')
        msg['From'] = 'xxx<xxx@163.com>'  
        msg['To'] = "yyy@gmail.com"

        smtp = smtplib.SMTP()
        # debug, 0为关闭,1为开启  
        # setsid常驻后台时必须关闭  否则进程会自动kill掉
        smtp.set_debuglevel(1) 
        smtp.connect(smtpserver, port)
        smtp.login(username, password)
        smtp.sendmail(sender, receiver, msg.as_string())
        smtp.quit()

reporter.py

#!/usr/bin/python
# encoding: utf-8

import time
import threading
import logging
from getweather import *
from smtpmail import *

class Reporter(object):
    def run_program(self):

        weather = Weather()
        smtpmail = Smtpmail()

        # 获取并格式化当前时间
        time_now = time.strftime(
            '%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

        # 判断早中晚
        if int(time_now.split()[1][0:2]) < 12:
            time_word = 'Morning'
        elif int(time_now.split()[1][0:2]) < 18:
            time_word = 'Afternoon'
        else:
            time_word = 'Evening'

        # 输入woeid
        weather_data = weather.weathersettings('2147986')
        # 当前天气
        weather_now = weather_data['query']['results']['channel'].keys()[0]
        # 华氏度转摄氏度
        weather_centigrade = str(int(
            (int(weather_data['query']['results']['channel']['wind']['chill']) - 32) / 1.8))

        # 标题输出格式
        subject = 'Weather Report {}'.format(time_now)
        # 正文输出格式
        body = '''
        Weather Report

        -----------------------------
        Good {} !
        This is the weather report.
        This {} is will be {}.
        It will {} degrees.
        Thank you for listening.
        -----------------------------
        '''.format(time_word, time_word, weather_now, weather_centigrade)

        # 发送邮件
        smtpmail.mailsettings(subject, body)

        # 日志格式
        logging.basicConfig(
                        level    = logging.DEBUG,              # 定义输出到文件的log级别                                                            
                        format   = '%(asctime)s  %(filename)s : %(levelname)s  %(message)s',    # 定义输出log的格式
                        datefmt  = time_now,                                     # 时间
                        filename = 'logging.log',                # log文件名
                        filemode = 'a')                        # 写入模式:“w”覆盖模式,“a”追加模式

        console = logging.StreamHandler()                  # 定义console handler
        console.setLevel(logging.INFO)                     # 定义该handler级别
        formatter = logging.Formatter('%(asctime)s  %(filename)s : %(levelname)s  %(message)s')  #定义该handler格式
        console.setFormatter(formatter)
        logging.getLogger().addHandler(console)           # 实例化添加handler

        # 输出日志
        logging.info('Subject:{}'.format(subject))
        logging.info('Body:{}'.format(body))

        # 延时器
        global timer
        reporter = Reporter()
        timer = threading.Timer(3600.0, reporter.run_program)  #间隔为1小时
        timer.start()

if __name__ == "__main__":
    reporter = Reporter()
    timer = threading.Timer(2.0, reporter.run_program)
    timer.start()

Ubuntu后台运行

虚拟机中新安装一个Ubuntu Server,以下为配置过程

sudo -i  #提升权限
sudo apt-get update  #更新软件列表
sudo apt-get upgrade  #更新软件
python -v #查看python版本(没有...)
sudo apt install python3  #安装python3
sudo apt-get install python-pip  #安装pip
sudo pip install --upgrade pip  #升级pip
cd /  #移动到根目录
mkdir pyweather  #新建目录pyweather
cd pyweather  #移动至pyweather文件夹
vi reporter.py  #新建并编辑py文件
cat reporter.py  #确认是否有误
vi smtpmail.py
cat smtpmail.py
vi getweather.py
cat getweather.py
ls  #确认文件
setsid python reporter.py  #常驻后台运行
history  #回顾配置过程

后来才发现邮件中的时间不对,需要改时区

date -R #确认时间
dpkg-reconfigure tzdata  # 选择时区
date -R #再次确认

参考链接

https://developer.yahoo.com/weather/
https://blog.csdn.net/z_johnny/article/details/50812878
https://blog.csdn.net/qq_18884487/article/details/78254257
https://blog.csdn.net/u011846143/article/details/78274911
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000
https://www.jianshu.com/p/abb2d6e91c1f
https://blog.csdn.net/qq_20480611/article/details/50325653
https://blog.csdn.net/DavyLee2008/article/details/56015573

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354