文档章节

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

零号_特工
 零号_特工
发布于 2017/05/25 20:06
字数 885
阅读 42
收藏 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
0
收集的几个Python恋爱神器,让python编程帮你追求女孩!

](upload_images/9305082-c125aaaec63deed4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) Python程序员教你由单身dog进进化成为秀恩爱dog! 今天教大家,怎样用Python做一份特别的礼...

Python新世界
07/27
0
0
[python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

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

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

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

uzv80px5v412ne
2017/12/30
0
0
绝了!Python又放大招,逆袭宇宙语言!

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 自2017年国务院印发《新一代人工智能发展规划》,明确指出在中小学阶段设置人工智能相关课程后,Python一路逆...

CSDN程序人生
09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
17分钟前
2
0
14-利用思维导图梳理JavaSE-大汇总

14-利用思维导图梳理JavaSE-Java基础知识大汇总 主要内容 1.对象入门 2.一切都是对象 3.程序流程控制 4.初始化和消除 5.权限访问控制 6.复用类 7.多态 8.接口与抽象类 9.内部类 10.容器 11.异...

飞鱼说编程
53分钟前
5
0
利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService { @Autowired private UserService userService;} 是不是很熟悉的感觉?但是呢 如果你用...

HeyS1
今天
25
0
IBATIS 写BLOB字段遇到的问题

1、 首先遇到的配置问题,通过设置typeHandler 来支持写入。接下来由此引出了事务的问题。 <typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support....

echo-neo
今天
1
0
37. Sudoku Solver

Description tags: backtrack,hash table difficulty: hard Write a program to solve a Sudoku puzzle by filling the empty cells.A sudoku solution must satisfy all of the following......

52iSilence7
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部