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

Python开发Twitch Bot投票功能时JSON数据回写问题求助

问题1:投票数据回写JSON + 实时读取JSON修改的解决方案

第一步:优化JSON读写封装

不要使用全局变量传递配置,封装独立的读写函数,每次处理投票请求时主动读取最新的JSON文件内容,修改后主动回写:

import json

# 读取最新投票配置
def load_poll_config():
    with open("poll.json", "r", encoding="utf-8") as f:
        return json.load(f)

# 回写修改后的投票数据
def save_poll_config(data):
    with open("poll.json", "w", encoding="utf-8") as f:
        # indent=4保持和原文件一致的格式化,ensure_ascii=False支持中文问题/选项
        json.dump(data, f, indent=4, ensure_ascii=False)

你之前封装的读取函数只能拿到启动时的配置,是因为你仅在脚本初始化时调用了一次,只要每次处理投票前都调用load_poll_config就能实时感知Web端对JSON的修改。

第二步:修改vote命令逻辑,增加回写步骤

# 若需要重启Bot后仍保留用户投票记录,可将该列表存入JSON的新增字段中
poll_entrants = []

@bot.command(name="vote")
async def vote(ctx):
    # 每次投票都读最新配置
    poll_config = load_poll_config()
    vote_active = poll_config["poll_active"]
    vote_opts = poll_config["vote_options"]["options"]

    if ctx.author.name not in poll_entrants and vote_active:
        try:
            # 解析用户投票序号,转换为从0开始的索引
            vote_index = int(ctx.message.content.split("vote ")[1]) - 1
            target_opt = list(vote_opts.keys())[vote_index]
            # 票数+1
            vote_opts[target_opt] += 1
            poll_entrants.append(ctx.author.name)
            # 回写修改后的票数到JSON
            poll_config["vote_options"]["options"] = vote_opts
            save_poll_config(poll_config)
            print("投票计数成功")
        # 捕获参数错误、序号越界等异常
        except (IndexError, ValueError, KeyError):
            pass
    else:
        print("投票无效:用户已参与或投票未开启")

问题2:存储格式选择建议

JSON完全适配你的使用场景,不需要更换为XML或YAML:

  • JSON是所有编程语言原生支持的通用格式,你的Web管控端、Python Bot、CasparCG服务都不需要额外安装解析依赖,读写效率高
  • YAML虽然可读性更高,但语法对缩进敏感,频繁手动/接口修改容易出错,且Python需要额外安装PyYAML库
  • XML冗余度高、解析逻辑复杂,完全没有必要用于该轻量配置场景
    如果后续投票并发量上涨(同时几十人以上投票),可以加文件锁避免读写冲突,或者更换为SQLite轻量数据库更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:03