大四的生活就是這麼無聊,我琢磨著也學了這麼多東西了,為啥不能用自己的知識來給生活找點樂子呢?我想反正每天都要給Ta問候一聲早安,為何不同時講個笑話呢?如果能寫個程式每天早上定時給Ta發一條問候早安同時講一個笑話的簡訊該多好。說幹就幹,走起~
笑話準備
笑話從哪裡來?自己寫肯定是不現實的。在這個“雲”的時代,各種雲都有,自然是不缺開放API的(大部分都是免費的)。隨意一搜,果然被我找到一個介面:易源_笑話大全http://apistore.baidu.com/apiworks/servicedetail/864.html
根據它給的API可以獲取它所有的笑話,關鍵程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
appkey = "你自己申請的appkey" url = 'http://apis.baidu.com/showapi_open_bus/showapi_joke/joke_text?page=1'#API地址 req = urllib2.Request(url) #初始化請求 req.add_header("apikey", appkey) #新增 http請求的header resp = urllib2.urlopen(req) #發起請求 content = resp.read()#獲得返回內容,json格式字串 if(content): json_result = json.loads(content) #轉換為字典物件 # 下面從這個字典中獲得笑話的標題和正文 content_list = json_result['showapi_res_body']['contentlist'] # 只取第一條笑話的標題和正文 first_title = content_list[0]['title'].encode('utf8') first_text = content_list[0]['text'].encode('utf8') print '標題:'+first_title print '內容:'+first_text else: print "error" |
這裡簡單做一下介紹:urllib2是Python的一個獲取URL的元件。他以urlopen函式的形式提供了一個非常簡單的介面,具有利用不同協議獲取URL的能力,同樣提供了一個比較複雜的介面來處理一般情況。urllib2可用來完成以下功能:
1.獲取Web頁面
2.在遠端http伺服器上驗證
3.額外資料請求,如表單提交(GET和POST)
4.異常處理
5.非http協議通訊(如FTP)
它的詳細操作可以檢視官方文件https://docs.python.org/2/library/urllib.html
發簡訊
笑話準備好了,那麼怎麼發簡訊到手機呢?類似上面小節,我想著肯定也有開放的API,但是這次就沒那麼幸運了,簡訊API都是要付費的~, 對於一個學生黨來說有點不現實。怎麼辦??苦思冥想不得其解,這個時候突然收到移動服務號的簡訊如圖:
這提醒了我,移動的139郵箱要給使用者收到的郵件傳送簡訊提醒!!這就妙了,因為發郵件是不需要錢的,我只需要發郵件到Ta的139郵箱就可以了,哈哈。關鍵程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import smtplib,sys from email.mime.text import MIMEText mail_host="smtp.qq.com" #設定伺服器 mail_user="你的qq郵箱 " #使用者名稱 mail_pass="你的qq郵箱密碼" #密碼 def send_mail(to_list,sub,content): #to_list:收件人;sub:主題;content:郵件內容; me="笑話來了"+"" #這裡的hello可以任意設定,收到信後,將按照設定顯示 msg = MIMEText(content,_subtype='html',_charset='utf-8') #建立一個郵件訊息例項,這裡設定為html格式郵件 msg['Subject'] = sub #設定主題 msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP #例項化python郵件的smtp類 s.connect(mail_host) #連線smtp伺服器 s.login(mail_user,mail_pass) #登陸伺服器 s.sendmail(me, to_list, msg.as_string()) #傳送郵件 s.close() return True except Exception, e: print str(e) return False |
我是用的是qq郵箱,一般的郵件伺服器都會開放smtp,pop3,imap服務的埠給使用者,讓使用者可以查詢郵件或者傳送郵件。我們這裡傳送郵件,所以使用smtp服務。Python 的smtplib庫可以實現這一功能。
整合程式碼嘗試,效果如下圖:
可見不能完全顯示,這是因為139郵箱免費版具有140字限制如圖:
有兩種辦法解決,一是付費5塊錢(還是不願意!),二是把一個笑話分成三部分,分別放在發件人,主題和正文中,如下圖:
還是不行,字數限制是個硬傷。那就從原來的從笑話列表裡選擇第一個笑話改為選擇字數最少的一個。程式碼如下:
1 2 3 4 5 6 7 8 |
json_result = json.loads(content) content_list = json_result['showapi_res_body']['contentlist'] minlen = 10000 for item in content_list: if len(item['text'])<minlen: title = item['title'] text = item['text'] minlen = len(item['text']) |
如下圖:
基本可行了,不過發多了過後騰訊會認為是垃圾郵件(汗),主要是發件人名字太奇怪了,大家有什麼好主意可以告訴我一下啊,多多交流。
完整程式碼(joke.py)如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# -*- coding: utf-8 -*- ''' Created on 2016年1月22日 @author: 邱康 ''' import urllib2, json,sys,smtplib from email.mime.text import MIMEText reload(sys) sys.setdefaultencoding('utf-8')#避免中文編碼問題 mail_host="smtp.qq.com" #設定伺服器 mail_user="************" #使用者名稱 mail_pass="*********" #口令 mailto_list=['*******'] #郵件接受者 def send_mail(to_list,part1,sub,content): #to_list:收件人;sub:主題;content:郵件內容; me=part1+"<"+mail_user+">" #hello msg = MIMEText(content,_subtype='plain',_charset='utf-8')#建立一個例項,這裡設定為純文字格式郵件編碼utf8 msg['Subject'] = sub #設定主題 msg['From'] = me #設定發件人 msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() #例項化 s.connect(mail_host) #連線smtp伺服器 s.login(mail_user,mail_pass) #登陸伺服器 s.sendmail(me, to_list, msg.as_string()) #傳送郵件 s.close() return True except Exception, e: print str(e) return False if __name__ == '__main__': appkey = "e2376cfbe3b27dff923ed61698839a67" url = 'http://apis.baidu.com/showapi_open_bus/showapi_joke/joke_text?page=1' req = urllib2.Request(url) req.add_header("apikey", appkey) resp = urllib2.urlopen(req) content = resp.read() if(content): json_result = json.loads(content) content_list = json_result['showapi_res_body']['contentlist'] minlen = 10000 for item in content_list: if len(item['text'])<minlen: first_title = item['title'] first_text = item['text'] minlen = len(item['text']) print 'title:'+first_title print 'content:'+first_text length = len(first_text) part1 = first_text[0:10] part2 = first_text[10:22] part3 = first_text[22:length] print part1,"+",part2,"+",part3 if send_mail(mailto_list,part1,part2,part3): print "send msg succeed" else: print "send msg failed" else: print "get joke error" |
定時任務
現在準備工作齊全了,就差最後一步定時傳送了。Linux 提供了一個定時任務工具crontab,windows提供了一個定時任務工具叫做任務計劃,不過我的筆記本又不是隨時連上網的,所以把這個指令碼放在實驗室的虛擬機器上了(debian)。一般linux都預裝有python環境所以只需以下命令:
1 |
Vi /etc/crontab |
在檔案最後一行新增
1 |
30 7 * * * root python /root/joke.py |
這樣就能達到每天早上7:30 傳送給Ta發簡訊的目的啦!
總結
總覺得程式設計師是一個很好的職業,雖然會比較累,不過只要有一雙發現的眼睛和對生活的熱情就能夠用自己的知識給生活帶來一些閃光點,比如你可以為不會上網的長輩爬取天氣預報資訊傳送到手機簡訊順便問候一聲,我相信長輩們都會很開心的。