Python趣味程式設計:定時給Ta講笑話
本文由碼農網 – 邱康原創,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
大四的生活就是這麼無聊,我琢磨著也學了這麼多東西了,為啥不能用自己的知識來給生活找點樂子呢?我想反正每天都要給Ta問候一聲早安,為何不同時講個笑話呢?如果能寫個程式每天早上定時給Ta發一條問候早安同時講一個笑話的簡訊該多好。說幹就幹,走起~
笑話準備
笑話從哪裡來?自己寫肯定是不現實的。在這個“雲”的時代,各種雲都有,自然是不缺開放API的(大部分都是免費的)。隨意一搜,果然被我找到一個介面:易源_笑話大全http://apistore.baidu.com/apiworks/servicedetail/864.html
根據它給的API可以獲取它所有的笑話,關鍵程式碼如下:
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郵箱就可以了,哈哈。關鍵程式碼如下:
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="笑話來了"+"<"+mail_user+">" #這裡的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塊錢(還是不願意!),二是把一個笑話分成三部分,分別放在發件人,主題和正文中,如下圖:
還是不行,字數限制是個硬傷。那就從原來的從笑話列表裡選擇第一個笑話改為選擇字數最少的一個。程式碼如下:
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)如下:
# -*- 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環境所以只需以下命令:
Vi /etc/crontab
在檔案最後一行新增
30 7 * * * root python /root/joke.py
這樣就能達到每天早上7:30 傳送給Ta發簡訊的目的啦!
總結
總覺得程式設計師是一個很好的職業,雖然會比較累,不過只要有一雙發現的眼睛和對生活的熱情就能夠用自己的知識給生活帶來一些閃光點,比如你可以為不會上網的長輩爬取天氣預報資訊傳送到手機簡訊順便問候一聲,我相信長輩們都會很開心的。
本文連結:http://www.codeceo.com/article/python-talk-funny.html
本文作者:碼農網 – 邱康
[ 原創作品,轉載必須在正文中標註並保留原文連結和作者等資訊。]
相關文章
- 程式設計師的幽默笑話程式設計師
- 程式設計師笑話集錦程式設計師
- 程式設計師笑話二十六程式設計師
- 程式設計師的相關笑話(一)程式設計師
- 那些年,程式設計師的那些笑話程式設計師
- 程式設計師才能看得懂的笑話:Wat程式設計師
- scratch程式設計第三講:對話程式設計
- ThinkPHP3.2.3 開發 搞笑趣味 笑話網站(pc+wap)PHP網站
- 35行python程式碼教你向ta說情話Python
- 程式設計師的這些笑話,你都看得懂嗎?程式設計師
- 程式設計師的這些笑話 你都看得懂嗎?程式設計師
- 從一個程式設計師笑話看軟體開發管理程式設計師
- 幾個重口味的跟程式設計師有關的笑話程式設計師
- 趣味python程式設計之經典俄羅斯方塊Python程式設計
- 程式設計入門,這763位老程式設計師有話講!程式設計師
- Python趣味程式碼整合之提升學生程式設計興趣Python程式設計
- 幽默趣味:程式設計師如同妓女程式設計師
- optee userpace TA程式中的棧的設定
- 笑侃程式設計學習 (轉)程式設計
- Go 笑話Go
- 笑話3篇:一個程式設計師對自己的未來很迷茫程式設計師
- Delphi趣味程式設計例項三則程式設計
- 設計模式趣味談設計模式
- 我給你講個TCP的笑話吧,哈哈哈哈哈哈TCP
- 趣味幽默 程式設計師使用說明書程式設計師
- 就要笑-精品笑話段子網站社群網站
- Oracle會話超時退出設定Oracle會話
- C語言趣味程式設計100例pdfC語言程式設計
- 趣味橫生的程式設計師搞怪程式碼註釋程式設計師
- 這40張圖送給單身程式設計師,情人節請一笑而過!程式設計師
- CSS計數器的趣味時光CSS
- 給程式設計入門者的嘮叨話(全棧路線)程式設計全棧
- 給你的程式設計師200美元/小時程式設計師
- MYSQL中給時間列設定預設值MySql
- Python中如何給字典設定預設值Python
- 給 Python程式設計師的函數語言程式設計實踐經驗Python程式設計師函數
- 幽默:機器學習面試的笑話機器學習面試
- 網路程式設計定時器二:使用時間輪程式設計定時器