摘要:我們將會(huì)創(chuàng)建兩個(gè)一個(gè)是當(dāng)比特幣價(jià)格下滑到一定閾值后的緊急提醒另一個(gè)是常規(guī)的比特幣價(jià)格的更新兩個(gè)程序都將被我們的觸發(fā),從獲取數(shù)據(jù)。
作者:xiaoyu
微信公眾號(hào):Python數(shù)據(jù)科學(xué)
知乎:python數(shù)據(jù)分析師
有很多朋友問我學(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ù)中。
下面我們馬上來看看。
用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 (https://coinmarketcap.com/api/) 獲取數(shù)據(jù)。
一個(gè)IFTTT程序有兩個(gè)部分組成:觸發(fā)部分和動(dòng)作部分。
在我們的情況下,觸發(fā)是一個(gè)IFTTT提供的webhook服務(wù)。你可以將webhook想象為"user-defined HTTP callbacks",更多請(qǐng)參考:http://timothyfitz.com/2009/0...
我們的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ù)表,甚至可以給你打電話。
配置項(xiàng)目如果你安裝了python3,那么只要再安裝一個(gè)requests包就可以了。
$ pip install requests==2.18.4 # We only need the requests package
選一個(gè)編輯器,比如Pycharm進(jìn)行代碼編輯。
獲取比特幣價(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>>> # 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。
發(fā)送一個(gè)測(cè)試的IFTTT提醒現(xiàn)在我們可以轉(zhuǎn)到IFTTT上面來了。使用IFTTT之前,我們需要?jiǎng)?chuàng)建一個(gè)新賬戶(https://ifttt.com/join),然后安裝移動(dòng)端app(如果你想在手機(jī)上接到通知)
設(shè)置成功后就開始創(chuàng)建一個(gè)新的IFTTT applet用于測(cè)試。
創(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)
運(yùn)行完之后,你可以看到:
創(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:
{{Value1}};
創(chuàng)建動(dòng)作,然后完成applet的設(shè)置;
將所有連到一起現(xiàn)在,我們有了IFTTT,下面就是代碼了。你將通過創(chuàng)建像下面一樣標(biāo)準(zhǔn)的Python命令行app骨架來開始。 代碼碼上去,然后保存為 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 number return float(response_json[0]["price_usd"]) def post_ifttt_webhook(event, value): # The payload that will be sent to IFTTT service data = {"value1": value} # inserts our desired event ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event) # Sends a HTTP POST request to the webhook URL requests.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è)谛畔⑽谋局杏?b>{{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 notification if 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 update if len(bitcoin_history) == 5: post_ifttt_webhook("bitcoin_price_update", format_bitcoin_history(bitcoin_history)) # Reset the history bitcoin_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)簽(像
, , 等等)變換格式。將這個(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"] # (bold) tag creates bolded text # 24.02.2018 15:09: $10123.4 row = "{}: ${}".format(date, price) rows.append(row) # Use a
(break) tag to create a new line # Join the rows delimited by
tag: row1
row2
row3 return "
".join(rows)
最后在手機(jī)上顯示的結(jié)果是這樣的:
然后,我們的功能就完成了,只要比特幣的價(jià)格一更新,手機(jī)移動(dòng)端就有提示。當(dāng)然,如果你嫌煩也可以在app里面off掉。
參考:https://realpython.com/python...
關(guān)注微信公眾號(hào)Python數(shù)據(jù)科學(xué),獲取 120G 人工智能 學(xué)習(xí)資料。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44713.html
摘要:如果你仍然無法抉擇,那請(qǐng)選擇,畢竟這是未來的趨勢(shì),參考知乎回答還是編輯器該如何選我推薦社區(qū)版,配置簡(jiǎn)單功能強(qiáng)大使用起來省時(shí)省心,對(duì)初學(xué)者友好。 這是一篇 Python 入門指南,針對(duì)那些沒有任何編程經(jīng)驗(yàn),從零開始學(xué)習(xí) Python 的同學(xué)。不管你學(xué)習(xí)的出發(fā)點(diǎn)是興趣驅(qū)動(dòng)、拓展思維,還是工作需要、想要轉(zhuǎn)行,都可以此文作為一個(gè)參考。 在這個(gè)信息爆炸的時(shí)代,以 Python入門 為關(guān)鍵字搜索出...
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:數(shù)據(jù)分析的發(fā)展方向一般有商業(yè)方向,行業(yè)分析業(yè)務(wù)方向,和機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘方向。機(jī)器學(xué)習(xí)的書籍推薦統(tǒng)計(jì)學(xué)習(xí)方法,機(jī)器學(xué)習(xí),機(jī)器學(xué)習(xí)實(shí)戰(zhàn)三本書。 作者:xiaoyu 微信公眾號(hào):Python數(shù)據(jù)科學(xué) 知乎:python數(shù)據(jù)分析師 上一篇主要分享了博主親身轉(zhuǎn)行數(shù)據(jù)分析的經(jīng)歷: 【從零學(xué)起到成功轉(zhuǎn)行數(shù)據(jù)分析,我是怎么做的?】 本篇繼上一篇將分享轉(zhuǎn)行數(shù)據(jù)分析的一些經(jīng)驗(yàn)和學(xué)習(xí)方法,看完這篇你將會(huì)解...
摘要:第一點(diǎn),先清楚你的目的你學(xué)編程想要做什么你對(duì)哪方面感興趣然后去百度查一下哪些編程語言適合做那個(gè)方向,帶著目的去學(xué)習(xí),如果一開始沒選好,中途掉頭就很可惜了。 你是不是...
閱讀 3011·2021-10-27 14:15
閱讀 2999·2021-09-07 10:18
閱讀 1320·2019-08-30 15:53
閱讀 1570·2019-08-26 18:18
閱讀 3373·2019-08-26 12:15
閱讀 3460·2019-08-26 10:43
閱讀 654·2019-08-23 16:43
閱讀 2207·2019-08-23 15:27