热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树莓派定时运行python程序_定时发送免费天气预报(邮件)短信通知的Python脚本,通用Linux,也适合树莓派...

最近在摆弄Python和树莓派,故写了个定时发送免费天气预报(邮件)短信通知的Python脚本,通用Linux,也适合树莓派或者Windo

最近在摆弄Python和树莓派,故写了个定时发送免费天气预报(邮件)短信通知的Python脚本,通用Linux,也适合树莓派或者Windows系统,为Python3版本,Python2环境下使用的话,则要重新载入sys并设置utf8。

这里提供的是个人使用的单用户单城市版本。

# -*- coding: utf-8 -*-

"""

Spyder Editor

一个适合个人使用的定时发送天气预报短信的Python脚本.

原理,自动发送到你自己的邮箱,然后若邮箱有短信通知功能,就等于实现了短信通知。

一般运营商的邮箱都有这个邮件到达短信通知功能。

若改一改,就可以实现批量群发和多城市查询,甚至可以实现自动发送微信版天气预报通知到指定手机。

可放在树莓派中设置为开机自动运行。

树莓派中使用时,请用python3 XXX.py 方式启动。因为树莓派中python默认是python2。

需自己配置的参数有5个,请自行修改下方程序中对应项目:

fzs='18:18:00' 设置邮件发送的时间,样例中是每天的18点18分发送天气预报邮件

Get_weather_data('北京') 修改对应的城市名称为你需要查询的城市

'your_fs_mail@163.com' 应修改为发送邮件的邮箱,样例中是163邮箱

'your_sq_mail@139.com' 应修改为收取天气预报邮件的邮箱,样例中是139邮箱

"your_mima" 应修改为发送邮件的邮箱对应的发送邮件密码,一般的邮箱同登录密码,但网易163系列邮箱则是授权码,不是登录密码

部分代码实现参考了网络上其他作者的代码,本程序已经调试通过,无bug

修正日志:

20200625,因为数据源对风力的解析结果稍有变化,现配对为最新的风力解析方式

"""

#导入必要模块

import requests

import json

import datetime

import time

import sys

import smtplib

from email.mime.text import MIMEText

from email.utils import formataddr

#定时任务

def timerFun(sched_Timer):

flag=0

while True:

now=datetime.datetime.now().strftime('%Y-%m-%d

%H:%M')

xcsj=sched_Timer.strftime('%Y-%m-%d

%H:%M')

if now==xcsj:

flag=1

#执行天气预报查询并发送邮件

print('时间一致,开始发送天气预报邮件')

weather_data = Get_weather_data('北京')

weather_forecast_txt, forecast, nr =

Show_weather(weather_data)

if

weather_forecast_txt=='N':

print('查询天气的地址不对,程序终止')

sys.exit()

to_email(weather_forecast_txt,nr)

else:

if

flag==1:

sched_Timer=sched_Timer+datetime.timedelta(days=1)#days=1按天循环,minutes=1按分钟循环,hours=1按小时循环

print('下次比较时间是:'+sched_Timer.strftime('%Y-%m-%d %H:%M'))

flag=0

time.sleep(60)#每60秒检查一次即可

#定义获取天气数据函数

def Get_weather_data(diqu):

print('------天气查询------')

city_name=diqu

url =

'http://wthrcdn.etouch.cn/weather_mini?city=' + city_name

while True:

res=requests.get(url)

try:

res.raise_for_status()

res.encoding = res.apparent_encoding #设置编码

weather_data=res.text

break

except Exception as exc:

print('产生一个故障: %s%s,120秒后重试' % (url,'打开失败'))

time.sleep(120)

# 读取网页数据

weather_dict =

json.loads(weather_data)

return

weather_dict

#定义当天天气输出格式

def Show_weather(weather_data):

weather_dict =

weather_data

if

weather_dict.get('desc') == 'invilad-citykey':

print('你输入的城市有误或未收录天气,请重新输入...')

weather_forecast_txt='N'

forecast='N'

nr='N'

elif

weather_dict.get('desc') == 'OK':

forecast =

weather_dict.get('data').get('forecast')# 算星期几

print('日期:%s' % forecast[1].get('date'))

print('城市:%s' %

weather_dict.get('data').get('city'))

print('天气:%s' % forecast[1].get('type'))

print('温度:%s' %

(weather_dict.get('data').get('wendu') + ''))

print('高温:%s' % forecast[1].get('high'))

print('低温:%s' % forecast[1].get('low'))

print('风级:%s' %

forecast[1].get('fengli').split('[')[2].split(']')[0])

print('风向:%s' %

forecast[1].get('fengxiang'))

weather_forecast_txt = '%s,%s,' \

'%s,' \

'%s-' \

'%s,' \

'风力%s,' \

'当前温度%s,%s天气预报' % \

(

weather_dict.get('data').get('city'),

str((datetime.date.today()+datetime.timedelta(days=1))).replace('-',''),

forecast[1].get('type'),

str(forecast[1].get('low')).replace('低温',''),

forecast[1].get('high').replace('高温',''),

forecast[1].get('fengli').split('[')[2].split(']')[0],

weather_dict.get('data').get('wendu') + '',

weather_dict.get('data').get('city')

)

nr='温馨提示:%s 发送时间:%s' %

(weather_dict.get('data').get('ganmao'),datetime.datetime.now().strftime('%Y-%m-%d

%H:%M:%S'))

return

weather_forecast_txt,forecast,nr

#发送邮件

def to_email(bt,nr):

my_sender='your_fs_mail@163.com' #设置发件人邮箱账号,为了后面易于维护,所以写成了变量

my_user='your_sq_mail@139.com'

#收件人邮箱账号,为了后面易于维护,所以写成了变量,写成运营商的邮箱可以利用邮件到达通知功能实现天气预报短信功能。

def mail():

ret=True

try:

msg=MIMEText(nr,'plain','utf-8')

msg['From']=formataddr(["天气预报",my_sender]) #括号里的对应发件人邮箱昵称、发件人邮箱账号

msg['To']=formataddr(["H",my_user]) #括号里的对应收件人邮箱昵称、收件人邮箱账号

msg['Subject']=bt #邮件的主题,也可以说是标题

server=smtplib.SMTP("smtp.163.com",25) #发件人邮箱中的SMTP服务器,端口是25

server.login(my_sender,"your_mima") #设置163邮箱的smtp授权码,不是163邮箱登录密码。括号中对应的是发件人邮箱账号、邮箱密码

server.sendmail(my_sender,[my_user,],msg.as_string()) #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件

server.quit() #这句是关闭连接的意思

except Exception: #如果try中的语句没有执行,则会执行下面的ret=False

ret=False

return ret

bccs=20#设置报错尝试的次数

js=0#初始化报错计数

while True:

ret=mail()

if ret:

print("邮件发送成功!标题:%s,内容:%s" % (bt,nr))

#如果发送成功则会返回ok,稍等20秒左右就可以收到邮件

break

else:

print("邮件发送失败!30秒后重试") #如果发送失败则会返回filed

js=js+1

if

js<&#61;bccs:

time.sleep(30)

else:

break

#主函数

if __name__&#61;&#61;&#39;__main__&#39;:

#开机预留启动时间&#xff0c;方便树莓派联网

time.sleep(10)

today &#61;

datetime.date.today()

tomorrow &#61; today &#43;

datetime.timedelta(days&#61;1)

jtrq&#61;today.strftime(&#39;%Y-%m-%d&#39;)

fzs&#61;&#39;18:18:00&#39;#设置邮件发送的时间

jtrq&#61;jtrq&#43;&#39;

&#39;&#43;fzs#设置小时分秒&#xff0c;以后每天这个时候会发送&#xff0c;精确到分钟

if

datetime.datetime.strptime(jtrq,&#39;%Y-%m-%d

%H:%M:%S&#39;)>datetime.datetime.now():

sched_Timer&#61;datetime.datetime.strptime(jtrq,&#39;%Y-%m-%d

%H:%M:%S&#39;)

else:

sched_Timer&#61;datetime.datetime.strptime(tomorrow.strftime(&#39;%Y-%m-%d&#39;)&#43;&#39;

&#39;&#43;fzs,&#39;%Y-%m-%d %H:%M:%S&#39;)

qdbt&#61;&#39;天气预报启动成功&#xff0c;时间&#xff1a;%s&#39; %

datetime.datetime.now().strftime(&#39;%Y-%m-%d %H:%M:%S&#39;)

qdnr&#61;&#39;第一次发送时间为&#xff1a;%s&#39; %

sched_Timer

to_email(qdbt,qdnr)

time.sleep(5)

timerFun(sched_Timer)#按天循环



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • MVC下Log4Net的配置和使用
    MVC下Log4Net的配置和使用对于网站来讲,我们不能将异常信息显示给用户,Log4Net用来记录日志,可以将程序运行过程中的信息输出到文件,数据库中等地方,可以通过日志查看系统的运行过程,发现系 ... [详细]
  • MySQL修改表结构操作命令总结【MySQL】
    数据库|mysql教程MySQL,修改表结构命令数据库-mysql教程表的结构如下:错误页面源码,ubuntu电脑自动休眠,爬虫造景视频,rapapiphp,廊坊seo开发lzwm ... [详细]
  •   《WindowsAzurePlatform系列文章目录》  本文将介绍如何在AzureSQLDatabase创建只读用户。  请先按照笔者之前的文章:AzureSQLDatabas ... [详细]
  • ! Configuration File for keepalivedglobal_defs {   notification_email {     ... [详细]
  • 邮件服务在网络里的角色是越来越重要,不管是因特网上还是在局域网内部,用户都习惯使用电子邮件来处理日常的工作。而越来越多的企业和单位,也都急切希望能拥有自己的内部邮件服务器,以加强员 ... [详细]
  • OSI七层模型、TCP/IP五层模型
    OSI网络互连的七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;应用层OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,为用户直接提供各种网 ... [详细]
author-avatar
红颜内
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有