urllib庫調用免費的天氣API接口,獲取所在城市的天氣信息(可以通過抓包工具抓取對應城市的citycode)。
大家應該知道Bing的背景圖比較漂亮,每日會更新,獲取圖片的API也是公開的,可以調用。圖片下載到本地 將天氣信息和圖片利用python的smtp模塊郵件發送給女朋友。
還可以將python程序上傳到服務器上,加入一條定時任務,每天定時執行程序。
# coding=utf-8 import urllib3 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,ast def _format_addr(s): name, addr = parseaddr(s) print (name,addr) headers = Header(name, 'utf-8').encode() result =formataddr((headers, addr)) return result # 獲取bing的每日圖片,修改api中的參數n,可以獲取多張圖片 # 從bing的api返回的xml中提取圖片的url,然后下載到本地,並命名為yyyymmdd.jpg def get_bing_pic(): http = urllib3.PoolManager() r = http.request("GET","http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1") webpage = r.data root = ET.fromstring(webpage) # 獲取圖片鏈接 url = 'http://cn.bing.com' + root.find('image').find('url').text # 圖片描述 pic_desc_ = root.find('image').find('copyright').text # 圖片保存到本地的位置 pic_file_name_ = "d://" + time.strftime('%Y%m%d', time.localtime(time.time()))+".jpg" urllib.request.urlretrieve(url, pic_file_name_ ) #urllib2.urlretrieve(url, pic_file_name_ + url[-4:]) return pic_file_name_ , pic_desc_ # 調用免費的天氣API接口,city_code默認為廣州的code:101280101 中山的code:101281701,其他城市code請使用抓包工具 def get_city_weather(city_code='101281701'): http = urllib3.PoolManager() r = http.request("GET","http://www.weather.com.cn/data/cityinfo/"+city_code+".html") print ((r.data.decode())) weather_json = ast.literal_eval(r.data.decode()) #weather_json= json.load(r.data.decode()) #response = urllib2.urlopen("http://www.weather.com.cn/data/cityinfo/"+city_code+".html") #weather_json = json.loads(r.data.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 = 'mylove<xxx@163.com>' from_addr1 = 'xxx@163.com' password = 'xxxKRCHDKGHIFONZHGO' # SMTP服務器地址: smtp_server = 'smtp.163.com' # 收件人地址: to_addr = 'mylove1<xxx@163.com>' # 抄送給自己: cc_addr = 'mylove<zxxx@163.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] # 這里是郵件正文內容,''是為了將附件的圖片插入郵件正文中,直接顯示 content = u"Hello %s今天天氣%s,最低溫度%s,最高溫度%s .<br> %s <br> Have a nice day." % (city, weather, min_temp, max_temp, pic_desc) print (content) msg = MIMEMultipart() msg['From'] = _format_addr(from_addr) msg['To'] = _format_addr(to_addr) msg['Cc'] = _format_addr(cc_addr) #msg['From'] = from_addr #msg['To'] = to_addr #msg['Cc'] = 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(0) # 打印和郵件服務器交互的詳細信息 server.login(from_addr1, password) server.sendmail(from_addr, [to_addr, cc_addr], msg.as_string()) server.quit()