利用Python监控任意数字资产钱包余额:从API到爬虫实战
本文详解如何使用Python监控各类数字资产钱包余额。针对提供API的区块浏览器(如btc.com、etherscan.io),介绍直接调用接口及单位换算方法;针对无API的浏览器(如chainx.org),演示通过开发者工具抓取XHR请求进行数据解析。结合钉钉机器人实现余额变动实时提醒,涵盖BTC、ETH及ERC20代币的完整监控方案。
数字资产钱包余额监控概述
当资产托管在交易所时,可通过调用交易所提供的API接口,利用Python脚本实时监控账户余额。
若资产存储于去中心化钱包,应如何有效监控其余额变化?
所有数字资产均可通过区块浏览器查询余额。核心思路是利用Python程序对接各类区块浏览器的数据接口,从而实现对所有资产余额的统一监控。
市面上存在众多数字资产区块链浏览器,例如比特币区块浏览器btc.com、以太坊区块浏览器etherscan.io、ATOM区块浏览器mintscan.io以及PCX区块浏览器scan.chainx.org等。
根据是否公开提供API接口,区块浏览器可分为两类:优质浏览器通常会明确标注API文档供开发者使用;而部分设计较为粗糙的浏览器虽未明确告知API,但通过技术手段仍可挖掘出可用的数据接口。
接下来将分别对这两类情况进行详细分析。
提供API的区块浏览器监控方案
一、提供公开API查询的区块浏览器
1. 比特币区块浏览器 btc.com
在其首页底部提供了API文档及说明,链接为https://btc.com/api-do。

此类浏览器的数据获取相对简单,只需依据文档指引,构造包含目标地址的查询URL即可。
以btc.com为例,获取余额的URL格式为https://chain.api.btc.com/v3/address/3JvpMTpy6DDp1Um3iEGYpkBaUmJp7ReMR2,其中末尾字符串为比特币钱包地址。在Python中,使用requests.get()方法调用该URL即可返回相关数据,具体返回内容见下图。

需注意,不同币种的余额单位存在差异,需根据具体币种对返回数据进行相应调整。例如,上述示例中的余额数值需除以10的7次方(10e7),方可得到实际余额0.14141195个BTC。
在此基础上,即可实现对钱包余额的持续监控。假设你从其他渠道向钱包转入1个比特币,可通过程序判断余额是否超过1个BTC,并在满足条件时通过钉钉机器人发送消息提醒。
完整实现代码如下:
import pandas as pd
import random
import ccxt
import threading, time, datetime
import json
import urllib
import datetime
import requests
# 异常监控用
def send_dingding_msg1(content, robot_id='你的钉钉机器人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 # 获取余额地址
# 可以用f'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)
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)
以太坊及ERC20代币余额查询
2. 以太坊区块浏览器etherscan.io余额查询
同样,https://etherscan.io/apis页面提供了相关文档。与前述方法略有不同,此处需要申请API Key,流程类似于交易所API申请,需先完成注册。
查阅文档可知,获取以太坊余额的URL格式为:https://api.etherscan.io/api?module=account&action=balance&address=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a&tag=latest&apikey=YourApiKeyToken。该URL包含需查询的以太坊地址address及申请的apikey,建议将这两个参数设为变量,以便后续修改。
接下来需处理返回数据。同样需注意单位差异,余额数值需除以10的17次方(10e17)才能转换为标准单位。
同样可设置监控逻辑,例如当充值至该钱包的ETH余额超过10时,触发提醒通知。
此外,大量数字货币为基于以太坊的ERC20代币,如何获取此类代币的余额?
在文档的Token栏目中,可找到获取地址的说明,URL格式为https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0x57d90b64a1a57749b0f932f1a3395792e12e7055&address=0xe04f27eb70e025b78871a2ad7eabe85e61212761&tag=latest&apikey=YourApiKeyToken。对比ETH余额查询接口,此方法多了一个智能合约地址contractaddress参数。该查询方式同样简便,只需在https://etherscan.io搜索代币(如OMG),即可获取其合约地址。

将上述三个参数组合成新的请求URL,即可获取代币余额。需准备的参数包括:查询的以太坊地址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
# 查询ERC20地址
contractaddress = '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07' ##OMG合约地址
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区块浏览器的爬虫监控方案
二、不提供公开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 # 此处注意PCX代币的位置,如果在第0个就改成[0]
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调取任意数字资产钱包余额的功能,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持! 若本文对您有所帮助,欢迎转载,请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













