美文网首页
如何用Python调取任意数字资产钱包余额

如何用Python调取任意数字资产钱包余额

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

    当我们的资产放在交易所的时候,可以通过链接交易所的API使用Python来监控余额。

    那资产放在钱包的时候,如何来监控余额呢?

    我们知道任何数字资产都可以使用区块浏览器来查询余额,那我们只要从此着手,用Python调取区块浏览器,来查询余额就能实现所有资产的余额监控。

    数字资产区块链浏览器有很多,比如比特币区块浏览器btc.com,以太坊区块浏览器etherscan.io,ATOM区块浏览器mintscan.io,PCX区块浏览器scan.chainx.org等等。

    区块浏览器可以根据是否提供API分为两类,做的好的会把API标示出来,供大家查询。做的粗糙的就不明确告诉你API,但通过爬虫的方式是可以找出来的。

     下面我们逐一分析:

    一、提供API查询的区块浏览器

    1.比特币区块浏览器btc.com

    在首页下面有提供API,并配有说明文档https://btc.com/api-doc

    这种获取比较简单,根据文档中查找可以查询余额的地址获取即可。

    比如btc.com中找到获取网址为https://chain.api.btc.com/v3/address/3JvpMTpy6DDp1Um3iEGYpkBaUmJp7ReMR2,最后一串为比特币地址,通过Python中requests.get( )即可返回相关数据如下:

    注意余额的单位每个币种都不一样,根据自己钱包余额调整即可,比如上述余额实际需要除以10e7(10的7次方)就可得到余额为0.14141195个BTC。

    接下来我们就可以监控我们的钱包余额,假设你从别处提到你钱包1个比特币,那监控什么时候余额大于1个比特币了,让程序实现钉钉发消息提醒即可。

    完整代码如下:

    import pandasas pd

    import random

    import ccxt

    import threading, time, datetime

    import json

    import urllib

    import datetime

    import requests

    # 异常监控用

    def send_dingding_msg1(content, robot_id='你的钉钉机器人地址'):

    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(

            return status

    except Exception as err:

    print('钉钉发送失败', err)

    while True:

    try:

    address ='你的比特币钱包地址'  # 比特币钱包地址

            url ='https://chain.api.btc.com/v3/address/'+address# 获取余额地址

            response = requests.get(url)

    if response.text:# 发现有时候会出现错误导致返回数据为空,加此目的当数据为空时继续获取余额

    # print(response.json())

                BTC =float(response.json()['data']['balance']) /10e7  # 科学计数法,处理返回数据

                print('BTC', BTC)

    # break

            else:

    continue

            if BTC >1:# 当余额大于1时实现钉钉提醒

                print('BTC', BTC)

    content ='BTC钱包充值到账'  #

                send_msg1 = send_dingding_msg1(content)

    print(send_msg1)

    break

            time.sleep(5)

    except Exception as order_err:

    print("查询出错,继续尝试", order_err)

    time.sleep(3)

    2.以太坊区块浏览器etherscan.io余额查询

    同样https://etherscan.io/apis此处也配有说明文档,与上述稍微不同的是它需要获取APIKEY,类似交易所申请API一样,需要注册下。

    我们在说明文档可以看到获取以太坊余额的地址为:https://api.etherscan.io/api?module=account&action=balance&address=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a&tag=latest&apikey=YourApiKeyToken,这里面需要用到你要查询的以太坊地址address和你申请的apikey, 我们可以把这两个设成变量,方便更改。

    接下来就是处理数据了,同样要注意单位的不同,余额需要除以10e17才能转换成正常的。

    我们也可以监控余额,比如当充值到这个钱包,ETH余额大于10时实现提醒。

    还有一大批数字货币是ETH上的ERC20代币,如何获得他们的余额呢?

    在说明文档中我们可以找到token一栏,有说明获取地址https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0x57d90b64a1a57749b0f932f1a3395792e12e7055&address=0xe04f27eb70e025b78871a2ad7eabe85e61212761&tag=latest&apikey=YourApiKeyToken。仔细对比你会发现比ETH余额多了个智能合约contractaddress地址,这个查询方法也非常简单,在https://etherscan.io搜索代币,比如搜索OMG,就会出现合约地址。

    这样把三个输入组成新的获取地址,就能获得代币的余额。你要查询的以太坊地址address、你申请的apikey、代币的合约地址contractaddress。 我们可以把这三个设成变量,方便更改。

    完整代码如下:

    while True:

    try:

    apikey ='你在https://etherscan.io申请的apikey'

            address ='你的以太坊地址'

            # 查询以太坊地址

            url1 ='https://api.etherscan.io/api?module=account&action=balance&address=' + address +'&tag=latest&apikey=' + apikey

    contractaddress ='0xd26114cd6EE289AccF82350c8d8487fedB8A0C07'  #OMG合约地址

    # 查询ERC20地址

            url2 ='https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=' + contractaddress +'&address=' + address +'&tag=latest&apikey=' + apikey

    response1 = requests.get(url1)

    response2 = requests.get(url2)

    # print(response.json())

            asset1 ='ETH'

            asset2 ='OMG'

            ban1 =float(response1.json()['result']) /10e17  # 科学计数法,处理返回数据

            ban2 =float(response2.json()['result']) /10e17  # 科学计数法,处理返回数据

            print(asset1, ban1)

    print(asset2, ban2)

    if ban1 >10:

    print(asset1, ban1)

    content ='ETH钱包充值到账'

                send_msg1 = send_dingding_msg1(content)

    print(send_msg1)

    break

            time.sleep(5)

    except Exception as order_err:

    print("查询出错,继续尝试", order_err)

    time.sleep(3)

    二,不提供API的区块浏览器

    这种方法稍微复杂,需要爬虫来获取地址。

    我们以最近有点火的chainx代币PCX为例来说明,因为这个币种采取了锁仓BTC挖矿来获得其代币PCX,而要想提取利息需要拿利息约11倍的PCX去投票,简单说就是让你去买PCX,我在其内网(链上交易)挂低价单来买,什么时候成交希望有个提醒,那就用程序监控区块浏览器我地址的余额,一旦成交立马投票去拿利息。

    没经历过上面的朋友可能觉得很复杂,没关系,我们的目的就是用程序获取其钱包余额。

    PCX区块浏览器地址为https://scan.chainx.org/,输入钱包地址之后就可以获得账户详情,怎么用程序获得余额呢?

    在谷歌浏览器下按F12,进入开发者模式,点击Network-XHR,然后刷新。

    我们发现在balance一样展开有余额信息,那我们只要找到请求头部信息就能获得了

    点击Headers找到需要的信息,如下

    这样我们就可以获得相关信息,然后对数据进行处理即可。

    我当时设定的是购买35个,所以当数量大于30时用钉钉通知我。

    完整代码如下

    while True:

    try:

    url ="https://api.chainx.org.cn/account/你的PCX钱包地址/balance"

            headers = {

    "Content-type":"application/json; charset=utf-8",

                'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'

            }

    response = requests.get(url, headers=headers)

    balance = response.json()

    # print(balance)

            asset ='PCX'

            PCX = balance[1]['Free']/100000000

            print('PCX', PCX)

    if PCX >30:

    print('PCX', PCX)

    content ='PCX购买已到账,余额为' +str(PCX)# 发一个变量,用str转换下

                send_msg1 = send_dingding_msg1(content)

    print(send_msg1)

    break

            time.sleep(3)

    except Exception as order_err:

    print("查询出错,继续尝试", order_err)

    time.sleep(3)

    其它不提供API的区块浏览器获取方式是一样的。有了以上的方法,我们就可以用程序获得任意区块浏览器地址的余额,并进行监控了。

    相关文章

      网友评论

          本文标题:如何用Python调取任意数字资产钱包余额

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