最近继续研究编程与区块链结合的应用,目前使用CCXT库能轻松实现了近百个交易所的python连接应用。但是根据行情网站https://coinmarketcap.com/统计目前有18668个交易所,有些交易所不可能全部去注册,注册之后没有CCXT支持的也不想一个个去编程认证,那想用到一些币种信息怎么办呢?
想来想去,如果能用API连接行情网站,然后从这上面获取所有的币种信息,那不就是相当省力了吗?
常用的行情网站有coinmarketcap和非小号,可惜非不号上不支持API,只能选择coinmarketcap了。
从coinmarketcap这个网站下方找到API入口https://coinmarketcap.com/api/,要想申请API需要注册,按要求注册,其中有一个选项是叫Plan其实就是API不同的等级,从免费的到付费的,功能不一样,先申请个免费体验的再说。
然后需要邮箱验证,通过之后进入个人账户页面,把鼠标放在正文蓝色按钮就可以复制API Key了(不像交易所有secret,这里只有KEY)。
申请好之后,点击左下方进入API文档https://coinmarketcap.com/api/documentation/v1/。
前面会有一些相应的介绍,其中提到一个python应用的案例,代码都写好了。如下
fromrequestsimportRequest,Session
fromrequests.exceptionsimportConnectionError,Timeout,TooManyRedirects
importjson
url ='https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'
parameters = {
'start':'1',
'limit':'5000',
'convert':'USD'
}
headers = {
'Accepts':'application/json',
'X-CMC_PRO_API_KEY':'b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c',
}
session = Session()
session.headers.update(headers)
try:
response = session.get(url,params=parameters)
data = json.loads(response.text)
print(data)
except(ConnectionError,Timeout,TooManyRedirects)ase:
print(e)
其中X-CMC_PRO_API_KEY处需要换成你自己申请的API Key,试着运行下,如果出现一堆数据,说明连接成功。这段程序是获取5000币种最新的列表,看着比较乱,可以把参数里面的'limit':'5000’,改成'limit’:'1’,只获取一个币种数据,你就能看明白其中的意思了。
继续往下看,你会发现它的其它功能只需要把读取网址url和输入参数parameters更换下就行了,其它就不变,这样就方便多了,统计如下:
'''1. Cryptocurrency'''
#获取币种列表 见上
#获取币种ID
url ='https://pro-api.coinmarketcap.com/v1/cryptocurrency/map'
parameters = {
'symbol':'BTC,USDT,FUC'
}
#获取币种信息,如name, symbol, logo, and its various registered URLs.
# url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/info'
# parameters = {
# 'id':'1,1027'
# }
#获取币种最新市场数据Get market quotes (latest)
# url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'
# parameters = {
# 'id':'1'
# }
'''2. Exchange交易所,发现对免费用户不适用,很可惜'''
'''3. Global-Metrics'''
# 全球市值及BTC占比等数据
# url = 'https://pro-api.coinmarketcap.com/v1/global-metrics/quotes/latest'
# parameters = {
# 'convert':'USD'
# }
# 4.价格转换工具 Price conversion tool
# url = 'https://pro-api.coinmarketcap.com/v1/tools/price-conversion'
# parameters = {
# 'id':'1',
# 'amount':'50',
# 'convert':'CNY'
# }
美中不足的是,coinmarketcap对免费版限制太多功能了,不过呢有了这样的连接之后,再去调用任何币种的信息还是非常方便的,不用一个个网站去查找相关信息。
举个例子,如果我想监控四个平台币'BNB','HT','OKB','OTB'的价格,如果一个一个交易所的写,我可能需要连接四个交易所,但使用今天聊到的,我用coinmarketcap连接调取价格,那就非常方便了。
这里我们在用到上面聊的获取币种最新市场数据,交易对我们不用id,直接用代币符号也是可以的。还有一点,网站默认显示是美元,我想转换成人民币,参数里加个 'convert':'CNY'
url ='https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'
parameters = {
'symbol':'BNB,HT,OKB,OTB', # 可以使用ID,也可以直接使用代币符号
'convert':'CNY' # 这条不加,默认是美元,使用其它法币需要加
}
数据出来之后很多很乱,我们需要对它进行处理,这里介绍一个在线转换json格式的网站https://www.bejson.com/jsonviewernew/,它的作用是什么呢?
原始数据如下:好乱有没有
我们复制这个数据到https://www.bejson.com/jsonviewernew/,然后点击格式化,神奇的一幕出现了,数据整齐排列好了,其实是个字典。
我们一层层剥离,比如BNB_price = data['data']['BNB']['quote']['CNY']['price']就能得到BNB的价格了。其它几个类似。
我们还可以与前面聊过的微信或钉钉结合起来,比如让它自动十分钟报个价格,发到钉钉群里(设置静音,需要时查看),再比如当BNB价格突破新高248元时发到钉钉紧急提醒(此群不静音)。
完整代码如下:
from requestsimport Request, Session
from requests.exceptionsimport ConnectionError, Timeout, TooManyRedirects
import json
import datetime,time
import requests
# 异常提醒用,有提示
def send_dingding_msg1(content, robot_id='你的钉钉机器人ID1'):
try:
msg = {
"msgtype":"text",
"text": {"content": content +'\n' + datetime.datetime.now().strftime("%m-%d %H:%M:%S")}
}
headers = {"Content-Type":"application/json ;charset=utf-8 "}
url ='https://oapi.dingtalk.com/robot/send?access_token=' + robot_id
body = json.dumps(msg)
status = requests.post(url, data=body, headers=headers)
if status.status_code ==200:
return status.json()
# else:
# return response.json()
return status
except Exception as err:
print('钉钉发送失败', err)
# 正常提醒用, 静音
def send_dingding_msg2(content, robot_id='你的钉钉机器人ID2'):
try:
msg = {
"msgtype":"text",
"text": {"content": content +'\n' + datetime.datetime.now().strftime("%m-%d %H:%M:%S")}
}
headers = {"Content-Type":"application/json ;charset=utf-8 "}
url ='https://oapi.dingtalk.com/robot/send?access_token=' + robot_id
body = json.dumps(msg)
status = requests.post(url, data=body, headers=headers)
if status.status_code ==200:
return status.json()
# else:
# return response.json()
return status
except Exception as err:
print('钉钉发送失败', err)
#获取币种最新市场数据
url ='https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'
parameters = {
'symbol':'BNB,HT,OKB,OTB', # 可以使用ID,也可以直接使用代币符号
'convert':'CNY' # 这条不加,默认是美元,使用其它法币需要加
}
headers = {
'Accepts':'application/json',
'X-CMC_PRO_API_KEY':'2d12022a-aead-49e5-ad38-1839392773e9',
}
session = Session()
session.headers.update(headers)
while True:
try:
response = session.get(url, params=parameters)
data = json.loads(response.text)
# print(data)
# 对数据进行处理
BNB_price =round(data['data']['BNB']['quote']['CNY']['price'], 3)
HT_price =round(data['data']['HT']['quote']['CNY']['price'], 3)
OKB_price =round(data['data']['OKB']['quote']['CNY']['price'], 3)
OTB_price =round(data['data']['OTB']['quote']['CNY']['price'], 3)
print('BNB_price', BNB_price)
print('HT_price', HT_price)
print('OKB_price', OKB_price)
print('OTB_price', OTB_price)
# 多个价格自动提醒
content ='BNB, HT, OKB , OTB价格分别为'+str(BNB_price) +', '+str(HT_price) +', '+str(OKB_price) +', '+str(OTB_price) +','
send_msg2 = send_dingding_msg2(content)
print(send_msg2)
# 价格达到某个条件下紧急提醒
if BNB_price >248:
print('BNB价格突破新高248元')
content ='BNB价格突破新高248元,目前为'+str(BNB_price)
send_msg1 = send_dingding_msg1(content)
print(send_msg1)
time.sleep(600)
except (ConnectionError, Timeout, TooManyRedirects)as e:
print(e)
网友评论