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()
使用说明
- 获取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")
- 运行代码,填入三个字段,点击提交即可完成统计
内容的提问来源于stack exchange,提问作者Bighelp509
相关产品推荐
相关产品推荐

