Python入坑之哄女朋友开心小技巧

前言

人生苦短,我用Python。这句话证明现在Python有多火。大约2年前我就开始接触了Python,因工作需求要自学Python ,后续的SDK打包脚本就是用Python编写的。对于Python的理解基本停留在会用阶段,深入的话就拉垮了。最近忙里偷闲,用之前自学过的知识点组合一下,搞一点有意思的事情。

你能学到的知识

  • Python中的JSON解析

  • Python中SMTP发送邮件

  • Python中字典的概念

文章中所用的编译器为Mac Pycharm 社区版,演示代码为Python 2.7版本

制定一个需求

获取中国天气网指定城市的天气,例如我在北京。然后获取北京天气数据等状态信息,通过邮件发送给女朋友,就这么简单。

环境配置

为了照顾一下新手同学,从零给大家演示下,环境的配置和安装。有python基础的可以忽略此块往下看。新手同学看过来啊、看过来!!!

本文演示的编译器为Mac Pycharm社区版,Python环境是mac上自带的不需要单独装(这也是我喜欢用mac原因很多环境都自带)。打开终端输出python直接能展示出python版本。我的版本为2.7.16。

Python入坑之哄女朋友开心小技巧

倒叙说一下,如果之前没有安装过对应的库直接running我的小例子会直接报错,报错原因入下图所示,这个错误简单说就是没有找到requests这个库。在安装requests库 之前你的有一个包管理工具,用来管理第三方库的安装、卸载、更新,没错它就是pip.

Python入坑之哄女朋友开心小技巧

1.pip简介和安装

pip是什么:首先要给它定义一下,pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。你可以通过以下命令来判断是否已安装:

pip --version     # Python2.x 版本命令

pip3 --version    # Python3.x 版本命令

当然了正常情况下, 你肯定是没安装过。那么我演示一下,mac里怎么安装配置的。mac里面python自带easy_install,在终端里面执行sudo easy_install pip

用sudo(超级管理员)命令的时候需要输入密码,这个密码是你自己电脑的密码,输入的时候采取了“安全措施”,你看不到自己输入的字符,完整的输入进去以后,回车就可以了。如果输出错误会有提示的,你重新输入即可。对应的命令展示看下图。完成后输入 pip -v 显示20.3.1说明安装是没问题的。

Python入坑之哄女朋友开心小技巧

2.requests简介和安装

接着上面的继续说,pip包管理工具安装完成了,该进行下一步安装requests。那么什么是Requests : requests是python编写,基于urllib,采用Apache2 Licensed 开源协议Http库。它用起来比urllib更加方便,可以满足我们工作中很多有关于http的需求。

终端直接运行 pip install requests即可安装,这是python2.x的命令,如果你用的和我不是一个版本,用的python3.x的话需要更改下命令:pip3 install requests 。安装成功的标志能看到Successfully,如下图所示喽。

Python入坑之哄女朋友开心小技巧

网络解析

根据上面的需求得知我们需要一个天气数据来填充邮件。中国天气网有一个免费天气Api地址:点击直达,通过城市名字获得天气数据,json数据格式,如下图所示,为了看着舒服格式化json数据。

Python入坑之哄女朋友开心小技巧

{
	"data": {
		"yesterday": {
			"date": "15日星期二",
			"high": "高温 0℃",
			"fx": "北风",
			"low": "低温 -8℃",
			"fl": "<![CDATA[1级]]>",
			"type": "多云"
		},
		"city": "北京",
		"forecast": [{
			"date": "16日星期三",
			"high": "高温 2℃",
			"fengli": "<![CDATA[2级]]>",
			"low": "低温 -8℃",
			"fengxiang": "北风",
			"type": "晴"
		}, {
			"date": "17日星期四",
			"high": "高温 4℃",
			"fengli": "<![CDATA[2级]]>",
			"low": "低温 -6℃",
			"fengxiang": "北风",
			"type": "晴"
		}, {
			"date": "18日星期五",
			"high": "高温 1℃",
			"fengli": "<![CDATA[2级]]>",
			"low": "低温 -8℃",
			"fengxiang": "北风",
			"type": "晴"
		}, {
			"date": "19日星期六",
			"high": "高温 2℃",
			"fengli": "<![CDATA[1级]]>",
			"low": "低温 -7℃",
			"fengxiang": "北风",
			"type": "晴"
		}, {
			"date": "20日星期天",
			"high": "高温 5℃",
			"fengli": "<![CDATA[1级]]>",
			"low": "低温 -6℃",
			"fengxiang": "北风",
			"type": "晴"
		}],
		"ganmao": "感冒高发期,尽量避免外出,外出戴口罩防护。",
		"wendu": "1"
	},
	"status": 1000,
	"desc": "OK"
}

我们用  python 代码对这个url进行解析,我写一个小例子。如下图所示。是不是代码很少python就四行搞定。而java进行一次get请求,少说都要写一两百行代码,创建流,发请求,解析数据,关闭流等等。当然了我也不是说java不好,每个语言的诞生总是有它应用的场景。

Python入坑之哄女朋友开心小技巧

邮件相关的配置

接着上面说数据有了,得发邮件呀。Python中SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python创建 SMTP 对象语法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP 服务器主机,这是一个可选参数。

  • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。

  • local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

参数说明:

  • from_addr: 邮件发送者地址。

  • to_addrs: 字符串列表,邮件发送地址

  • msg: 发送消息

这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

既然要使用SMTP协议,对应的邮箱我们需要开启对应服务才能使用。我拿QQ邮箱演示(其它邮箱基本都是一个套路不做多说) 邮箱设置——账户——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务打开前两项。

Python入坑之哄女朋友开心小技巧

开启前两项后,会出现下图所示,点击生成授权码。生成完授权码一定要保存好不要外泄涉及到安全问题不可忽视。代码中授权码我用字符串“p123ffsasasa1”代替。为了正常跑通流程需要换成你的邮箱还有授权码,不然发不了邮件。

Python入坑之哄女朋友开心小技巧

完整的代码

该说该注意的都已经说了,直接上代码,注释基本都加上了。不难理解,代码需要注意对齐和空格问题。

代码中用到字典,字典是另一种可变容器模型,且可存储任意类型对象。字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的。

sendEmail.py

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests, json,smtplib
from email.mime.text import MIMEText
from email.header import Header

'''
# 获取城市天气 
#参数1 传城市信息 
#参数2 传url链接
#例如今日天气 :   '+response['data']['forecast'][0]['type'] ,这个获取forecast字段下type字段文字
'''
def getCityWhether(city,linkUrl):
	url = linkUrl+ city   #拼接字符串   实际url就是  http://wthrcdn.etouch.cn/weather_mini?city=北京
	response = requests.get(url).json()  #把返回的数据解析成json
	msg = '\r\n今日天气 :   '+response['data']['forecast'][0]['type'] + '\r\n温度  :'+response['data']['forecast'][0]['high'] + '     --      '+response['data']['forecast'][0]['low'] + '\r\n风力:'+response['data']['forecast'][0]['fengli'][9:-3] +'      --   '+response['data']['forecast'][0]['fengxiang']+'\r\n注意事项  :  '+response['data']['ganmao']+'\r\n'
	return str(msg)


# python 字典类型转换为json对象
dataSource = {
	'linkUrl':'http://wthrcdn.etouch.cn/weather_mini?city=',
	'city':'北京',      #你所在的城市,假如你在上海,可以写上海
	'title':'帅气的男朋友上线喽!\r\n',
	'end':'\r\n                                                    ———python测试呦~~~~~~~'
}

# 构造邮件的文本数据
msg = dataSource['title'] +getCityWhether(dataSource['city'],dataSource['linkUrl'])+dataSource['end']

message=MIMEText(msg,'plain','utf-8')
message['From']=Header('北京朝阳区精神病院长 <北京朝阳区精神病院长@qq.com>','utf-8') 		 #邮件展示发件人信息
message['To']=Header('小仙女  <小仙女@qq.com>','utf-8')								 #邮件展示收件人信息
message['Subject']=Header("小仙女专属邮件,请点击查收!",'utf-8')						 #接收邮件主题内容

sender='精神病@qq.com' 		      #真实的邮箱地址,一定要填你自己的邮箱
receiverMail='院长@qq.com'	       #真实的收件邮箱,你要发邮件的邮箱地址
try:
	# 发送邮件构造
	smtp = smtplib.SMTP()
	smtp.connect('smtp.qq.com',25)  #qq请求方式  参数2 为端口号
	smtp.login('精神病@qq.com', 'p123ffsasasa1')  #参数1 你自己的真实邮箱地址 参数2 为 smtp的授权码,需要自己生成
	smtp.sendmail(sender, receiverMail, message.as_string())  #发送邮件
	smtp.quit()
	print "发送邮件成功请耐心等候..........."
except smtplib.SMTPException:
	print "Error:无法发送邮件请检查代码"

如何运行程序? 在编译器右键run,或者 控制台 python sendEmail.py。代码展示效果如下图

Python入坑之哄女朋友开心小技巧

代码后续优化和改善

抛砖引玉,功能可以继续往下写,获取天气的基础上可以套用免费或者收费的接口加入小笑话 黄历 等功能,通知上不一定要用邮箱的方式,可以以短信 微信(之前python是有个免费插件后来被和谐了)等方式发给你女朋友。如此关心你女朋友。她一感动是不是今天不用跪搓衣板了

Python入坑之哄女朋友开心小技巧

结尾

别问,问就是单身 。好好工作,努力赚钱。爱情依靠相互喜欢相互吸引,勿做舔狗。加油吧打工人

Python入坑之哄女朋友开心小技巧

上一篇:如何优雅地定时发送QQ邮件“问候“别人


下一篇:linux命令之 mail