如何用Discord.py调用Google Sheets/MySQL实现游戏时长查询机器人?
实现你的Discord游戏时长查询机器人:Discord.py + MySQL + Google Sheets方案
当然可以实现!这个需求结合Discord.py的命令处理能力,加上MySQL和Google Sheets的读写支持,完全能打造出你想要的功能。下面我会一步步拆解实现思路和核心代码片段,帮你快速落地。
一、先搞定环境依赖
首先得安装几个必要的Python包,打开终端执行:
pip install discord.py:核心的Discord机器人框架pip install mysql-connector-python:用于连接MySQL数据库pip install gspread oauth2client:用于操作Google Sheets
二、搭建基础机器人框架
先写最核心的机器人初始化代码,记得替换成你自己的Discord机器人Token:
import discord from discord.ext import commands # 初始化机器人,设置命令前缀为?,并开启必要的消息权限 intents = discord.Intents.default() intents.message_content = True # 必须开启这个才能读取用户发送的命令内容 bot = commands.Bot(command_prefix='?', intents=intents) # 机器人就绪时的提示 @bot.event async def on_ready(): print(f"我上线啦!当前账号:{bot.user}") print("------------------------") # 运行机器人,替换成你的Bot Token bot.run("YOUR_DISCORD_BOT_TOKEN")
⚠️ 注意:要在Discord开发者门户的Bot设置里开启Message Content Intent,不然机器人收不到用户的命令内容。
三、实现MySQL数据查询
写一个函数专门从MySQL里拉取用户数据,记得替换成你的数据库信息:
import mysql.connector from mysql.connector import Error def get_mysql_user_data(user_id): try: # 建立数据库连接 conn = mysql.connector.connect( host="你的MySQL主机地址", database="你的数据库名称", user="数据库用户名", password="数据库密码" ) if conn.is_connected(): cursor = conn.cursor(dictionary=True) # 返回字典格式的数据,方便后续处理 # 假设你的表名为unturned_playtime,ID字段是user_id query = "SELECT * FROM unturned_playtime WHERE user_id = %s" cursor.execute(query, (user_id,)) return cursor.fetchone() # 获取匹配的第一行数据 except Error as e: print(f"MySQL查询出错:{e}") return None finally: # 不管成功失败,都要关闭连接 if conn.is_connected(): cursor.close() conn.close()
四、实现Google Sheets数据查询
要操作Google Sheets,得先去Google云平台创建服务账号,下载密钥JSON文件,然后写查询函数:
import gspread from oauth2client.service_account import ServiceAccountCredentials # 设置权限范围 scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] # 加载服务账号密钥,替换成你的密钥文件路径 creds = ServiceAccountCredentials.from_json_keyfile_name("你的服务账号密钥.json", scope) client = gspread.authorize(creds) # 打开目标表格,替换成你的表格名称或ID sheet = client.open("Unturned游戏时长统计").sheet1 def get_sheets_user_data(user_id): try: # 在第一列查找用户ID(假设ID存在第一列) cell = sheet.find(str(user_id)) if cell: # 获取整行数据 row_data = sheet.row_values(cell.row) # 获取表头,用来和行数据配对成字典 headers = sheet.row_values(1) return dict(zip(headers, row_data)) else: return None except Exception as e: print(f"Google Sheets查询出错:{e}") return None
五、整合命令与嵌入消息回复
现在把上面的查询函数整合到?Playtime命令里,并用Discord的嵌入消息返回数据:
@bot.command(name="Playtime") async def playtime_query(ctx, user_id: str): # 优先从MySQL查询数据(假设MySQL是主数据源) user_data = get_mysql_user_data(user_id) # 如果MySQL没找到,再查Google Sheets if not user_data: user_data = get_sheets_user_data(user_id) # 两种数据源都没找到的情况 if not user_data: await ctx.send(f"抱歉,没找到ID为`{user_id}`的用户数据!") return # 构建美观的嵌入消息 embed = discord.Embed( title=f"用户{user_id}游戏时长信息", color=discord.Color.green() ) # 把用户数据逐行添加到嵌入字段 for key, value in user_data.items(): embed.add_field(name=key, value=value, inline=False) # 发送嵌入消息 await ctx.send(embed=embed) # 可选:如果Sheets有数据但MySQL没有,自动同步到MySQL if not get_mysql_user_data(user_id) and user_data: sync_data_to_mysql(user_data) # 补充数据同步到MySQL的函数 def sync_data_to_mysql(user_data): try: conn = mysql.connector.connect( host="你的MySQL主机地址", database="你的数据库名称", user="数据库用户名", password="数据库密码" ) if conn.is_connected(): cursor = conn.cursor() # 假设表结构是user_id, playtime_hours, last_login, server_name insert_query = """INSERT INTO unturned_playtime (user_id, playtime_hours, last_login, server_name) VALUES (%s, %s, %s, %s)""" values = ( user_data["用户ID"], user_data["游戏时长(小时)"], user_data["最后登录时间"], user_data["服务器名称"] ) cursor.execute(insert_query, values) conn.commit() print(f"已将用户{user_data['用户ID']}的数据同步到MySQL") except Error as e: print(f"同步到MySQL出错:{e}") finally: if conn.is_connected(): cursor.close() conn.close()
六、几个关键注意点
- 数据一致性:建议指定一个主数据源(比如MySQL),另一个作为备份,定期同步,避免两边数据不一致。
- 权限问题:确保机器人在Discord服务器有发送消息、嵌入消息的权限,Google服务账号有目标表格的编辑权限。
- 错误优化:可以给用户添加更友好的错误提示,比如“数据库连接失败,请稍后再试”,而不是直接抛出错误日志。
- 性能优化:如果用户量较大,可以添加缓存机制(比如用
functools.lru_cache),减少重复查询数据库和Sheets的次数。
内容的提问来源于stack exchange,提问作者user9476788
相关产品推荐
相关产品推荐

