Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: [main, agent/community-api]
branches: [main]
pull_request:

permissions:
Expand All @@ -12,8 +12,8 @@ jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
cache: npm
Expand All @@ -24,6 +24,7 @@ jobs:
node --check popup.js
node --check options.js
node scripts/validate-extension.mjs
node scripts/test-extension-logic.mjs
- name: Install Worker dependencies
working-directory: server
run: npm ci
Expand Down
19 changes: 16 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,23 @@ jobs:
package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
- uses: actions/setup-node@v5
with:
node-version: 22
cache: npm
cache-dependency-path: server/package-lock.json
- name: Verify tag and extension
run: |
git fetch origin main
git merge-base --is-ancestor "$GITHUB_SHA" origin/main
node --check content.js
node --check popup.js
node --check options.js
node scripts/validate-extension.mjs
node scripts/test-extension-logic.mjs
node -e "const v=require('./manifest.json').version;if(process.env.GITHUB_REF_NAME!=='v'+v)throw new Error('Tag 与 manifest 版本不一致')"
- name: Test Worker
working-directory: server
Expand All @@ -32,7 +40,12 @@ jobs:
cp icons/icon-16.png icons/icon-32.png icons/icon-48.png icons/icon-128.png dist/douyin-ad-skipper/icons/
cd dist/douyin-ad-skipper
zip -r ../douyin-ad-skipper-${GITHUB_REF_NAME}.zip .
- name: Validate package and create checksum
run: |
node scripts/validate-package.mjs dist/douyin-ad-skipper
shasum -a 256 "dist/douyin-ad-skipper-${GITHUB_REF_NAME}.zip" > "dist/douyin-ad-skipper-${GITHUB_REF_NAME}.zip.sha256"
node scripts/extract-release-notes.mjs "$GITHUB_REF_NAME" dist/release-notes.md
- name: Publish GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: gh release create "$GITHUB_REF_NAME" "dist/douyin-ad-skipper-${GITHUB_REF_NAME}.zip" --generate-notes --verify-tag
run: gh release create "$GITHUB_REF_NAME" "dist/douyin-ad-skipper-${GITHUB_REF_NAME}.zip" "dist/douyin-ad-skipper-${GITHUB_REF_NAME}.zip.sha256" --notes-file dist/release-notes.md --verify-tag
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# 更新日志

## 0.7.0 - 2026-08-15

- 产品统一为“抖音网页版社区片段助手”,移除页面广告标签识别和整条视频自动翻页,只处理普通作品时间轴中的用户标记片段。
- 社区共享改为首次明确选择;未同意或选择仅本地时,不查询公共 API,也不生成社区贡献身份。
- 移除任意 HTTPS 可选权限和自定义 API 普通入口,公共版只允许访问抖音网页与项目公共 API。
- 普通跳过通知关闭后,手动跳过按钮、提交错误和社区反馈错误仍会正常显示。
- 社区查询失败改为 5 秒、15 秒、60 秒和 5 分钟逐级重试,不再把失败结果缓存 10 分钟。
- 查询结果标记自己的投稿;自己的片段不再显示赞成、反对和举报按钮,旧服务端返回的错误码也会转换为明确提示。
- 投稿请求 ID 写入 D1 并增加唯一约束,同一匿名贡献者的网络重试不会重复创建片段。
- 发布流程新增前端行为契约、标签主分支校验、ZIP 内容校验、SHA-256 校验文件和基于更新日志的 Release 说明。

## 0.6.4 - 2026-08-12

- 重构播放器提交窗口,按片段信息、分类、主要定位、精确编辑和提交操作分层布局,改善窄播放器中的拥挤和遮挡。
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 参与贡献

感谢你帮助改进抖音广告跳过。项目目前处于早期实验阶段,抖音网页结构变化频繁,小而可验证的改动最容易合并。
感谢你帮助改进抖音网页版社区片段助手。项目目前处于早期实验阶段,抖音网页结构变化频繁,小而可验证的改动最容易合并。

## 开始之前

Expand Down
12 changes: 7 additions & 5 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
# 隐私说明

最后更新:2026-08-12
最后更新:2026-08-15

## 当前版本(v0.6.4
## 当前版本(v0.7.0

扩展只在 `https://www.douyin.com/*` 页面运行,并使用 Chrome `storage` 权限保存:

- 功能开关;
- 累计跳过次数;
- 尚未提交的本地草稿(作品 ID、片段起止时间、标题、作者、作品链接和创建时间)。

功能开关、累计跳过次数和未提交草稿保存在 Chrome 扩展本地存储中。匿名贡献者 ID 保存在 Chrome 同步存储中,以便同一 Chrome 账号在其他电脑识别自己的社区贡献。已提交片段存放在社区服务器,不再重复保存在本地。社区共享功能可随时在选项页关闭。关闭时:
功能开关、累计跳过次数和未提交草稿保存在 Chrome 扩展本地存储中。首次使用时,用户必须明确选择是否启用社区共享;选择仅本地或撤回同意时不会查询社区 API。只有同意社区共享后,扩展才会生成匿名贡献者 ID 并保存到 Chrome 同步存储,以便同一 Chrome 账号在其他电脑识别自己的社区贡献。已提交片段存放在社区服务器,不再重复保存在本地。

社区共享关闭时:

- 不向项目维护者或第三方服务器发送数据;
- 不收集 Cookie、登录凭据或账号私信;
Expand All @@ -31,10 +33,10 @@
- 选项页会通过匿名贡献者 ID 拉取该用户已提交的片段和累计贡献时长;
- 社区片段成功跳过且未立即撤销时,会上传片段 ID;服务器按匿名贡献者哈希、片段和日期去重,用于统计实际帮助人数、跳过次数和节省时间;
- 提供完全关闭远程查询与提交的选项;
- 实际服务器运营者仍需自行公布基础设施日志的保留期限和删除方式
- 社区片段、投票、举报和去重后的帮助统计会在公共服务运营期间保存,或在合法删除请求处理后移除;应用层限流记录会抽样清理超过 48 小时的桶

作品 ID 的 SHA-256 哈希用于减少查询时直接暴露原始 ID,但作品 ID 的取值空间有限,哈希不应被理解为完全匿名或不可反查。公共社区 API 会对写入请求同时按匿名身份哈希与来源 IP 哈希限流;限流记录仅用于防滥用,应用数据库会抽样清理超过 48 小时的限流桶。Cloudflare 基础设施日志的保存与处理还受 Cloudflare 服务配置和政策约束。

匿名贡献者 ID 不是登录账号或安全凭证。能够读取 Chrome 同步数据的人可能以同一匿名身份查询贡献记录,因此扩展不会使用该 ID 保存 Cookie、密码、支付资料或其他敏感信息。

如发现隐私问题,请按照 [SECURITY.md](SECURITY.md) 私下报告。
如需更正或删除自己提交的公共片段,可在 GitHub Issue 中只提供片段 ID;不要公开匿名贡献者 ID、IP、Cookie 或其他敏感信息。如发现隐私或安全问题,请按照 [SECURITY.md](SECURITY.md) 私下报告。
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 抖音网页版社区片段助手(Douyin Ad Skipper
# 抖音网页版社区片段助手(Douyin Community Segment Assistant

一个非官方、开源、社区驱动的浏览器扩展,用于在抖音网页版中标记视频内部的赞助、自我推广、互动提醒等可选片段,并按照用户选择显示或跳过这些片段。

Expand All @@ -14,7 +14,7 @@
- 在抖音播放器控制栏内创建视频片段的起止时间。
- 在播放器进度条中显示已标记片段:待提交为深绿色,已提交/可信片段为亮绿色。
- 再次播放同一作品时自动跳过本地草稿或社区片段。
- 可从播放器内的提交菜单把待提交片段发送到自建社区服务
- 可从播放器内的提交菜单把待提交片段发送到项目公共社区服务
- 在选项页查看本地草稿、云端片段和累计贡献时长。
- 导入、导出本地数据。
- 未提交草稿留在本地;已提交片段以社区服务器为准,不上传完整浏览记录。
Expand All @@ -28,15 +28,15 @@
5. 选择本仓库根目录。
6. 打开或刷新 `https://www.douyin.com/`。

也可以从 GitHub Releases 下载自动生成的 Chrome ZIP,解压后按上述方式加载。Release 标签必须与 `manifest.json` 版本一致,例如版本 `0.6.4` 使用标签 `v0.6.4`。
也可以从 GitHub Releases 下载自动生成的 Chrome ZIP,解压后按上述方式加载。Release 标签必须与 `manifest.json` 版本一致,例如版本 `0.7.0` 使用标签 `v0.7.0`。

## 创建片段

播放器底部清晰度按钮左侧会显示片段标记图标:

1. 可选片段开始时点击“片段从当前开始”。
2. 图标切换为红色取消按钮和青色结束按钮。
3. 广告结束时点击“片段现在结束”,片段先作为本地草稿保存,并以深绿色显示在进度条上。
3. 片段结束时点击“片段现在结束”,片段先作为本地草稿保存,并以深绿色显示在进度条上。
4. 此时控制栏会出现“提交”和“删除最后一个未提交片段”按钮;点击提交会打开播放器内菜单。
5. 在提交菜单使用“片段开头”“片段结尾”和“精确编辑”校准边界,再逐段点击“预览”;播放器实际越过片段末尾后才允许提交。
6. 提交成功后本地草稿会删除,亮绿色片段和管理列表从社区服务读取。
Expand All @@ -53,7 +53,7 @@

## 社区共享

扩展默认连接项目公共社区 API,普通用户安装后即可查询和提交。新片段提交成功后立即供其他用户使用,投票与举报用于事后纠错:
首次使用时,扩展会让用户明确选择“启用社区”或“仅本地”。只有同意后才会连接项目公共 API;新片段提交成功后立即供其他用户使用,投票与举报用于事后纠错:

扩展会把随机匿名贡献者 ID 保存到 Chrome 同步存储;使用同一 Chrome 账号安装扩展后,可在另一台电脑看到自己的云端片段与贡献统计。服务器只保存该 ID 的加盐哈希。

Expand All @@ -65,7 +65,7 @@
错误片段被降权或隐藏
```

服务端实现位于 `server/`,包含重复片段检测、投票、举报与限流。高级用户仍可在选项中连接自建 API。详见 [服务端说明](server/README.md)、[路线图](docs/ROADMAP.md) 和 [API 草案](docs/API.md)。
服务端实现位于 `server/`,包含幂等提交、重复片段检测、投票、举报与限流。公共扩展固定连接项目公共 API;需要自建服务的开发者可以在自己的源码分支中替换地址和清单权限。详见 [服务端说明](server/README.md)、[路线图](docs/ROADMAP.md) 和 [API 草案](docs/API.md)。

## 项目结构

Expand All @@ -82,7 +82,7 @@

## 隐私

社区查询默认启用并连接项目公共 API,也可随时关闭或改用自建服务。扩展只查询当前作品 ID,并且仅在你主动点击提交时上传片段起止时间。完整说明见 [PRIVACY.md](PRIVACY.md)。
社区查询默认关闭。用户明确同意后,扩展才会使用当前作品 ID 的 SHA-256 哈希查询公共 API;仅在主动点击提交时上传作品 ID 和片段时间。完整说明见 [PRIVACY.md](PRIVACY.md)。

## 使用边界

Expand All @@ -98,7 +98,7 @@

本项目的大部分代码与文档由维护者在 AI 辅助下完成,并经过人工确认与测试。AI 生成内容仍可能存在疏漏,因此问题报告、代码审查和真实使用反馈尤其重要。提交代码前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md),安全或隐私问题请按照 [SECURITY.md](SECURITY.md) 私下反馈,不要公开披露敏感细节。

每次推送和 Pull Request 都会运行扩展语法、清单约束、Worker 测试和 TypeScript 检查;推送 `v版本号` 标签后会自动生成不含服务器配置的 Chrome ZIP,并发布到 GitHub Releases
每次推送和 Pull Request 都会运行扩展语法、权限与行为契约、Worker 测试和 TypeScript 检查;推送 `v版本号` 标签后会验证标签来自主分支,生成不含服务器配置的 Chrome ZIP、SHA-256 校验文件和对应版本说明

## 许可证

Expand Down
12 changes: 9 additions & 3 deletions content.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
top: 76px;
left: 50%;
z-index: 2147483647;
padding: 10px 16px;
display: flex;
max-width: min(760px, calc(100vw - 32px));
align-items: center;
gap: 12px;
padding: 11px 14px;
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 999px;
border-radius: 12px;
color: #fff;
background: rgba(22, 24, 29, 0.92);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.3);
Expand All @@ -16,6 +20,8 @@
transition: opacity 160ms ease, transform 160ms ease;
}

#das-toast > span:first-child { min-width:0; overflow-wrap:anywhere; }

#das-toast.das-visible {
opacity: 1;
transform: translate(-50%, 0);
Expand Down Expand Up @@ -178,7 +184,7 @@
.das-submission-actions { grid-template-columns:1fr; }
}

.das-toast-actions { display:flex; gap:6px; margin-left:12px; pointer-events:auto; }
.das-toast-actions { display:flex; flex:none; flex-wrap:wrap; gap:6px; pointer-events:auto; }
.das-toast-actions button { padding:4px 8px; border:1px solid rgba(255,255,255,.24); border-radius:6px; color:#fff; background:rgba(255,255,255,.1); cursor:pointer; }
.das-toast-actions button:hover { border-color:#25f4ee; color:#25f4ee; }
.das-toast-actions button:disabled { opacity:.55; cursor:default; }
Loading