实现功能:
生成一个自动化发邮箱的小程序,每天给女朋友or暗恋的小姑娘发天气预报 用来逗女朋友开心~~
话不多说,直接先上代码!!!
import smtplib#构造简单邮件传输协议
from email.header import Header#导入email模块中的header函数
from email.mime.text import MIMEText#导入email模块中的mime.text函数
from email.mime.image import MIMEImage#导入email模块中的mime.image函数
from email.mime.multipart import MIMEMultipart#导入email模块中的mime.multipart函数
from aip import AipSpeech#导入百度AIP
import requests
import time
def emailsend(act_mail,title_text,text):#定义收件人和邮件内容
DIY(text)
sd_mail='在这里输入你的邮箱'#定义发件人
sd_pass='在这里输入你的密匙'#sd_mail的密匙
mail_body=MIMEMultipart('mixed')#定义邮件整体且其对象类型定义为混合型
#定义头尾信息(没有也不影响代码的运行)
mail_body['From']=sd_mail+'<'+sd_mail+'>'
mail_body['To']=act_mail
#邮件的标题
body_head='你的天气预报来啦!'+title_text
mail_body['subject']=Header(body_head,'utf-8')#此行代码主要是用'subject'定义了发送的邮件主题
#构造图片
img_fil = open('image/weather.jpg','rb').read()
mail_img=MIMEImage(img_fil)
mail_img.add_header('Content-ID','' )
mail_img["Content-Disposition"] = 'attachment; filename="Hatsune Miku.jpg"'
mail_body.attach(mail_img)
#发送邮件附件
adc=open('这是你的萝莉音.mp3','rb').read()#此处采用了萝莉音。你也可以不采用萝莉音,大叔?
mail_adc=MIMEText(adc,'base64','utf-8')
mail_adc['Content-Type']='application/octet-stream'
mail_adc.add_header('Content-Disposition','attachment',filename='Lolita.mp3')
mail_body.attach(mail_adc)
#发送邮件内容
body_main_string=text
body_main=MIMEText(body_main_string,'plain','utf-8')
mail_body.attach(body_main)
ftp=smtplib.SMTP('smtp.qq.com',25)#定义接口,网口号为25
ftp.login(sd_mail,sd_pass)#登录扣扣邮箱
ftp.sendmail(sd_mail,act_mail,mail_body.as_string())#发送邮件
ftp.quit()#结束
def DIY(text):
one='输入你的API_ID'#API_ID
two='输入你的API_KEY'#API_KEY
three='输入你的SECRER_KEY'#SECRER_KEY
client = AipSpeech(one,two,three)#用AipSpeech方法将文字转码为声音
result = client.synthesis(text, 'zh', 1,{'spd':3,'pit':6,'vol': 5, 'per': 4})
'''
主要参数:
spd:语速,取值0—9,默认为5中语速(非必须)
pit:音调,取值0—9,默认为5中音调(非必须)
vol:音量,取值0—9,默认为5中音量(非必须)
per:发音人选择,0位女声,1为男声,3为情感合成-度逍遥,4为情感-度YY,默认为普通女(非必须)
'''
if not isinstance(result, dict): # 如果result不是dict(字典)
with open('这是你的萝莉音.mp3', 'wb') as f:#将语音转为mp3文件
f.write(result)#在兄弟目录下生成文件,新文件将会覆盖旧文件
def capture():#我没有采用爬虫,而是采用了接口,嗯,接口稳定多了,咳咳。其实就是懒得看爬虫,急着交大作业
url='https://api.heweather.net/s6/weather/forecast?location=auto_ip&key=aed1ba57bc0a40e596fed6a582ec4726'
result=requests.get(url).json()
#进行解码
boxto=['0状态码','1.天气预报时间','2.白天天气状况','3.夜间天气状况','4.最高温','5.最低温','6.相对湿度','7.紫外线强度','8.风力','9.日升日落']
msg0=result['HeWeather6'][0]['status']
while msg0=='ok':
for i in range(3):
#msg0=result['HeWeather6'][0]['status']
msg1=boxto[1]+result['HeWeather6'][0]['daily_forecast'][i]['date']
msg2=boxto[2]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_d']
msg3=boxto[3]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_n']
msg4=boxto[4]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_max']+'摄氏度'
msg5=boxto[5]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_min']+'摄氏度'
msg6=boxto[6]+result['HeWeather6'][0]['daily_forecast'][i]['hum']
msg7=boxto[7]+result['HeWeather6'][0]['daily_forecast'][i]['uv_index']
msg8=boxto[8]+result['HeWeather6'][0]['daily_forecast'][i]['wind_sc']
msg9=boxto[9]+' 早晨 '+result['HeWeather6'][0]['daily_forecast'][i]['sr']+' 至 '+' 下午 '+result['HeWeather6'][0]['daily_forecast'][i]['ss']
ttry=[msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9]
end=''
#解码完成
for k in ttry:
end+=k+'\n'
if i==0:
No_1=end+'\n\n\n'
elif i==1:
No_2=end+'\n\n\n'
elif i==2:
No_3=end+'\n\n\n'
else :
break
break
box=No_1+No_2+No_3
return box
text=capture()
act_mail_class = {'A.大哥:': '大哥的邮箱', 'B.关羽:': '关羽的邮箱'}# 收件人参数
act_len=len(act_mail_class)
for i in range(act_len):
for key_1 in act_mail_class:
print(key_1)
order_send=input('请输入想要发送的人【列如:发给大哥就输入:a(不分大小写)】')
order_send=order_send.title()
for key in act_mail_class:
if order_send[0]==key[0]:
send_middle=act_mail_class[key]
emailsend(send_middle,key[2:],text)
print('发送完成')
time.sleep(1.5)
fily=input('如果你想结束请输入1\n')
end=eval(fily)
if end==1:
只要你稍微更改一下扣扣账号然后注册一个和风天气的密匙就可以直接拿去玩了,哈哈
下面,为小白剖析讲解一下这个过程
用到的库:
import smtplib#构造简单邮件传输协议 from email.header import Header#导入email模块中的header函数 from email.mime.text import MIMEText#导入email模块中的mime.text函数 from email.mime.image import MIMEImage#导入email模块中的mime.image函数 from email.mime.multipart import MIMEMultipart#导入email模块中的mime.multipart函数 from aip import AipSpeech#导入百度AIP import requests import time
smtplib模块用来构造一个传输协议
email模块你可以全部导入也可以导入里面的几个函数(header , mime.text , mime.image , mime.multipart),随你心意
requests库用来访问url
time库可导可不导,看你心情发挥
API我用的是百度的,所以导入了Aipspeech(用API关键是萝莉音语音播报的功能实现,如果不喜欢这个功能就不要导入这个函数库叭)
第一部分:
1.首先去QQ邮箱
打开 设置-账户-开启服务-开启POP3/SMTP服务,然后点击生成授权码,python发送邮件要用。
不会可以参考菜鸟教程
2.推荐使用和风天气API(强烈推荐付费版,一两块钱就可以访问一两千次,主要是稳定)
2.1浏览器打开和风天气
2.2:自己注册一个账号后打开控制台
2.3:点击登录
2.4:打开开发文档:
2.5:点击快速开始,并且仔细阅读:
红色剪头指向的三个重点工具,里面说的很详细,关于如何使用。
2.6:特别提醒,当后面程序访问报错的时候一定要仔细阅读错误码,然后再去检查程序。
代码块:
def capture():
url='https://api.heweather.net/s6/weather/forecast?location=auto_ip&key=aed1ba57bc0a40e596fed6a582ec4726'#和风天气的url
result=requests.get(url).json()
#进行解码
boxto=['0状态码','1.天气预报时间','2.白天天气状况','3.夜间天气状况','4.最高温','5.最低温','6.相对湿度','7.紫外线强度','8.风力','9.日升日落']#根据你的需求去解码,在开发文档里面很清晰,他的返回全部是字典嵌套格式。
msg0=result['HeWeather6'][0]['status']
while msg0=='ok':
for i in range(3):
#msg0=result['HeWeather6'][0]['status']
msg1=boxto[1]+result['HeWeather6'][0]['daily_forecast'][i]['date']
msg2=boxto[2]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_d']
msg3=boxto[3]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_n']
msg4=boxto[4]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_max']+'摄氏度'
msg5=boxto[5]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_min']+'摄氏度'
msg6=boxto[6]+result['HeWeather6'][0]['daily_forecast'][i]['hum']
msg7=boxto[7]+result['HeWeather6'][0]['daily_forecast'][i]['uv_index']
msg8=boxto[8]+result['HeWeather6'][0]['daily_forecast'][i]['wind_sc']
msg9=boxto[9]+' 早晨 '+result['HeWeather6'][0]['daily_forecast'][i]['sr']+' 至 '+' 下午 '+result['HeWeather6'][0]['daily_forecast'][i]['ss']
ttry=[msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9]
end=''
#解码完成
for k in ttry:
end+=k+'\n'
if i==0:
No_1=end+'\n\n\n'
elif i==1:
No_2=end+'\n\n\n'
elif i==2:
No_3=end+'\n\n\n'
else :
break
break
box=No_1+No_2+No_3
return box#返回了一段基础天气信息的文本
这个函数功能就是进入和风天气提供的接口(API)里面找到一些我们需要的天气预报信息,然后提取解码成人类看得懂的语言,返回文本出来。
3.萝莉音~~功能实现:要采用间接访问,不能用直接访问,不然后面打包的时候会出错
def DIY(text):
one='输入你的API_ID'#API_ID
two='输入你的API_KEY'#API_KEY
three='输入你的SECRER_KEY'#SECRER_KEY
client = AipSpeech(one,two,three)#用AipSpeech方法将文字转码为声音
result = client.synthesis(text, 'zh', 1,{'spd':3,'pit':6,'vol': 5, 'per': 4})
'''
主要参数:
spd:语速,取值0—9,默认为5中语速(非必须)
pit:音调,取值0—9,默认为5中音调(非必须)
vol:音量,取值0—9,默认为5中音量(非必须)
per:发音人选择,0位女声,1为男声,3为情感合成-度逍遥,4为情感-度YY,默认为普通女(非必须)
'''
if not isinstance(result, dict): # 如果result不是dict(字典)
with open('这是你的萝莉音.mp3', 'wb') as f:#将语音转为mp3文件
f.write(result)#在兄弟目录下生成文件,新文件将会覆盖旧文件
def capture():
url='https://api.heweather.net/s6/weather/forecast?location=auto_ip&key=aed1ba57bc0a40e596fed6a582ec4726'
result=requests.get(url).json()
#进行解码
boxto=['0状态码','1.天气预报时间','2.白天天气状况','3.夜间天气状况','4.最高温','5.最低温','6.相对湿度','7.紫外线强度','8.风力','9.日升日落']
msg0=result['HeWeather6'][0]['status']
while msg0=='ok':
for i in range(3):
#msg0=result['HeWeather6'][0]['status']
msg1=boxto[1]+result['HeWeather6'][0]['daily_forecast'][i]['date']
msg2=boxto[2]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_d']
msg3=boxto[3]+result['HeWeather6'][0]['daily_forecast'][i]['cond_txt_n']
msg4=boxto[4]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_max']+'摄氏度'
msg5=boxto[5]+result['HeWeather6'][0]['daily_forecast'][i]['tmp_min']+'摄氏度'
msg6=boxto[6]+result['HeWeather6'][0]['daily_forecast'][i]['hum']
msg7=boxto[7]+result['HeWeather6'][0]['daily_forecast'][i]['uv_index']
msg8=boxto[8]+result['HeWeather6'][0]['daily_forecast'][i]['wind_sc']
msg9=boxto[9]+' 早晨 '+result['HeWeather6'][0]['daily_forecast'][i]['sr']+' 至 '+' 下午 '+result['HeWeather6'][0]['daily_forecast'][i]['ss']
ttry=[msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9]
end=''
#解码完成
for k in ttry:
end+=k+'\n'
if i==0:
No_1=end+'\n\n\n'
elif i==1:
No_2=end+'\n\n\n'
elif i==2:
No_3=end+'\n\n\n'
else :
break
break
box=No_1+No_2+No_3
return box
这一个函数的功能就是讲一段文本(上一个函数得到的天气预报文本)丢到百度API这个接口里面把它转变为音频,嗯,有恩多种音调,选你喜欢的就好。
不得不数百度API真的是太强大了。很有很多其他功能非常好用,老司机都懂。
详情怎么文字转语音请看这位大佬的文章,说的很详细
4.构造邮箱函数:
def emailsend(act_mail,title_text,text):#定义收件人和邮件内容
DIY(text)
sd_mail='发件人的邮箱'#定义发件人
sd_pass='你创建的密匙'#sd_mail的密匙
mail_body=MIMEMultipart('mixed')#定义邮件整体且其对象类型定义为混合型,你也可以创建其他类型,可以去看开发文档
#定义头尾信息(没有也不影响代码的运行,但是可能会被放到垃圾邮箱里)
mail_body['From']=sd_mail+'<'+sd_mail+'>'
mail_body['To']=act_mail
#邮件的标题
body_head='你的天气预报来啦!'+title_text
mail_body['subject']=Header(body_head,'utf-8')#此行代码主要是用'subject'定义了发送的邮件主题
#构造图片,后面用到访问的时候应该采用间接访问
img_fil = open('image/weather.jpg','rb').read()
mail_img=MIMEImage(img_fil)
mail_img.add_header('Content-ID','' )
mail_img["Content-Disposition"] = 'attachment; filename="Hatsune Miku.jpg"'
mail_body.attach(mail_img)
#发送邮件附件
adc=open('这是你的萝莉音.mp3','rb').read()
mail_adc=MIMEText(adc,'base64','utf-8')
mail_adc['Content-Type']='application/octet-stream'
mail_adc.add_header('Content-Disposition','attachment',filename='Lolita.mp3')
mail_body.attach(mail_adc)
#发送邮件内容
body_main_string=text
body_main=MIMEText(body_main_string,'plain','utf-8')
mail_body.attach(body_main)
ftp=smtplib.SMTP('smtp.qq.com',25)#定义接口,网口号为25
ftp.login(sd_mail,sd_pass)#登录扣扣邮箱
ftp.sendmail(sd_mail,act_mail,mail_body.as_string())#发送邮件
ftp.quit()#结束
这个函数就是实现了将一段确定的文本,语音,图片,自动构造成一封邮件,从你的邮箱发送给另一个人。
5.自动化小模块
text=capture()
act_mail_class = {'A.大哥:': '大哥的邮箱', 'B.二哥:': '二哥的邮箱'}# 收件人参数
act_len=len(act_mail_class)
for i in range(act_len):
for key_1 in act_mail_class:
print(key_1)
order_send=input('请输入想要发送的人【列如:发给大哥就输入:a(不分大小写)】')
order_send=order_send.title()
for key in act_mail_class:
if order_send[0]==key[0]:
send_middle=act_mail_class[key]
emailsend(send_middle,key[2:],text)
print('发送完成')
time.sleep(1.5)
fily=input('如果你想结束请输入1\n')
end=eval(fily)
if end==1:
break
嗯,最后,将这段代码打包生成exe文件。就ok了。生成一个自动化小程序,给女朋友暖暖心,或者追追暗恋的小姑娘,哈哈,小伙伴们拿去玩吧。
附上两张效果图: