news 2026/9/23 1:30:51

Return YouTube Dislike 开放 API 实战指南:恢复 YouTube 不喜欢计数的数据获取、限流策略与扩展工作原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Return YouTube Dislike 开放 API 实战指南:恢复 YouTube 不喜欢计数的数据获取、限流策略与扩展工作原理
  • 开发工具

【免费下载链接】return-youtube-dislike

Chrome extension to return youtube dislikes

项目地址:https://gitcode.com/gh_mirrors/re/return-youtube-dislike
点击查看免费下载

本文以仓库根目录的 READMEvi.md(项目官方越南语 README,内容与英文版 README.md 一致)为核心骨架,结合 Extensions/combined/src 下的扩展源码与 Docs/FAQ.md 官方问答,完整讲解 Return YouTube Dislike 项目的背景、数据推算原理、开放 API 的调用方式与限制,以及浏览器扩展在底层如何消费这些 API。读完本文,你将掌握如何用/votes端点查询任意 YouTube 视频的不喜欢计数、理解限流与错误状态码的处理策略,并看清扩展端从注册、投票到渲染的完整数据链路。

项目背景:为什么需要"恢复不喜欢计数"

2021 年 11 月 10 日,Google 官方宣布移除 YouTube 上公开的不喜欢计数;随后在 2021 年 12 月 13 日,YouTube API 也正式删除了dislike字段。这意味着第三方开发者与普通用户都失去了在观看视频前评估内容质量的客观依据。

Return YouTube Dislike(下文简称 RYD)正是针对这一变化诞生的开源项目:它以浏览器扩展(Chrome / Firefox Web Extension)为主要形态,同时以 JS Userscript 形式支持其他浏览器,目标是在 YouTube 界面上重新显示被隐藏的不喜欢数量。项目的扩展源码位于 Extensions/combined(内容脚本入口为 ryd.content-script.js,后台脚本为 ryd.background.js)。

工作原理:抓取数据 + 用户数据外推

由于 YouTube API 不再提供不喜欢统计,RYD 的后端转向了两种数据来源的组合:

  1. 抓取的存量不喜欢数据(scraped dislike stats)——在 YouTube 移除该数据前归档保存的历史记录;
  2. 从扩展用户数据外推的估计值(estimates extrapolated from extension user data)——利用安装了扩展的用户主动提交的投票样本,推算全局的不喜欢数量。

根据 Docs/FAQ.md 的官方说明,具体推算逻辑为:

  • 对于在 API 关闭之后上传的视频:

    RYD 不喜欢数 = (RYD 用户不喜欢数 / RYD 用户喜欢数) × 公开喜欢数
  • 如果 RYD 数据库恰好保存了真实的喜欢/不喜欢数(来自上传者提供或历史归档),则最终结果会同时基于用户投票与归档值计算,且归档值随时间推移对最终结果的影响力逐渐减弱。

数据缓存与更新方面,Docs/FAQ.md 明确指出:视频的不喜欢数据会被缓存,大约每 2~3 天更新一次,不会更频繁;当一个视频 ID 第一次被 API 查询时,后端会通过 YouTube API 获取数据并存入数据库,用于缓存与归档,随后直接返回给请求方。如果某视频在归档关闭后仍未被收录,后端则会退化为基于观看/喜欢比例的估算。

开放 API 使用规范:署名与限流

RYD 将后端 API 作为开放 API 提供给第三方使用,但附带两条明确限制(这也是原文档的核心内容,必须严格遵守):

限制项具体要求
署名(Attribution)第三方使用必须清晰标注本项目,并附上项目官网 returnyoutubedislike.com 的链接
限流(Rate Limiting)每个客户端每分钟 100 次请求、每天 10,000 次请求;超出后返回429(Too Many Requests)状态码,表示客户端应主动退避(back off)

API 的基础路径(Base URL)为:

https://returnyoutubedislikeapi.com

全部可用端点的列表(Swagger 文档)位于:

https://returnyoutubedislikeapi.com/swagger/index.html

这一 Base URL 在扩展源码中也有对应定义:见 config.js 中的PROD_API_URL常量,且开发环境与生产环境使用同一地址;getApiEndpoint 负责拼接端点路径。

查询点赞/点踩数据:/votes 端点

GET 单个视频

使用某个 YouTube 视频 ID 查询其不喜欢计数的调用方式为:

<Base URL>/votes?videoId=kxOuG8jMIgI

即完整的请求为:

https://returnyoutubedislikeapi.com/votes?videoId=kxOuG8jMIgI

原文档(越南语版)给出的响应示例:

{ "id": "kxOuG8jMIgI", "dateCreated": "2021-12-20T12:25:54.418014Z", "likes": 27326, "dislikes": 498153, "rating": 1.212014408444885, "viewCount": 3149885, "deleted": false }

英文版 README.md 中的响应示例字段更完整(多出rawDislikesrawLikes两个原始采样字段):

{ "id": "kxOuG8jMIgI", "dateCreated": "2022-04-09T21:44:20.5103Z", "likes": 31885, "rawDislikes": 31946, "rawLikes": 457, "dislikes": 579721, "rating": 1.2085329444119253, "viewCount": 3762293, "deleted": false }

字段语义对照如下:

字段含义
id对应的 YouTube 视频 ID
dateCreated该条投票记录的创建时间(ISO 8601,UTC)
likes该视频的喜欢数
rawDislikes/rawLikes从 RYD 用户群体收集到的原始投票样本数(未外推)
dislikes推算/归档后的不喜欢总数,即最终展示给用户的值
rating喜欢/不喜欢比例相关的评分值
viewCount视频观看次数
deleted该视频数据是否已被删除/标记删除

错误状态码

  • 查询一个不存在的视频 ID时,返回404(Not Found / Không Tìm thấy)。
  • 查询一个格式非法的视频 ID时,返回400(Bad Request / Yêu cầu Không hợp lệ)。
  • 触发限流时返回429(Too Many Requests)。

源码中的实际调用:votes 端点如何被扩展消费

扩展内容脚本在 state.js 的setState函数中发起真实请求,请求格式为:

let response = await fetch(getApiEndpoint(`/votes?videoId=${videoId}&likeCount=${likeCount || ""}`), { method: "GET", headers: { Accept: "application/json" }, })

可以看到,扩展端实际还额外携带了likeCount查询参数(取自页面上原生喜欢按钮的文本解析结果,见getLikeCountFromButton),用于让后端结合真实的公开喜欢数提高推算精度;响应中若出现traceId字段(如"traceId" in response)则视为错误响应并被过滤,随后调用processResponse完成数字格式化、渲染与比例条绘制。比例条(rate bar)的完整渲染逻辑见 bar.js,它根据likes / (likes + dislikes)计算百分比,并支持coloredBarshowTooltipPercentagetooltipPercentageMode等配置项。

另外,后台脚本 ryd.background.js 中还包含一个POST /votes的批量上报调用:当累积的视频 ID 达到 20 个时,将数组以 JSON 请求体批量发送,用于扩展侧的数据回传与归档。

扩展端数据链路的其余关键 API

从 ryd.background.js 的源码可以看出,除了公开的/votes之外,扩展还使用以下端点完成身份注册与投票上报(这些属于扩展内部机制,未在 README 中对外承诺,仅供理解数据链路):

端点方法用途
/puzzle/registration?userId=...GET / POST注册匿名用户 ID;采用工作量证明(PoW)谜题防滥用,客户端用 SHA-512 哈希求解,见solvePuzzle函数
/interact/votePOST提交用户对某视频的喜欢/不喜欢投票(含userIdvideoIdvalue
/interact/confirmVotePOST投票谜题解出后二次确认投票
/configs/selectorsGET拉取 YouTube 页面 DOM 选择器的远程配置,用于适配 YouTube 界面改版,见 state.js

上述匿名注册机制配合"投票需解谜题"的设计,构成了防刷与限流的客户端配合部分,与 API 侧的 100 次/分钟、10,000 次/天限流互为补充。

为什么不喜欢计数如此重要

不喜欢计数是用户在观看前判断视频质量、教程有效性、产品口碑的重要信号。RYD 项目的存在价值在于:即便官方移除了这一指标,通过社区数据归档与统计外推,仍然可以恢复接近真实的评价维度。更多背景信息可在项目官网(returnyoutubedislike.com)查阅。

从源码理解扩展的完整展示流程

结合 ryd.content-script.js 与 state.js,扩展端一次完整的展示流程可以归纳为:

  1. 页面加载后,内容脚本通过轮询(111ms 间隔)等待视频按钮渲染完成,同时监听yt-navigate-finish事件处理 SPA 内导航;
  2. 通过setInitialState()读取本地配置(initExtConfig会先从远程拉取选择器配置并与内置默认值合并,默认选择器见 state.js);
  3. 从 URL 解析视频 ID,调用/votes?videoId=...&likeCount=...获取数据;
  4. dislikesnumberFormat格式化后写入页面按钮文本(setDislikes),如启用numberDisplayReformatLikes还会重排喜欢数格式;
  5. 调用createRateBar绘制喜欢/不喜欢比例条与悬浮提示(tooltip);
  6. 若用户点击了喜欢/不喜欢,通过事件监听与sendVote将投票匿名上报回后端(受disableVoteSubmission配置控制,关闭后图标会切换为icon_hold128.png)。

其中步骤 2 拉取到的远程选择器配置与本地DEFAULT_SELECTORS通过mergeConfig深度合并,这保证了 YouTube 前端改版时扩展无需发版即可适配。

常见问题速览(来自官方 FAQ)

以下要点摘自 Docs/FAQ.md,与 README 的工作原理解释互为印证:

  • 数据来源:Google API 与抓取数据的组合;所有可用数据会存入数据库,以便在官方 API 完全关闭后仍可提供服务。
  • 为什么不喜欢计数不更新:数据有缓存,约每 2~3 天更新一次,并非实时。
  • 隐私/安全顾虑:详见仓库根目录的 SECURITY-FAQ.md。
  • 多语言版本见 Docs 目录(含中文 FAQcn.md、SECURITY-FAQcn.md 等)。

安装方式与更多资源

  • 安装指南:见 Docs/Guide__Installing.md(含越南语版 Guide__Installingvi.md)。
  • 排障指南:见 Docs/Guide__Troubleshooting.md。
  • Userscript 版本:可直接使用的脚本位于 Extensions/UserScript/Return Youtube Dislike.user.js。
  • 多浏览器 Manifest:Chrome、Firefox、Safari 分别对应 manifest-chrome.json、manifest-firefox.json、manifest-safari.json。
  • 贡献指南:见仓库根目录的 CONTRIBUTING.md(多语言版本位于根目录)。
  • 项目许可:GPLv3,见 LICENSE。

小结

围绕"恢复 YouTube 不喜欢计数"这一核心目标,RYD 通过开放 API 提供了可查询视频不喜欢数据的/votes端点,并明确了署名与限流(100 次/分钟、10,000 次/天、429 退避)的使用边界;其扩展端则在源码层面完整实现了从匿名注册、投票上报、远程选择器配置到比例条渲染的闭环。第三方开发者既可以按本文所述直接消费公开 API,也可以阅读 Extensions/combined/src 与 Docs/FAQ.md 深入了解数据推算与缓存策略,将这一社区数据能力集成到自己的工具中。

  • 开发工具

【免费下载链接】return-youtube-dislike

Chrome extension to return youtube dislikes

项目地址:https://gitcode.com/gh_mirrors/re/return-youtube-dislike
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 1:30:01

复杂时钟网络CCOpt配置与Debug实战:从配置到收敛定位

简介&#xff1a;这份PDF文档面向使用Cadence Innovus进行物理实现的IC设计工程师&#xff0c;聚焦时钟树综合&#xff08;CTS&#xff09;环节中CCOpt工具的配置与调试方法&#xff0c;适合具备一定数字后端基础、需要处理复杂时钟网络问题的中高级设计师。文档基于Innovus 18…

作者头像 李华
网站建设 2026/9/23 1:29:56

高校科技成果转化:机制创新与实践路径

1. 科技成果转化的现状与挑战高校作为科技创新的重要源头&#xff0c;每年产生大量具有潜在应用价值的科研成果。然而长期以来&#xff0c;这些成果往往停留在论文发表或实验室阶段&#xff0c;难以真正走向产业化应用。根据相关统计数据显示&#xff0c;我国高校科技成果转化率…

作者头像 李华
网站建设 2026/9/23 1:28:12

Synopsys License 部署与排错实战:从 lmgrd 到 snpslmd 全解析

简介&#xff1a;这份资源面向需要配置Synopsys工具授权环境的学习者&#xff0c;尤其是Windows平台下进行license生成与调试的初学者和进阶用户。压缩包内仅含1个docx文档&#xff0c;体积约269KB&#xff0c;以文字说明形式梳理了授权文件从获取到可用的完整流程&#xff0c;…

作者头像 李华
网站建设 2026/9/23 1:27:37

qcow2镜像转vmdk并在VMware Workstation运行的完整指南

简介&#xff1a;针对使用VMware Workstation运行qcow2格式镜像这一高频需求&#xff0c;整理了一份从零开始的操作手册&#xff0c;目标读者是虚拟化运维、系统部署、环境测试人员。手册详细描述了环境准备所需的软件及版本&#xff08;VMware Workstation 15.x、qemu-img 9.1…

作者头像 李华