使用YouTube API V3调用CommentThreads.List接口时遭遇权限范围不足的403错误
嘿,我之前也踩过这个一模一样的坑!咱们一步步来把这个问题解决掉:
首先,这个403错误的核心原因其实很明确:你当前用的OAuth令牌权限范围(scope)不够,没法调用CommentThreads.List接口。虽然你提到已经试过YoutubeScope和YoutubeReadOnlyScope,但大概率是两个细节没做好——要么是初始化服务时scope没传对,要么是旧的授权缓存没清,导致程序还在复用旧的权限令牌。
第一步:确认用对了权限范围
对于获取公开视频的评论(你的视频p1H22env11s是公开状态),其实YoutubeReadOnlyScope就完全够用了,它对应的权限URL是https://www.googleapis.com/auth/youtube.readonly。关键是要确保在初始化YouTube服务的时候,这个scope被正确传进去了。
比如你初始化服务的代码应该类似这样(你没贴这部分,我补个参考示例):
import ( "context" "fmt" "os" "log" "golang.org/x/oauth2/google" "google.golang.org/api/youtube/v3" "google.golang.org/api/option" ) func getYoutubeService() (*youtube.Service, error) { ctx := context.Background() // 读取你的OAuth凭证文件(一般叫credentials.json) b, err := os.ReadFile("credentials.json") if err != nil { return nil, fmt.Errorf("读取凭证文件失败: %v", err) } // 这里必须传入正确的scope! config, err := google.ConfigFromJSON(b, youtube.YoutubeReadOnlyScope) if err != nil { return nil, fmt.Errorf("解析凭证文件出错: %v", err) } // 这里假设你有getClient函数处理令牌的缓存和刷新 client := getClient(config) service, err := youtube.NewService(ctx, option.WithHTTPClient(client)) if err != nil { return nil, fmt.Errorf("创建YouTube服务实例失败: %v", err) } return service, nil }
第二步:删掉旧的授权缓存(重点!)
这是很多人容易忽略的点!如果你之前用其他scope生成过授权令牌,程序会把令牌缓存到本地(一般是个叫token.json的文件)。哪怕你现在改对了scope,程序还是会优先用旧的令牌,自然会报权限不足。
解决方法很简单:直接删掉本地的token.json文件,然后重新运行程序,跟着提示重新完成一次授权流程——新生成的令牌就会带上正确的权限范围了。
第三步:优化你的CommentThreads.List调用(非必须但实用)
虽然这不是权限问题,但你当前的代码只请求了id字段,返回的结果基本没什么实际价值。建议把请求字段改成[]string{"id", "snippet"},这样能拿到评论的实际内容、作者信息这些有用的数据:
call := service.CommentThreads.List([]string{"id", "snippet"}).VideoId(videoId).TextFormat("plainText")
额外检查项
如果你的视频是私有/未公开状态,那YoutubeReadOnlyScope就不够用了,得用更高级的YoutubeScope(https://www.googleapis.com/auth/youtube),不过看你的视频ID应该是公开的,这个大概率不是问题。
按照上面的步骤改完,再跑代码应该就能正常拉取评论了!
备注:内容来源于stack exchange,提问作者Akbarshoh Ismoilov

