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
相关产品推荐
相关产品推荐

