美文网首页CCXT
用python连接行情网站coinmarketcap,获取上千币

用python连接行情网站coinmarketcap,获取上千币

作者: 杨卫祥_老杨提醒 | 来源:发表于2019-05-28 23:55 被阅读0次

    最近继续研究编程与区块链结合的应用,目前使用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)

    相关文章

      网友评论

        本文标题:用python连接行情网站coinmarketcap,获取上千币

        本文链接:https://www.haomeiwen.com/subject/vlystctx.html