1. 程式人生 > >python實現自動定時給女朋友發手機簡訊,每天一個笑話!

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

3分鐘帶你瞭解世界第一語言Python 入門上手也這麼簡單!

Python 的概念

加群:865597862即可自動獲取大量Python視訊教程以及各類PDF!

大四的生活就是這麼無聊,我琢磨著也學了這麼多東西了,為啥不能用自己的知識來給生活找點樂子呢?我想反正每天都要給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請求的headerresp = 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_textelse: 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都是要付費的~, 對於一個學生黨來說有點不現實。怎麼辦??苦思冥想不得其解,這個時候突然收到移動服務號的簡訊如圖:

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

 

這提醒了我,移動的139郵箱要給使用者收到的郵件傳送簡訊提醒!!這就妙了,因為發郵件是不需要錢的,我只需要發郵件到Ta的139郵箱就可以了,哈哈。關鍵程式碼如下:

import smtplib,sysfrom email.mime.text import MIMETextmail_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庫可以實現這一功能。

整合程式碼嘗試,效果如下圖:

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

 

可見不能完全顯示,這是因為139郵箱免費版具有140字限制如圖:

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

 

有兩種辦法解決,一是付費5塊錢(還是不願意!),二是把一個笑話分成三部分,分別放在發件人,主題和正文中,如下圖:

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

 

還是不行,字數限制是個硬傷。那就從原來的從笑話列表裡選擇第一個笑話改為選擇字數最少的一個。程式碼如下:

json_result = json.loads(content)content_list = json_result['showapi_res_body']['contentlist']minlen = 10000for item in content_list: if len(item['text'])<minlen: title = item['title'] text = item['text'] minlen = len(item['text'])

 

如下圖:

python實現自動定時給女朋友發手機簡訊,每天一個笑話!

 

 

基本可行了,不過發多了過後騰訊會認為是垃圾郵件(汗),主要是發件人名字太奇怪了,大家有什麼好主意可以告訴我一下啊,多多交流。

完整程式碼(joke.py)如下:

# -*- coding: utf-8 -*-'''Created on 2016年1月22日@author: 邱康'''import urllib2, json,sys,smtplibfrom email.mime.text import MIMETextreload(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 Falseif __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