You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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接口参数类型错误
修复方案
  1. 传入回复内容前加()调用get_balance函数,拿到实际余额值后转成字符串再传入item.reply()
  2. 重命名函数内局部变量,避免和函数名冲突
  3. 补全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.11 16:16:24