美文网首页
Python入坑之哄女朋友开心小技巧

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

作者: 北京朝阳区精神病院院长 | 来源:发表于2020-12-16 18:52 被阅读0次

    前言

    人生苦短,我用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-v.png

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

    error.png

    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说明安装是没问题的。

    install pip.png

    2.requests简介和安装

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

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

    install requests.png

    网络解析

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

    json.png
    {
        "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不好,每个语言的诞生总是有它应用的场景。

    image.png

    邮件相关的配置

    接着上面说数据有了,得发邮件呀。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服务打开前两项。

    setting.png

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

    code.png

    完整的代码

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

    代码中用到字典,字典是另一种可变容器模型,且可存储任意类型对象。字典值可以没有限制地取任何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。代码展示效果如下图

    展示效果.png

    代码后续优化和改善

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

    表情包.png

    结尾

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

    image.png

    相关文章

      网友评论

          本文标题:Python入坑之哄女朋友开心小技巧

          本文链接:https://www.haomeiwen.com/subject/pjuygktx.html