上一篇我們呼叫ACE的幣對價格API,並取出我們要值(USDT/TWD),此篇我們會繼續完成MAX跟BitoPro。
根據【筆記】用Python呼叫API (二):呼叫API,我們繼續處理MAX跟BitoPro的部分,先MAX
我們根據之前獲得的MAX API,透過同樣的方法觀察一下數據的結構:
import requests
import json
url = "https://max-api.maicoin.com/api/v2/tickers"
response = requests.get(url)
#如果程式狀態回應是200,那回應將會解析成json格式的數據,存在變數data中
if response.status_code == 200:
data = response.json()
#json.dumps將程式作用的對象(像是 字典、列表)進行格式化輸出
formatted_data = json.dumps(data, indent=4)
print(formatted_data)
else:
print("壞了,根本就不能用啊,ERROR CODE:",response.status_code)
結果:
根據響應的內容,我們可先取外層的"usdttwd"再取內層的價格,它提供的價格分買價、賣價、最高、最低以及最新,這裡取最新價"last"
import requests
import json
url = "https://max-api.maicoin.com/api/v2/tickers"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
MAX_usdt_twd = data.get("usdttwd").get("last")
print(f"MAX 的USDT/TWD匯率: {MAX_usdt_twd}")
else:
print("壞了,根本就不能用啊,ERROR CODE:",response.status_code)
結果:
另外
如果確定程式是可以運行的,print(formatted_data)要寫在1跟2的位置都可以正常運行,寫在2是為了紀錄人類(?)直線的思路,但它們還是有點區別:
放在1代表著當響應狀態是200的才會印出來,非200就會執行else,像是我把MAX的請求網址刪一個字
放在2代表無論如何都會印出來,只是當響應狀態(比如500)出現時,由於回傳的內容是None,就會出現錯誤,同樣跟1的情況,放在2的位置,得到的回應是
MAX處理好了,接下來是BitoPro,一樣用同樣的方法先看結構:
import requests
import json
url = "https://api.bitopro.com/v3/tickers/usdt_twd"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
formatted_data = json.dumps(data, indent=4, sort_keys=True)
print(formatted_data)
else:
print("壞了,根本就不能用啊,ERROR CODE::",response.status_code)
結果:
根據響應的內容,我們需要先取"data",再取最新價格"lastPrice"
import requests
import json
url = "https://api.bitopro.com/v3/tickers/usdt_twd"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
BitoPro_usdt_twd = data.get("data").get("lastPrice")
print(f"BitoPro 的USDT/TWD匯率: {BitoPro_usdt_twd}")
else:
print("壞了,根本就不能用啊,ERROR CODE::",response.status_code)
結果:
BitoPro回傳的數據小數點有點多,MAX跟ACE都是三位,我們可以控制一下它小數點的長度
import requests
import json
url = "https://api.bitopro.com/v3/tickers/usdt_twd"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
BitoPro_usdt_twd = data.get("data").get("lastPrice")
#定義 formatted_BitoPro,它是BitoPro_usdt_twd 被轉成浮點數後,格式化限制為小數點三位
formatted_BitoPro = "{:.3f}".format(float(BitoPro_usdt_twd))
print(f"BitoPro 的USDT/TWD匯率: {formatted_BitoPro}")
else:
print("壞了,根本就不能用啊,ERROR CODE::",response.status_code)
先用float讓BitoPro_usdt_twd變成浮點數,再透過format把小數點格式化為三位
結果:
至此價格都抓到了,那就把它們拼起來吧,至於怎麼拼,共用的套件不用重複放,其他的依序放就可以了,之前透過Beautiful Soup 4抓的台銀匯率也放在一起
import requests
from bs4 import BeautifulSoup
from datetime import datetime
### ACE
url = "https://ace.io/polarisex/oapi/v2/list/tradePrice"
response = requests.get(url)
# 獲取當下時間
current_time = datetime.now()
# 格式化當下時間並印出
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
print(f"\n請求時間:{formatted_time}")
#如果程式狀態回應是200,那回應將會解析成json格式的數據,存在變數data中
if response.status_code == 200:
data = response.json()
ACE_usdt_twd = data.get("USDT/TWD").get("last_price")
#變數字串化
print(f"ACE 的USDT/TWD匯率: {ACE_usdt_twd}")
else :
print("壞了,根本就不能用啊,ERROR CODE:",response.status_code)
### MAX
url = "https://max-api.maicoin.com/api/v2/tickers"
response = requests.get(url)
#如果程式狀態回應是200,那回應將會解析成json格式的數據,存在變數data中
if response.status_code == 200:
data = response.json()
MAX_usdt_twd = data.get("usdttwd").get("last")
#變數字串化
print(f"MAX 的USDT/TWD匯率: {MAX_usdt_twd}")
else :
print("壞了,根本就不能用啊,ERROR CODE:",response.status_code)
### BitoPro
url = "https://api.bitopro.com/v3/tickers/usdt_twd"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
BitoPro_usdt_twd = data.get("data").get("lastPrice")
#定義 formatted_BitoPro,它是BitoPro_usdt_twd 被轉成浮點數後,格式化限制為小數點三位
formatted_BitoPro = "{:.3f}".format(float(BitoPro_usdt_twd))
#變數字串化
print(f"BitoPro 的USDT/TWD匯率: {formatted_BitoPro}")
else:
print("壞了,根本就不能用啊,ERROR CODE::",response.status_code)
#台灣銀行牌告匯率網頁
url = "https://rate.bot.com.tw/xrt?Lang=zh-TW"
#定義一個變數為response,它是使用requests套件的get函式,對指定的url發起請求。
response = requests.get(url)
#將回應內容轉換為純文字
html_doc = response.text
# 使用BeautifulSoup解析HTML內容
soup = BeautifulSoup(html_doc, "html.parser")
# 找到該元素
element = soup.find("td", {"data-table": "本行即期賣出", "class": "rate-content-sight"})
# 提取出數字
number = element.text.strip()
print(f"台灣銀行 的USD/TWD匯率:{number}")
結果:
都抓到了,這樣子的程式碼雖然是可以用,實際上不太好管理,比如想要修改某個網址,由於放在不同的地方,導致改起來很麻煩,下一篇會基於上方的內容把重複的地方模組化,讓程式碼好看一些,也便於管理。