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

Twitch API调用故障:弹幕数据获取及Top10时刻统计功能异常

问题诊断与修复方案

核心问题:Twitch API版本过时

你当前使用的是已废弃的Twitch v5 API(https://api.twitch.tv/v5/),该API早在2022年就停止服务,这是导致调用失败的主要原因,和Client ID本身的正确性关系不大。目前Twitch仅支持Helix API(https://api.twitch.tv/helix/),且认证规则也有变化。

具体问题与修复步骤

1. 认证方式更新

Helix API不再接受仅用Client-ID请求,必须同时携带:

  • Client-ID:在Twitch开发者控制台创建应用获取
  • Authorization:格式为 Bearer {OAuth Token},通过客户端凭证流程获取(仅用于获取公开数据,无需用户授权)

2. API端点变更

获取视频弹幕的Helix端点为:https://api.twitch.tv/helix/videos/comments,参数需要video_id,且必须处理分页(弹幕数据会分页返回)

3. 代码中的其他错误

  • GUI重复初始化:if __name__ == "__main__"块重复调用add_ui_elements,且未定义submit_button会直接报错
  • 弹幕解析逻辑错误:v5和Helix的返回结构完全不同,原代码的content_offset_seconds和messages字段在Helix中不存在
  • 未处理分页:原代码只获取第一页数据,会漏掉大量弹幕

修正后的完整代码

import requests
import tkinter as tk
import tkinter.messagebox as messagebox
import functools

def get_chat_logs(client_id, oauth_token, video_id):
    chat_logs = []
    url = "https://api.twitch.tv/helix/videos/comments"
    headers = {
        "Client-ID": client_id,
        "Authorization": f"Bearer {oauth_token}"
    }
    params = {"video_id": video_id}

    while True:
        response = requests.get(url, headers=headers, params=params)
        print(f"状态码: {response.status_code}")
        if response.status_code != 200:
            messagebox.showerror("错误", f"API调用失败,状态码: {response.status_code}\n请检查Client ID、OAuth Token和视频ID")
            return []
        
        data = response.json()
        chat_logs.extend(data["data"])
        
        # 处理分页,直到没有下一页
        pagination = data.get("pagination", {}).get("cursor")
        if not pagination:
            break
        params["cursor"] = pagination
    
    return chat_logs

def parse_chat_logs(chat_logs):
    chat_volume_by_moment = {}
    # 按整分钟聚合弹幕(可按需调整为秒级)
    for comment in chat_logs:
        timestamp = int(comment["content_offset_seconds"]) // 60
        if timestamp not in chat_volume_by_moment:
            chat_volume_by_moment[timestamp] = 0
        chat_volume_by_moment[timestamp] += 1
    return chat_volume_by_moment

def find_top_moments(chat_volume_by_moment):
    # 按弹幕量降序排序,取前10
    sorted_moments = sorted(chat_volume_by_moment.items(), key=lambda x: x[1], reverse=True)
    return sorted_moments[:10]

def add_ui_elements():
    window = tk.Tk()
    window.title("Twitch弹幕统计")

    # Client ID输入
    tk.Label(window, text="Client ID:").pack(pady=2)
    client_id_textbox = tk.Entry(window, width=50)
    client_id_textbox.pack(pady=2)

    # OAuth Token输入
    tk.Label(window, text="OAuth Token:").pack(pady=2)
    oauth_textbox = tk.Entry(window, width=50)
    oauth_textbox.pack(pady=2)

    # 视频ID输入
    tk.Label(window, text="视频ID:").pack(pady=2)
    video_id_textbox = tk.Entry(window, width=50)
    video_id_textbox.pack(pady=2)

    # 提交按钮
    submit_button = tk.Button(window, text="开始统计")
    submit_button.pack(pady=10)

    return client_id_textbox, oauth_textbox, video_id_textbox, submit_button, window

def main(client_id_textbox, oauth_textbox, video_id_textbox, event=None):
    client_id = client_id_textbox.get().strip()
    oauth_token = oauth_textbox.get().strip()
    video_id = video_id_textbox.get().strip()

    if not all([client_id, oauth_token, video_id]):
        messagebox.showerror("错误", "请填写所有必要字段")
        return

    chat_logs = get_chat_logs(client_id, oauth_token, video_id)
    if not chat_logs:
        return
    
    chat_volume = parse_chat_logs(chat_logs)
    top_moments = find_top_moments(chat_volume)

    # 写入文件,转换为易读格式
    with open("top_moments.txt", "w", encoding="utf-8") as f:
        f.write("弹幕量TOP10时刻(单位:分钟):\n")
        for idx, (minute, count) in enumerate(top_moments, 1):
            f.write(f"{idx}. 第{minute}分钟: {count}条弹幕\n")
    
    messagebox.showinfo("成功", "统计结果已写入top_moments.txt")

if __name__ == "__main__":
    client_id_tb, oauth_tb, video_id_tb, submit_btn, window = add_ui_elements()
    submit_btn.bind("<Button-1>", functools.partial(main, client_id_tb, oauth_tb, video_id_tb))
    window.mainloop()

使用说明

  1. 获取Client ID和OAuth Token:
    • 登录Twitch开发者控制台,创建新应用
    • 在应用详情页获取Client ID和Client Secret
    • 通过客户端凭证流程获取OAuth Token(示例命令:curl -X POST "https://id.twitch.tv/oauth2/token" -d "client_id=你的ClientID&client_secret=你的ClientSecret&grant_type=client_credentials")
  2. 运行代码,填入三个字段,点击提交即可完成统计

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:25:22