给Python初学者的最好练手项目,进来看就对了!
有很多朋友問我學(xué)習(xí)了Python后,有沒有什么好的項(xiàng)目可以練手。
其實(shí),做項(xiàng)目主要還是根據(jù)需求來的。但是對(duì)于一個(gè)初學(xué)者來說,很多復(fù)雜的項(xiàng)目沒辦法獨(dú)立完成,因此博主挑選了一個(gè)非常適合初學(xué)者的項(xiàng)目,內(nèi)容不是很復(fù)雜,但是非常有趣,我相信對(duì)于初學(xué)者小白來說是再好不過的項(xiàng)目了。
這個(gè)項(xiàng)目中,我們將要建立一個(gè)比特幣價(jià)格的提醒服務(wù)。
你將主要會(huì)學(xué)習(xí)到HTTP的請(qǐng)求,以及如何使用requests包來發(fā)送這些請(qǐng)求。
同時(shí),你會(huì)了解webhooks和如何使用它將Python app與外部設(shè)備連接,例如移動(dòng)端手機(jī)提醒或者 Telegram 服務(wù)。
僅僅不到50行的代碼就能完成一個(gè)比特幣價(jià)格提醒服務(wù)的功能,并且可以輕松的擴(kuò)展到其它加密數(shù)字貨幣和服務(wù)中。
下面我們馬上來看看。
1、用Python實(shí)現(xiàn)比特幣價(jià)格提醒
我們都知道,比特幣是一個(gè)變動(dòng)的東西。你無法真正的知道它的去向。因此,為了避免我們反復(fù)的刷新查看最新動(dòng)態(tài),我們可以做一個(gè)Python app來為你工作。
為此,我們將會(huì)使用一個(gè)很流行的自動(dòng)化網(wǎng)站IFTTT。IFTTT ("if this, then that")?是一個(gè)可以在不同app設(shè)備與web服務(wù)之間建立連接橋梁的工具。
我們將會(huì)創(chuàng)建兩個(gè)IFTTT applets:
一個(gè)是當(dāng)比特幣價(jià)格下滑到一定閾值后的緊急提醒
另一個(gè)是常規(guī)的比特幣價(jià)格的更新
兩個(gè)程序都將被我們的Python app觸發(fā),Python app從Coinmakercap API獲取數(shù)據(jù)。
Coinmakercap API鏈接:https://coinmarketcap.com/api/
一個(gè)IFTTT程序有兩個(gè)部分組成:觸發(fā)部分和動(dòng)作部分。
在我們的情況下,觸發(fā)是一個(gè)IFTTT提供的webhook服務(wù)。你可以將webhook想象為"user-defined HTTP callbacks"。
更多請(qǐng)參考:http://timothyfitz.com/2009/02/09/what-webhooks-are-and-why-you-should-care/
我們的Python app將會(huì)發(fā)出一個(gè)HTTP請(qǐng)求到webhook URL,然后webhook URL觸發(fā)動(dòng)作。有意思的部分來了,這個(gè)動(dòng)作可以是你想要的任何東西。IFTTT提供了眾多的動(dòng)作,像發(fā)送一個(gè)email,更新一個(gè)Google電子數(shù)據(jù)表,甚至可以給你打電話。
2、配置項(xiàng)目
如果你安裝了python3,那么只要再安裝一個(gè)requests包就可以了。
$ pip install requests==2.18.4 # We only need the requests package選一個(gè)編輯器,比如Pycharm進(jìn)行代碼編輯。
3、獲取比特幣價(jià)格
代碼很簡(jiǎn)單,可以在console中進(jìn)行。導(dǎo)入requests包,然后定義bitcoin_api_url變量,這個(gè)變量是Coinmarketcap API的URL。
接著,使用requests.get()函數(shù)發(fā)送一個(gè) HTTP GET請(qǐng)求,然后保存響應(yīng)response。由于API返回一個(gè)JSON響應(yīng),我們可以通過.json()將它轉(zhuǎn)換為python對(duì)象。
import requests bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' response = requests.get(bitcoin_api_url) response_json = response.json() type(response_json) # The API returns a list <class?'list'> # Bitcoin data is the first element of the list response_json[0] {'id':?'bitcoin',?'name':?'Bitcoin',?'symbol':?'BTC',?'rank':?'1',? 'price_usd':?'10226.7',?'price_btc':?'1.0',?'24h_volume_usd':?'7585280000.0', 'market_cap_usd':?'172661078165',?'available_supply':?'16883362.0',? 'total_supply':?'16883362.0',?'max_supply':?'21000000.0',? 'percent_change_1h':?'0.67',?'percent_change_24h':?'0.78',? 'percent_change_7d':?'-4.79',?'last_updated':?'1519465767'}上面我們感興趣的是price_usd。
4、發(fā)送一個(gè)測(cè)試的IFTTT提醒
現(xiàn)在我們可以轉(zhuǎn)到IFTTT上面來了。使用IFTTT之前,我們需要?jiǎng)?chuàng)建一個(gè)新賬戶,然后安裝移動(dòng)端app(如果你想在手機(jī)上接到通知),設(shè)置成功后就開始創(chuàng)建一個(gè)新的IFTTT applet用于測(cè)試。
新賬戶鏈接:https://ifttt.com/join
創(chuàng)建一個(gè)新的測(cè)試applet,可以按以下步驟進(jìn)行:
點(diǎn)擊大的 "this" 按鈕;
搜索 "webhooks" 服務(wù),然后選擇 "Receive a web request"觸發(fā);
重命名event為test_event;
然后選擇大的 "that" 按鈕;
搜索 "notifications" 服務(wù),然后選擇 "send a notification from the IFTTT app"
改變短信息為 I just triggered my first IFTTT action!,然后點(diǎn)擊 "Create action";
點(diǎn)擊 "Finish" 按鈕,完成;
要看如何使用IFTTT webhooks,請(qǐng)點(diǎn)擊 "Documentation" 按鈕。documentation里有webhooks的URL格式。
https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key}接著,你需要將{event}替換為你在步驟3中自己起的名字。{your-IFTTT-key}是已經(jīng)提供了的IFTTT key。
現(xiàn)在你可以復(fù)制webhook URL,然后開啟另一個(gè)console。同樣導(dǎo)入requests然后發(fā)送post請(qǐng)求。
import requests #?Make?sure?that?your?key?is?in?the?URL ifttt_webhook_url = 'https://maker.ifttt.com/trigger/test_event/with/key/{your-IFTTT-key}' requests.post(ifttt_webhook_url) <Response?[200]>運(yùn)行完之后,你可以在手機(jī)端的app看到:
5、創(chuàng)建IFTTT Applets
前面只是測(cè)試,現(xiàn)在我們到了最主要的部分了。再開始代碼之前,我們需要?jiǎng)?chuàng)建兩個(gè)新的IFTTT applets:一個(gè)是比特幣價(jià)格的緊急通知,另一個(gè)是常規(guī)的更新。
比特幣價(jià)格緊急通知的applet:
選擇 "webhooks" 服務(wù),并且選擇 "Receive a web request" 的觸發(fā);
命名一個(gè)事件 event 為 bitcoin_price_emergency;
對(duì)于響應(yīng)的動(dòng)作部分,選擇 "Notifications"服務(wù),然后繼續(xù)選擇 "send a rich notification from the IFTTT app" 動(dòng)作;
提供一個(gè)標(biāo)題,像 "Bitcoin price emergency!"
設(shè)置短信息 為 Bitcoin price is at ${{Value1}}. Buy or sell now!(我們一會(huì)兒將返回到{{Value1}}部分)
可選的,你可以加入一個(gè)URL link 到 Coinmarketcap Bitcoin page:https://coinmarketcap.com/currencies/bitcoin/;
創(chuàng)建動(dòng)作,然后完成applet的設(shè)置;
常規(guī)價(jià)格更新的applet:
一樣的選擇 "webhooks" 服務(wù),并且選擇 "Receive a web request" 的觸發(fā);
命名一個(gè)事件 event 為 bitcoin_price_update;
對(duì)于響應(yīng)的動(dòng)作部分,選擇 "Telegram" 服務(wù),然后繼續(xù)選擇 "Send message" 動(dòng)作;
設(shè)置短信信息文本為:Latest bitcoin prices:<br>{{Value1}};
創(chuàng)建動(dòng)作,然后完成applet的設(shè)置;
6、將所有連到一起
現(xiàn)在,我們有了IFTTT,下面就是代碼了。你可以通過創(chuàng)建下面開始,然后保存為 bitcoin_notifications.py:
import requests import?time from?datetime?import?datetime def?main():pass if?__name__?==?'__main__':main()接著,我們還要將前面兩個(gè)Python console部分的代碼轉(zhuǎn)換為兩個(gè)函數(shù),函數(shù)將返回最近比特幣的價(jià)格,然后將它們分別post到IFTTT的webhook上去。將下面的代碼加入到main()函數(shù)之上。
?BITCOIN_API_URL?=?'https://api.coinmarketcap.com/v1/ticker/bitcoin/'IFTTT_WEBHOOKS_URL?=?'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}'def?get_latest_bitcoin_price():response?=?requests.get(BITCOIN_API_URL)response_json?=?response.json()#?Convert?the?price?to?a?floating?point?numberreturn?float(response_json[0]['price_usd'])def?post_ifttt_webhook(event,?value):#?The?payload?that?will?be?sent?to?IFTTT?servicedata?=?{'value1':?value}#?inserts?our?desired?eventifttt_event_url?=?IFTTT_WEBHOOKS_URL.format(event)#?Sends?a?HTTP?POST?request?to?the?webhook?URLrequests.post(ifttt_event_url,?json=data)除了將價(jià)格從一個(gè)字符串變成浮點(diǎn)數(shù)之外,get_latest_bitcoin_price基本沒太變。psot_ifttt_webhook需要兩個(gè)參數(shù):event和value。
event參數(shù)與我們之前命名的觸發(fā)名字對(duì)應(yīng)。同時(shí),IFTTT的webhooks允許我們通過requests發(fā)送額外的數(shù)據(jù),數(shù)據(jù)作為JSON格式。
這就是為什么我們需要value參數(shù):當(dāng)設(shè)置我們的applet的時(shí)候,我們?cè)谛畔⑽谋局杏衶{Value1}}標(biāo)簽。這個(gè)標(biāo)簽會(huì)被 JSON payload 中的values1文本替換。requests.post()函數(shù)允許我們通過設(shè)置json關(guān)鍵字發(fā)送額外的JSON數(shù)據(jù)。
現(xiàn)在我們可以繼續(xù)到我們app的核心main函數(shù)碼代碼了。它包括一個(gè)while True的循環(huán),由于我們想要app永遠(yuǎn)的運(yùn)行下去。在循環(huán)中,我們調(diào)用Coinmarkertcap API來得到最近比特幣的價(jià)格,并且記錄當(dāng)時(shí)的日期和時(shí)間。
根據(jù)目前的價(jià)格,我們將決定我們是否想要發(fā)送一個(gè)緊急通知。對(duì)于我們的常規(guī)更新我們將把目前的價(jià)格和日期放入到一個(gè)bitcoin_history的列表里。一旦列表達(dá)到一定的數(shù)量(比如說5個(gè)),我們將包裝一下,將更新發(fā)送出去,然后重置歷史,以為后續(xù)的更新使用。
一個(gè)需要注意的地方是避免發(fā)送信息太頻繁,有兩個(gè)原因:
Coinmarketcap API 聲明他們只有每隔5分鐘更新一次,因此更新太頻也沒有用
如果你的app發(fā)送太多的請(qǐng)求道 Coinmarketcap API,你的IP可能會(huì)被ban
因此,我們最后加入了 "go to sleep" 睡眠,設(shè)置至少5分鐘才能得到新數(shù)據(jù)。下面的代碼實(shí)現(xiàn)了我們的需要的特征:
BITCOIN_PRICE_THRESHOLD = 10000 # Set this to whatever you like def?main():bitcoin_history?=?[]while?True:price?=?get_latest_bitcoin_price()date?=?datetime.now()bitcoin_history.append({'date':?date,?'price':?price})#?Send?an?emergency?notificationif?price?<?BITCOIN_PRICE_THRESHOLD:post_ifttt_webhook('bitcoin_price_emergency',?price)#?Send?a?Telegram?notification#?Once?we?have?5?items?in?our?bitcoin_history?send?an?updateif?len(bitcoin_history)?==?5:post_ifttt_webhook('bitcoin_price_update',?format_bitcoin_history(bitcoin_history))#?Reset?the?historybitcoin_history?=?[]#?Sleep?for?5?minutes?#?(For?testing?purposes?you?can?set?it?to?a?lower?number)time.sleep(5?*?60)我們幾乎快成功了。但是還缺一個(gè)format_bitcoin_history函數(shù)。它將bitcoin_history作為參數(shù),然后使用被Telegram允許的基本HTML標(biāo)簽(像<br>, <b>, <i> 等等)變換格式。將這個(gè)函數(shù)復(fù)制到main()之上。
def format_bitcoin_history(bitcoin_history):rows?=?[]for?bitcoin_price?in?bitcoin_history:#?Formats?the?date?into?a?string:?'24.02.2018?15:09'date?=?bitcoin_price['date'].strftime('%d.%m.%Y?%H:%M')price?=?bitcoin_price['price']#?<b>?(bold)?tag?creates?bolded?text#?24.02.2018?15:09:?$<b>10123.4</b>row?=?'{}:?$<b>{}</b>'.format(date,?price)rows.append(row)#?Use?a?<br>?(break)?tag?to?create?a?new?line#?Join?the?rows?delimited?by?<br>?tag:?row1<br>row2<br>row3return?'<br>'.join(rows)最后在手機(jī)上顯示的結(jié)果是這樣的:
然后,我們的功能就完成了,只要比特幣的價(jià)格一更新,手機(jī)移動(dòng)端就有提示。當(dāng)然,如果你嫌煩也可以在app里面off掉。
備注:公眾號(hào)菜單包含了整理了一本AI小抄,非常適合在通勤路上用學(xué)習(xí)。
往期精彩回顧 那些年做的學(xué)術(shù)公益-你不是一個(gè)人在戰(zhàn)斗適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”加入知識(shí)星球(4500+用戶,ID:92416895),請(qǐng)回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的给Python初学者的最好练手项目,进来看就对了!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当一个程序员真正掌握算法之后,会变得有多
- 下一篇: 小孩都看得懂的推荐系统