文档章节

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

零号_特工
 零号_特工
发布于 2017/05/25 20:06
字数 885
阅读 54
收藏 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
合肥
程序员
私信 提问
人工智能的新年“新气象” 首现“看东方”

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

人工智能观察室
2017/01/04
0
0
全网最有趣的python学习视频丨逗比洗脑讲师

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

辣鸡软件
2018/05/23
0
0
收集的几个Python恋爱神器,让python编程帮你追求女孩!

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

Python新世界
2018/07/27
0
0
2017年IT人年终总结,一个都不知道的你这一年就白过了

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

uzv80px5v412ne
2017/12/30
0
0
活动招募——Python开发趣味应用

活动招募——Python开发趣味应用 Python,一门有趣的语言,有人说它是胶水语言,有人说它是最美的语言 今天,我们列举了4个场景,来使用Python进行相应的简单小应用开发,解决实际的问题 第一...

宋庆离
2017/08/17
5.2K
14

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud搭建微服务架构----流量回放

前言 系统微服务化后,传统的自测/测试方式都变得比较困难: 依赖的服务可能不稳定。 服务无法提供期望的响应数据。 缺少场景构造标准。 随着整体业务越来越复杂,微服务依赖的越来越多,测试...

春哥大魔王的博客
8分钟前
0
0
记一次springboot模块配置问题导致读取Apollo配置中心配置文件始终错误的问题

现在正在做的一个项目采用的是微服务,主框架是spring cloud,配置中心用的是携程的Apollo。 项目下有多个服务,在测试服务器上启动用户服务的时候发现在eureka中心另一个服务被启动了,尝试...

zcqshine
9分钟前
2
0
流处理和批处理框架的异同

分布式流处理需求日益增加,包括支付交易、社交网络、物联网(IOT)、系统监控等。业界对流处理已经有几种适用的框架来解决,下面我们来比较各流处理框架的相同点以及区别。 分布式流处理是对...

hblt-j
13分钟前
0
0
spring cloud 面试题

什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化...

狼王黄师傅
14分钟前
0
0
前嗅ForeSpider教程:采集黄页88

以黄页88为例,采集当前列表页新闻的正文数据: 第一步:新建任务 ①点击左上角“加号”新建任务,如图1: 【图1】 ②在弹窗里填写采集地址,任务名称,如图2: 【图2】 ③点击下一步,选择进...

forespider
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部