使用praw与bitcoinrpc开发Reddit打赏机器人返回函数地址问题
问题现象
开发Reddit加密货币打赏机器人,对接BitcoinAPI实现余额查询功能,预期收到+bunkertip指令时返回对应余额,实际返回内容:
<function get_balance at 0x7f85fff6a4c0>
原始实现代码:
import praw from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException # Reddit鉴权配置 reddit = praw.Reddit( client_id='', client_secret='', user_agent='', username='', password='' ) reddit.validate_on_submit = True print(reddit.user.me()) def get_balance(address): rpc_connection = AuthServiceProxy("http://%s:%s@127.0.0.1:22555" % ('user', 'pass')) get_balance = rpc_connection.getbalance() return get_balance for item in reddit.inbox.unread(limit=None): if item.body == '+bunkertip': print('Bunkertip!') item.reply(get_balance) item.mark_read()
根因分析
返回值是Python函数对象的默认字符串表示,对应内存中get_balance函数的存储地址,触发原因:
- 传给
item.reply()的参数是get_balance函数本身,没有加()触发函数执行,程序不会运行余额查询逻辑,直接将函数对象转成字符串输出。 - 代码存在三个额外隐患:
get_balance函数声明了address入参,但内部未使用该参数- 函数内局部变量与函数同名,存在变量遮蔽问题
- 直接返回数值类型余额,未做字符串转换,易触发PRAW接口参数类型错误
修复方案
- 传入回复内容前加
()调用get_balance函数,拿到实际余额值后转成字符串再传入item.reply() - 重命名函数内局部变量,避免和函数名冲突
- 补全
address参数逻辑,支持查询指定地址余额/钱包总余额两种场景
修正后核心代码:
def get_balance(address=None): rpc_connection = AuthServiceProxy("http://%s:%s@127.0.0.1:22555" % ('user', 'pass')) balance = rpc_connection.getbalance(address) if address else rpc_connection.getbalance() return balance for item in reddit.inbox.unread(limit=None): if item.body == '+bunkertip': print('Bunkertip!') balance = get_balance() item.reply(f"当前余额:{balance} BTC") item.mark_read()
内容的提问来源于stack exchange,提问作者IdotMaster1
相关产品推荐
相关产品推荐

