CiteBeat

听见你引用的节拍 · Chrome 引用追踪扩展

View the Project on GitHub sci-m-wang/CiteBeat

CiteBeat

听见你引用的节拍。 一个极简的浏览器扩展,定时获取你的 Google Scholar / Semantic Scholar 总引用数,并一键查看本周期内引用有增长的论文。

icon

功能

安装

开发者模式加载

  1. 克隆本仓库:git clone https://github.com/sci-m-wang/CiteBeat.git
  2. 在仓库目录运行 ./pack.sh(会生成 dist/unpacked/ 目录)
  3. 打开 chrome://extensionsedge://extensions,启用”开发者模式”
  4. 点”加载已解压的扩展程序”,选择 dist/unpacked
  5. 首次安装会自动打开设置页

注意:不要直接加载仓库根目录。根目录下的 _config.yml(GitHub Pages 用) 以下划线开头,会被 Chromium 视为保留名并拒绝加载。pack.sh 会产出干净的扩展目录。

本地调试时尽量固定使用同一个 dist/unpacked 路径,并优先在扩展管理页点击 reload。 卸载重装或换目录加载可能导致 Chrome 分配不同扩展 ID,旧的 chrome.storage.local 数据不会自动迁移。需要保留历史时,请先在设置页导出备份。

从 Chrome Web Store 安装

(待上架后补充链接)

使用

  1. 点击扩展图标或右键 → “选项”,打开设置页
  2. 选择数据来源(Google Scholar 或 Semantic Scholar)
  3. 填入对应的作者 ID:
    • Google Scholar user id:个人主页 URL scholar.google.com/citations?user=XXX 中的 user= 参数
    • Semantic Scholar author id:作者页 URL semanticscholar.org/author/NAME/ID 末尾的数字 ID
  4. (可选)调整刷新间隔和统计周期
  5. 保存后会自动开始抓取。点击工具栏图标查看弹窗

数据管理

分享图

主页数据上报(可选)

用于把引用数据同步到你自己的个人主页。默认关闭,不配置就永远不会发送。 支持两种方式:

方式 适用场景 做法
自定义节点 主页有后端 / Serverless 函数 POST citation.snapshot JSON
GitHub Pages 主页是静态站点 通过 Contents API 把 JSON 提交进仓库

方式一:自定义节点

  1. 设置页 → “主页数据上报” → 勾选启用 → 上报方式选”自定义节点”
  2. 填写节点地址,例如 https://example.com/api/citations
  3. 需要鉴权时选 Bearer Token 并填入,会以 Authorization: Bearer <token> 发送
POST <你的节点地址>
Content-Type: application/json
X-CiteBeat-Schema: citation.snapshot/1
Authorization: Bearer <token>   # 仅在选择 Bearer 时

节点返回 2xx 视为成功。

方式二:GitHub Pages

静态站点没有后端可以接收 POST,所以扩展改为把 JSON 作为一次提交写进你的仓库,GitHub Pages 重新部署后主页即可读到。

  1. 上报方式选”GitHub Pages”
  2. 填用户名/组织、仓库名、分支(默认 main)、文件路径(默认 data/citations.json
  3. 创建 Token:GitHub → Settings → Developer settings → Fine-grained personal access token
    • Repository access:只选这一个仓库
    • Permissions → Repository permissions → Contents: Read and write
    • 其它权限都不需要
  4. 粘贴 Token → 点”测试” → 授权 https://api.github.com/*

扩展会先 GET 该文件拿 sha(不存在则创建),再 PUT 提交。若期间有其他提交导致 409,会重新取 sha 再试一次。

在主页里读取:

const res = await fetch('/data/citations.json');
const snap = await res.json();
document.querySelector('#citations').textContent = snap.metrics.citations;
document.querySelector('#hindex').textContent = snap.metrics.hIndex;

提交会计入仓库历史。建议把上报周期设为 1 天或更长,避免频繁提交刷屏。

按钮

载荷格式

{
  "schema": "citation.snapshot",
  "schemaVersion": 1,
  "generatedAt": "2026-06-13T16:00:00.000Z",
  "generator": { "name": "CiteBeat", "version": "0.3.1" },
  "source": {
    "provider": "scholar",
    "authorId": "xxxxxxxx",
    "profileUrl": "https://scholar.google.com/citations?user=xxxxxxxx",
    "fetchedAt": "2026-06-13T15:58:00.000Z"
  },
  "metrics": { "citations": 571, "hIndex": 12, "i10Index": 15, "paperCount": 40 },
  "period": { "mode": "manual", "startedAt": "2026-06-01T00:00:00.000Z", "citationDelta": 8 },
  "papers": [
    { "id": "xxx", "title": "论文标题", "citations": 42, "delta": 2, "url": "https://..." }
  ],
  "trend": [ { "at": "2026-06-10T00:00:00.000Z", "citations": 563 } ]
}

超时 15 秒,失败最多重试 3 次(仅对超时、429 和 5xx 重试)。

隐私边界

弹窗界面

权限说明

权限 用途
alarms 创建周期性刷新任务与可选的上报检查
storage 本地保存作者 ID、引用快照、统计周期起点、历史摘要和备份恢复数据
https://scholar.google.com/* 抓取本人公开的 Google Scholar 个人页
https://api.semanticscholar.org/* 调用 Semantic Scholar 官方 Graph API
optional_host_permissions 仅在启用上报并授权后,向你自填的节点地址发送快照

扩展不会读取其他任何页面,不会与第三方服务器通信,也不会收集任何用户识别信息。 唯一的对外发送是你主动配置并授权的上报节点。详见 PRIVACY.md

截图

popup options

已知限制

参与贡献

欢迎 issue / PR。小工具、轻维护,任何改进都欢迎:

许可证

基于 MIT 协议开源 © 2026 KinaMind。

人-Agent 协作归属与溯源元数据遵循 SymPro 0.1 协议,详见仓库内 .sympro/ 目录。SymPro 作为 MIT 的补充,不改变代码本身的许可。