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

discord.py使用topggpy实现bot投票奖励的配置问题

Discord.py 对接top.gg投票奖励功能实现修正

现有代码问题梳理

  • on_dbl_vote函数未通过topggpy提供的装饰器注册为webhook监听事件,即使逻辑正确也无法接收top.gg推送的投票数据
  • 函数内未从传入的data载荷中提取投票用户ID,直接使用未定义的user变量会直接触发NameError
  • 未初始化topggpy的webhook服务,无法接收平台推送

Snowflake类型说明

top.gg文档中标注的snowflake是Discord全生态通用的ID格式,本质就是64位全局唯一整数,不需要特殊解析,直接转成字符串即可作为用户唯一标识,和你现有拼接Replit数据库key的逻辑完全兼容。

正确实现代码

首先安装依赖:
pip install topggpy

核心代码片段:

import discord
from topgg import DBLClient, WebhookManager
from replit import db

# 你原有的client初始化逻辑保留,不需要强制换成commands.Bot
client = discord.Client(intents=discord.Intents.default())

# 初始化top.gg客户端,替换为你自己的top.gg机器人Token
dbl_client = DBLClient(client, "你的TOPGG_BOT_TOKEN", autopost=True)
# 初始化webhook监听服务,webhook_auth自行设置一个密码即可,端口和Replit默认服务端口保持一致
webhook_manager = WebhookManager(
    client,
    dbl_token="你的TOPGG_BOT_TOKEN",
    webhook_auth="自定义的WEBHOOK验证密码",
    webhook_port=8080
)

# 必须加@webhook_manager.listen()装饰器注册投票事件,不能用@client.event
@webhook_manager.listen()
async def on_dbl_vote(data):
    # 从推送数据中取出投票用户ID,转字符串用于拼接数据库key
    voter_id = str(data["user"])
    user_db_key = f"{voter_id}_stats"

    # 你原有的奖励发放逻辑,key正确即可正常运行
    if user_db_key in db.keys():
        user_stats = db[user_db_key]
        user_stats["money"] += 1500
        user_stats["seeds"] += 2
        db[user_db_key] = user_stats

        # 可选:给投票用户发奖励到账私信
        try:
            voter = await client.fetch_user(int(voter_id))
            await voter.send("感谢你为机器人投票,1500金币+2个种子已发放到账~")
        except:
            # 用户关闭私信权限时直接跳过即可
            pass

@client.event
async def on_ready():
    # 机器人登录成功后启动webhook监听
    await webhook_manager.start()
    print(f"机器人已登录:{client.user},top.gg投票监听已启动")

@client.event
async def on_message(message):
    # 你原有的所有命令逻辑保留即可
    pass

client.run("你的DISCORD_BOT_TOKEN")

配置与无发布测试方法

你不需要提前把机器人发布到top.gg平台,也不需要真的触发投票就能测试逻辑:

  • 在top.gg机器人管理后台的Webhook配置页,填写你的Replit项目公网地址,格式为https://<你的replit项目名>.<你的replit用户名>.repl.co/dblwebhook,Webhook验证密码和代码中webhook_auth的值保持一致
  • 本地或者用Replit的Shell工具发模拟POST请求即可触发投票事件,测试命令如下,替换对应参数即可:
curl -X POST https://你的Replit项目公网地址/dblwebhook \
  -H "Authorization: 你设置的WEBHOOK验证密码" \
  -H "Content-Type: application/json" \
  -d '{"user": 你自己的Discord数字ID, "type": "upvote", "bot": 你的机器人数字ID, "isWeekend": false}'

发送请求后直接查看Replit数据库中对应用户的数据是否更新,即可验证逻辑是否正常,全程不需要公开机器人、也不需要实际走平台投票流程。


内容的提问来源于stack exchange,提问作者user18597563

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:21:34