修改Discord Bot代码以支持YouTube视频链接提取频道信息
解决YouTube视频链接的频道信息提取问题
问题原因
视频页面的JSON结构和频道页面完全不同,你之前用的subscribeButton路径在视频页面的JSON里不存在,因此抛出KeyError。
正确解析路径
从你提供的视频页面JSON数据中,频道信息位于videoSecondaryInfoRenderer下的videoOwnerRenderer节点内,具体提取路径如下:
- 频道ID:找到
json_data["contents"]["twoColumnWatchNextResults"]["results"]["results"]["contents"]中包含videoSecondaryInfoRenderer的项,再取videoSecondaryInfoRenderer["owner"]["videoOwnerRenderer"]["channelId"] - 频道名称:
videoSecondaryInfoRenderer["owner"]["videoOwnerRenderer"]["title"]["runs"][0]["text"] - 频道Logo:
videoSecondaryInfoRenderer["owner"]["videoOwnerRenderer"]["thumbnail"]["thumbnails"][-1]["url"](取最后一个元素可获取最高清的Logo)
鲁棒性代码实现
JSON中contents的索引可能发生变动,直接用固定索引易出错,建议遍历列表定位目标节点:
def extract_channel_info_from_video(json_data): # 遍历视频页面的contents列表,定位videoSecondaryInfoRenderer contents = json_data["contents"]["twoColumnWatchNextResults"]["results"]["results"]["contents"] for item in contents: if "videoSecondaryInfoRenderer" in item: owner_renderer = item["videoSecondaryInfoRenderer"]["owner"]["videoOwnerRenderer"] # 提取核心信息 channel_id = owner_renderer["channelId"] channel_name = owner_renderer["title"]["runs"][0]["text"] channel_logo = owner_renderer["thumbnail"]["thumbnails"][-1]["url"] return { "channel_id": channel_id, "channel_name": channel_name, "channel_logo": channel_logo } return None # 未找到目标节点时返回None
补充说明
如果你的Bot需要同时处理频道链接和视频链接,可以添加链接类型判断逻辑:通过检查链接是否包含/channel/、/c/或watch?v=来区分,再选择对应的解析路径。
内容的提问来源于stack exchange,提问作者flyinggoatman
相关产品推荐
相关产品推荐

