• lianghuan

    最近在做 YouTube 评论相关的工具,API 这块踩了几个坑,记录一下。

    1. 配额的账要提前算

    YouTube Data API v3 免费额度是 10000 units/天,太平洋时间午夜重置。官方配额表里:

    方法 |
    每次消耗 |
    作用 |

    commentThreads.list |
    1 |
    拉顶级评论,一页最多 100 条 |

    comments.list |
    1 |
    拉某条评论下的回复 |

    search.list |
    100 |
    按关键词找视频 |

    看起来挺宽裕:1 unit 换 100 条评论,一天理论上能拉 100 万条。

    但 search.list 一次 100 units ,而且它有自己独立的额度桶,每天只有 100 次。
    所以如果你靠关键词去发现视频,配额会先从那儿炸掉,而不是先炸在拉评论上。

    [这里写一句你自己实际怎么处理的:视频 ID 是从哪来的、有没有撞过配额上限]

    2. 搜索评论不该在前端做

    我最初的想法是把评论拉下来,前端 filter 。后来发现 commentThreads.list 本身就有个 searchTerms 参数:

    GET /youtube/v3/commentThreads?part=snippet&videoId=VIDEO_ID&searchTerms=关键词

    这是 YouTube 在服务端搜整条线程,不是只搜你当前已经加载的那一页。省带宽,也省延迟。

    两个容易踩的限制:

    - searchTerms 不能和 id 参数一起用,只能配合 videoId 或 allThreadsRelatedToChannelId

    - 它只匹配顶级评论的文本,回复里的内容搜不到,要另外走 comments.list

    [这里可以写你遇到的某个具体现象,比如搜不到某条回复、或者某类关键词没结果]

    3. 分页和回复是两个 endpoint ,请求数不是页数

    commentThreads.list 一页最多 100 条( maxResults 上限就是 100 ),翻页靠 nextPageToken 。

    但它返回的 replies 字段只是个预览,不是该评论下的全部回复。要拿完整的得再调 comments.list 。
    所以评论多的视频,实际请求数约等于「顶级评论的页数 + 有回复的评论条数」,不是页数。

    4. 读不需要 OAuth

    读公开评论,API key 就够了,不用走 OAuth 。写操作才需要。这点比想象中省事。


    我把上面这些做成了个网站: https://apriocity.com
    能按关键词搜整条评论线程、按发帖人名字找某条评论、导出 CSV 。前端 Next.js ,后端 Flask + Redis 。

    问一个我一直没想好的:热门视频评论几十万条的时候,你们一般怎么处理配额?
    开多个 GCP 项目轮换,还是干脆不上官方 API ?想听听有实际经验的怎么做的。

    主楼
  • bihui

    ytb 的评论为什么我每次看到的时候都会有重复的评论,你有这个情况嘛?

    #1
  • lianghuan

    @bihui 目前还没有遇见过

    #2

发表回复

登录后回复