文档章节

【代码改变人生】自制Python撩妹神器—每日天气播报

零号_特工
 零号_特工
发布于 2017/05/25 20:06
字数 885
阅读 26
收藏 0
点赞 0
评论 0

##背景

最近正在自学Python,找点有意思的小项目练练手。从知乎一帖子中学习到一位高手的撩妹技巧:每天定时给女朋友发一封邮件,简单的问候加天气情况。博主觉得有点意思,何不尝试做一下呢。

##原理

实现的原理很简单了。

调用免费的天气API接口,获取所在城市的天气情况 大家都知道Bing的背景图非常漂亮,每天都会更新,Bing也将获取图片的API公开。所以调用Bing每日图片的API,下载到本地 将天气情况和图片拼成邮件内容,利用python的smtp模块实现邮件发送 将python程序,即.py文件上传到服务器上。在crontab中加入一条定时任务,每天定时执行小程序。 主要过程如上所述,是不是非常简单。下面将Python代码放出。

##代码

# coding=utf-8
import urllib
import urllib2
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import xml.etree.ElementTree as ET
import time
import json


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))


# 获取bing的每日图片,修改api中的参数n,可以获取多张图片
# 从bing的api返回的xml中提取图片的url,然后下载到本地,并命名为yyyymmdd.jpg
def get_bing_pic():
    req = urllib2.Request("http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1")
    webpage = urllib2.urlopen(req)
    root = ET.fromstring(webpage.read())
    # 获取图片链接
    url = 'http://cn.bing.com' + root.find('image').find('url').text
    # 图片描述
    pic_desc_ = root.find('image').find('copyright').text
    # 图片保存到本地的位置,这是linux的文件目录,windows的注意修改为C:/XX/XX
    pic_file_name_ = "/root/" + time.strftime('%Y%m%d', time.localtime(time.time()))
    urllib.urlretrieve(url, pic_file_name_ + url[-4:])
    return pic_file_name_ + url[-4:], pic_desc_


# 调用免费的天气API接口,city_code默认为广州的code,其他城市code参见文末参考链接3.
def get_city_weather(city_code='101280101'):
    response = urllib2.urlopen("http://www.weather.com.cn/data/cityinfo/"+city_code+".html")
    weather_json = json.loads(response.read())
    city_ = weather_json['weatherinfo']['city']
    min_temp_ = weather_json['weatherinfo']['temp1']
    max_temp_ = weather_json['weatherinfo']['temp2']
    weather_ = weather_json['weatherinfo']['weather']
    return city_, min_temp_, max_temp_, weather_


# 发件人地址和密码
from_addr = 'XXXX@XX.com'
password = 'XXXXXXX'
# SMTP服务器地址:
smtp_server = 'smtp.XXXX.com'
# 收件人地址:
to_addr = 'XXXXXXXX@XXX.com'
# 抄送给自己:
cc_addr = 'XXXXXX@XX.com'

city, min_temp, max_temp, weather = get_city_weather()
# 带路径的文件名
pic_file_name, pic_desc = get_bing_pic()
# 文件名
pic_name = pic_file_name.split("/")[-1]

# 这里是邮件正文内容,'<img src='cid:0'></img>'是为了将附件的图片插入邮件正文中,直接显示
content = u"<html><body><h1>Hello</h1><p>%s今天天气%s,最低温度%s,最高温度%s.</p>\
<h3>%s</h3><img style='width:800px' src='cid:0' alt='%s'></img><h3>Have a nice day.\
</h3></body></html>" % (city, weather, min_temp, max_temp, pic_desc, pic_desc)

msg = MIMEMultipart()
msg['From'] = _format_addr(from_addr)
msg['To'] = _format_addr(to_addr)
msg['Cc'] = _format_addr(cc_addr)
msg['Subject'] = Header(u'每日天气播报', 'utf-8').encode()
msg.attach(MIMEText(content, 'html', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片
with open(pic_file_name, 'rb') as f:
    # 设置附件的MIME和文件名,这里是jpg类型
    mime = MIMEBase('image', 'jpg', filename=pic_name)
    # 加上必要的头信息
    mime.add_header('Content-Disposition', 'attachment', filename=pic_name)
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来
    mime.set_payload(f.read())
    # 用Base64编码
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart
    msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25)  # SMTP协议默认端口是25
# server.starttls() #SSL加密的SMTP,注意修改端口号
server.set_debuglevel(1)    # 打印和邮件服务器交互的详细信息
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr, cc_addr], msg.as_string())
server.quit()

##参考链接

[1] http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000

[2] http://blog.csdn.net/wmqi10/article/details/29566301

[3] http://blog.csdn.net/wbb1075421270/article/details/51810282?locationNum=4&fps=1

© 著作权归作者所有

共有 人打赏支持
零号_特工
粉丝 0
博文 3
码字总数 2326
作品 0
合肥
程序员
全网最有趣的python学习视频丨逗比洗脑讲师

作为二十一世纪的人,不会一点编程知识可以说是一个现代文盲了,最近小编我又受打击了,隔壁擅长编程的小伙伴竟然靠自己的编程技巧成功吸引到了小姐姐的关注[dogdog] 这就让我嫉妒了,于是小...

辣鸡软件 ⋅ 05/23 ⋅ 0

[python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

前面作者写了很多Python系列文章,包括: Python基础知识系列:Python基础知识学习与提升 Python网络爬虫系列:Python爬虫之Selenium+Phantomjs+CasperJS Python数据分析系列:知识图谱、web...

eastmount ⋅ 05/03 ⋅ 0

2017年IT人年终总结,一个都不知道的你这一年就白过了

移动互联时代,每天都会涌现大量新词热词,我们IT圈也不例外,2017年就要过去了,是时候来回顾下这一年都发生了什么 首先来看看2017年互联网的热词与流行语,原来2017年的年轻人们聊天最经常...

uzv80px5v412ne ⋅ 2017/12/30 ⋅ 0

人工智能的新年“新气象” 首现“看东方”

  在元旦小长假中我们挥别了2016。而在全年无休的东方卫视,则在2017年1月1日为台里的见习主播微软小冰,安排了一份更加重要的工作 – 这一天的东方卫视大型晨间新闻播报栏目《看东方》像往...

人工智能观察室 ⋅ 2017/01/04 ⋅ 0

Eric:Python的IDE之eric的简介、安装、使用方法之详细攻略——Jason Niu

Eric的简介 Eric是一个完整的Python编辑器和IDE,用Python编写。它是基于跨平台QT-UI工具包,集成了高度灵活的闪烁编辑器控件。它被设计成可用作为“每日”的快速和肮脏的编辑器,以及作为一...

qq_41185868 ⋅ 05/24 ⋅ 0

好朋友自学一月Python后直接爆了我校内网,我想问可以改分数吗?

这个暴力破解很多语言都可以做到,然而我还是推崇Python。因为Python有抓包神器urllib 包呀! Python相对其它语言代码量根本不是一个级别的! 打个比方:1 + 1 + 1 + 1 = 4 Python:1 X 4 =...

python达人 ⋅ 04/07 ⋅ 0

Python是如何怼翻其他编程语言而窜上宝座的

来PK啊! 谁怕谁啊! 在过去的两年间,Python一路高歌猛进,成功窜上“最火编程语言”的宝座。 更可怕的是,这把火不仅仅是在程序员的圈子里越烧越旺,甚至还烧到了程序员的圈子外,从小学生...

超级数学建模 ⋅ 04/18 ⋅ 0

为什么未来的Python大佬不是你?

因为大佬比你更努力的在学习! 每个人都怕被这变幻莫测的时代所抛弃,更何况我们眼中的大佬呢? 现在市场上急需的是精通Python的人才!因为在IT行业随便抓一把,都有一堆人有着Python的基础知...

QingLeiLi ⋅ 05/12 ⋅ 0

编程入门13:Python文本处理

上一篇:编程入门12:Python异常处理 计算机经常需要对文本进行各种操作,我们知道Python语言表示文本的类型是字符串(str),其中可以包含任何字符。系统内部以标准的“统一码”(Unicode)...

starglow_leo ⋅ 06/19 ⋅ 0

一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者 ⋅ 04/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 9分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 13分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 25分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 45分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部