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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:03:16