- 开发工具
【免费下载链接】return-youtube-dislike
Chrome extension to return youtube dislikes
本文以仓库根目录的 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 的后端转向了两种数据来源的组合:
- 抓取的存量不喜欢数据(scraped dislike stats)——在 YouTube 移除该数据前归档保存的历史记录;
- 从扩展用户数据外推的估计值(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 中的响应示例字段更完整(多出rawDislikes与rawLikes两个原始采样字段):
{ "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)计算百分比,并支持coloredBar、showTooltipPercentage、tooltipPercentageMode等配置项。
另外,后台脚本 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/vote | POST | 提交用户对某视频的喜欢/不喜欢投票(含userId、videoId、value) |
/interact/confirmVote | POST | 投票谜题解出后二次确认投票 |
/configs/selectors | GET | 拉取 YouTube 页面 DOM 选择器的远程配置,用于适配 YouTube 界面改版,见 state.js |
上述匿名注册机制配合"投票需解谜题"的设计,构成了防刷与限流的客户端配合部分,与 API 侧的 100 次/分钟、10,000 次/天限流互为补充。
为什么不喜欢计数如此重要
不喜欢计数是用户在观看前判断视频质量、教程有效性、产品口碑的重要信号。RYD 项目的存在价值在于:即便官方移除了这一指标,通过社区数据归档与统计外推,仍然可以恢复接近真实的评价维度。更多背景信息可在项目官网(returnyoutubedislike.com)查阅。
从源码理解扩展的完整展示流程
结合 ryd.content-script.js 与 state.js,扩展端一次完整的展示流程可以归纳为:
- 页面加载后,内容脚本通过轮询(111ms 间隔)等待视频按钮渲染完成,同时监听
yt-navigate-finish事件处理 SPA 内导航; - 通过
setInitialState()读取本地配置(initExtConfig会先从远程拉取选择器配置并与内置默认值合并,默认选择器见 state.js); - 从 URL 解析视频 ID,调用
/votes?videoId=...&likeCount=...获取数据; - 将
dislikes用numberFormat格式化后写入页面按钮文本(setDislikes),如启用numberDisplayReformatLikes还会重排喜欢数格式; - 调用
createRateBar绘制喜欢/不喜欢比例条与悬浮提示(tooltip); - 若用户点击了喜欢/不喜欢,通过事件监听与
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
相关推荐
Return YouTube Dislike 开放 API 使用指南:基于 RYD 扩展数据恢复 YouTube 点踩计数
Return YouTube Dislike 开放 API 使用指南:基于 RYD 扩展数据恢复 YouTube 点踩计数 Return YouTube Dis
开发工具Return YouTube Dislike 开放 API 实战指南:恢复 YouTube 踩数背后的数据接口与实现原理
Return YouTube Dislike 开放 API 实战指南:恢复 YouTube 踩数背后的数据接口与实现原理 Return YouTube Disl
开发工具Return YouTube Dislike 开放 API 接入指南:工作原理、投票数据获取与速率限制详解
Return YouTube Dislike 开放 API 接入指南:工作原理、投票数据获取与速率限制详解 本文以仓库根目录下的 READMEcn.md htt
开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考