书友会使用指南

这份指南适合第一次使用「英语阅读俱乐部」的同学。你可以把它当作一条完整路线:先配置词汇量和 Anki,再选书、制定阅读计划,最后在阅读中处理单词和短语。

网站地址:https://books-club.cn

这个工具能帮你做什么

英语原版书最难的地方通常不是“没有毅力”,而是不知道这本书对自己到底难在哪里。

书友会会根据你的词汇水平分析一本英文书,给出:

  • 当前词汇覆盖率:你大约能看懂多少词。
  • 待记忆词数:读这本书前,哪些词最值得先学。
  • 95% 核心词:为了把阅读顺畅度提高到约 95%,建议优先掌握的词。
  • 每日阅读计划:按每日词数或章节拆分阅读任务。
  • 阅读高亮:正文中直接标出生词、95% 核心词、COCA30000 未收录词和短语。
  • Anki 同步:把值得复习的单词、短语和例句送进 Anki。

简单说,它的目标不是让你背完所有生词,而是帮你知道:读这本书之前,最值得先掌握哪些词。

使用前准备

建议先准备好三样东西:

  1. 一个书友会账号。
  2. 桌面端 Anki,并安装 AnkiConnect 插件。
  3. 书友会配套的 Anki 卡牌包:COCA30000、短语、生词本。

如果你只想先体验在线阅读,可以先注册登录并选择一本官方书;如果你要把单词发送到 Anki,请按下面的 Anki 步骤配置。

第一次使用流程

1. 登录或注册

打开 https://books-club.cn,点击右上角「登录」或「注册」。

登录后,右上角会出现账户菜单,里面常用入口有:

  • 个人中心:设置词汇等级、阅读按钮、高亮显示、我的词库。
  • Anki配置:连接本机 Anki,配置 Deck、Model 和字段。
  • 待发送中心:移动端加入的词条,会在这里统一发送到 Anki。
  • 个人书库:查看正在阅读、私有图书、图书申请。

2. 设置个人词汇量

进入「个人中心」,先设置你的词汇量基准。系统会用这个基准计算每本书的覆盖率、生词量和阅读建议。

你可以选择两种登记方式:

  • 考试等级:如四级、六级等。
  • COCA 档位:如 COCA 3000、COCA 5000、COCA 10000 等。

如果不确定,从当前最接近你的水平开始即可。之后在书籍详情页也可以重新选择词汇基准,系统会重新计算这本书的覆盖率和推荐程度。

3. 导入或维护「我的词库」

「我的词库」用于记录你已经掌握或希望长期管理的词。你可以:

  • 导入 txt 词表。
  • 手动添加单词。
  • 删除已经不需要保留的词。
  • 在阅读时点击单词后加入词库。

词库越贴近你的真实水平,书籍难度分析越准确。

Anki 配置

Anki 同步依赖桌面端 Anki 和 AnkiConnect。请在需要发送卡片的电脑上完成这一节。

1. 下载并导入配套卡牌

资源位置:夸克网盘和百度网盘中都有配套卡牌。

建议至少导入:

  • COCA30000:用于更新已有高频词卡片的例句和出现次数。
  • 短语:用于保存阅读中遇到的短语。
  • 生词本:用于保存 COCA 外或你想单独积累的生词。

2. 安装 AnkiConnect 插件

打开 Anki,进入「工具」-「插件」-「安装插件」。

输入代码:2055492159

点击确定安装成功。

双击插件

安装后进入插件配置,把 webCorsOriginList 配置为允许书友会网站访问,直接复制下面的代码就可以:

{
  "apiKey": null,
  "apiLogPath": null,
  "ignoreOriginList": [],
  "webBindAddress": "127.0.0.1",
  "webBindPort": 8765,
  "webCorsOriginList": [
    "http://localhost",
    "https://read.tlpy8.com",
    "https://books-club.cn"
  ]
}

配置完成后,一定要重启 Anki。

3. 在网站里连接 Anki

登录网站后,打开「Anki配置」。

点击「测试连接并加载列表」。

连接成功后,网站会读取你 Anki 里的 Deck、Model 和字段列表,并尽量自动填入推荐配置。

重点检查三组配置:

  • 主卡片:通常对应 COCA30000 Deck 和 COCA30000 Model。
  • 短语卡片:通常对应 短语 Deck 和 短语 Model。
  • 生词本:通常对应 生词本 Deck 和 生词本 Model。

确认字段无误后,点击「保存配置」。

保存之后,就可以在阅读页把单词或短语发送到 Anki。

恭喜你🎉,到这里你已经配置成功了,下面就是阅读阶段了


选择一本书开始阅读

1. 从书库选书

进入「全部原版书」,可以按目标浏览:

  • 古登堡计划:公开经典原著。
  • 当代书:通常需要上传你自己拥有的同名 EPUB 后阅读。
  • 考试专区:备考类材料。

点击一本书进入详情页。

2. 看懂书籍详情页

书籍详情页主要看三块:

  • 词汇覆盖分析:全书字数、不重复词数、当前覆盖率、待记忆词数、达到 95% 还需词数。
  • 阅读推荐程度:根据你的覆盖率判断这本书现在是否适合读。
  • 阅读计划:选择按每日词数或按章节阅读,并查看每天的词数、生词数、核心词数。

如果这本书显示「上传后阅读」,说明平台不直接提供正文。你需要上传自己拥有的同名 EPUB,验证通过后即可阅读。

3. 加入正在阅读

打开某一天的阅读内容后,系统会记录你的阅读位置。以后可以从「个人书库」-「正在阅读」继续。

读完当天内容后,点击「完成阅读」,阅读计划会同步更新。

阅读页怎么用

阅读页是日常使用最多的地方。

1. 看高亮

正文里会根据你的设置标出不同类型的内容:

  • 非 core95 的不认识词:可以边读边查,不一定都要背。
  • 95% 核心词:优先级更高,建议重点处理。
  • COCA30000 未收录:可能是专名、低频词或书中特有表达。
  • 短语高亮:系统识别出的词组、短语或搭配。

如果觉得高亮太多,可以到「个人中心」-「阅读高亮显示」里关闭部分类型。

2. 使用「译」和「解」

阅读正文旁边可能出现两个快捷按钮:

  • 译:生成当前段落或标题的中文翻译。
  • 解:解释当前段落的难点、结构或含义。

「译」适合快速确认理解;「解」适合精读时拆句和理解难句。你可以在「个人中心」里设置只显示「译」、只显示「解」,或两个都显示。

3. 点击单词查词

点击正文中的单词,会打开单词弹窗。里面通常包括:

  • 这个词在本书出现的次数。
  • COCA 词频位置。
  • 考试标签。
  • 发音。
  • 原句和整句翻译。
  • 中文释义、英文释义和更多词典信息。

4. 三个单词按钮怎么选

桌面端单词弹窗里常见三个按钮:

发送到COCA

适合 COCA30000 里已经存在的词。

点击后,系统会在你的 COCA 卡片中更新这次阅读的例句,并记录出现次数。适合高频词、熟词新义、你想反复在原句中复习的词。

添加到我的词库

适合你已经认识、或决定以后视为已掌握的词。

加入后,它会进入网站的「我的词库」,后续阅读分析会更贴近你的真实词汇水平。

发送到生词本

适合 COCA 外的词、低频词、专门想整理的生词。

系统会把词典信息、释义、词性、例句等写入你的 Anki「生词本」卡片。

短语怎么处理

阅读页右侧有「学习侧栏」,里面有「短语」和「目录」两个标签。

在「短语」里可以看到当天检测到的短语,包括:

  • 短语本身。
  • 在正文里的匹配形式。
  • 出现次数。
  • 例句。
  • AI 解释。

如果短语有释义,可以点击「发送到 Anki」。移动端会显示为「加入待发送」,需要之后到桌面端统一发送。

移动端使用

移动端适合阅读、查词、加入待发送和同步进度。

移动端底部常用入口:

  • 阅读:查看书单和当前推荐。
  • 书架:继续正在阅读的书。
  • 我的:登录、会员、词汇本等个人功能。

移动端阅读时可以:

  • 调整字号。
  • 点击单词查词。
  • 把单词加入词汇本。
  • 标记当天阅读完成。
  • 上传自有 EPUB 解锁需要上传后阅读的书。

什么是「加入待发送」

手机通常不能直接连接你电脑上的 Anki,因为 AnkiConnect 运行在电脑本机的 127.0.0.1:8765

所以移动端点击「加入待发送」时,系统会先把单词或短语放进网站的待发送队列。等你回到电脑上,打开 Anki 和网站,再进入「待发送中心」统一发送。

待发送中心

进入网站右上角账户菜单,打开「待发送中心」。

这里会按类型分组:

  • COCA内:发送后更新 COCA30000 里已有的卡片。
  • COCA外:发送到生词本。
  • 短语:发送到短语卡片。

你可以切换「待发送」和「已发送」,也可以选择多个词条批量发送。

注意:真正发送到 Anki 时,请确保:

  • 正在使用电脑端。
  • Anki 已经打开。
  • AnkiConnect 插件已经启用。
  • 网站「Anki配置」已经保存成功。

会员功能说明

不同账号权益会影响可用功能:

  • 免费:浏览官方书库、阅读官方图书、查看基础词典释义、提交会员核销申请。
  • VIP:包含免费权益,可使用 AI 翻译、总结、短语语境解释,并管理个人书库。
  • SVIP:包含 VIP 权益,可使用 AI 解释,提交私有图书上传分析申请。

购买后进入「会员领取」,填写 B 站订单号或 B 站昵称/UID,也可以上传付款截图。管理员核对后会为当前账号开通权益。

常见问题

点击测试连接失败怎么办?

先检查四件事:

  1. Anki 是否已经打开。
  2. AnkiConnect 是否安装并启用。
  3. 插件配置里是否包含 https://books-club.cn
  4. 修改插件配置后是否已经重启 Anki。

为什么手机上不能直接发送到 Anki?

因为 AnkiConnect 只在你的电脑本机运行。手机无法访问电脑本机的 127.0.0.1:8765,所以移动端会先加入待发送队列,再由桌面端统一发送。

发送到COCA失败怎么办?

通常是 Anki 配置没有找到对应卡片。请检查:

  • 主卡片 Deck 是否选中 COCA30000
  • 主卡片 Model 是否选中 COCA30000
  • Word 字段是否对应卡片里的单词字段。
  • Anki 里是否确实有这个词或它的原型。

如果这个词本来就不是 COCA30000 中的词,可以改用「发送到生词本」。

我应该把所有生词都发到 Anki 吗?

不建议。

优先处理三类词:

  • 95% 核心词。
  • 在本书反复出现的词。
  • 你读到原句时觉得“以后还会用到”的表达。

低频、专名、只在这一页出现一次的词,可以先通过上下文理解,不一定马上制卡。

词汇量设置错了怎么办?

进入「个人中心」重新保存词汇等级,或在书籍详情页点击「词汇基准」重新选择。保存后系统会重新计算覆盖率、生词量和阅读建议。

推荐日常流程

  1. 打开「个人书库」继续正在阅读的书。
  2. 先看当天的词数、生词数和核心词数。
  3. 阅读正文,遇到关键生词再点开处理。
  4. 对高价值单词用「发送到COCA」或「发送到生词本」。
  5. 对有价值的短语先点「AI解释」,确认释义后发送到 Anki。
  6. 读完当天内容后点击「完成阅读」。
  7. 如果今天用手机加入了词条,晚上回到电脑端打开「待发送中心」批量发送。

这套流程的重点是:少做卡、多读书,把 Anki 用在真正值得复习的词和句子上。

短语牌组修改

 
<div class="phrase">
  {{Phrase}}
</div>
 
{{#Meaning}}
  <div class="section">
    <div class="label">Meaning</div>
    <div class="content">{{Meaning}}</div>
  </div>
{{/Meaning}}
 
{{#Image}}
  <div class="section">
    <div class="label">Image</div>
    <div class="content imgwrap" id="imgWrapPhrase">
      {{Image}}
    </div>
  </div>
{{/Image}}
 
{{#Examples}}
  <div class="section">
    <div class="label">Examples</div>
    <ul class="examples">
      <li>{{Examples}}</li>
    </ul>
  </div>
{{/Examples}}
 
<script>
  (function () {
    function normalizeUrl(url) {
      return (url || "").trim().replace(/["'<>),]+$/g, "");
    }
 
    function isLikelyImageUrl(url) {
      if (!url) return false;
 
      var cleanUrl = normalizeUrl(url);
 
      if (/\.(png|jpe?g|gif|webp|bmp|svg)(\?[^\s]*)?$/i.test(cleanUrl)) {
        return true;
      }
 
      try {
        var parsed = new URL(cleanUrl, window.location.href);
        var host = (parsed.hostname || "").toLowerCase();
        var path = (parsed.pathname || "").toLowerCase();
        var hintText = host + path + (parsed.search || "").toLowerCase();
 
        if (!/^https?:$/i.test(parsed.protocol)) return false;
        if (/\/images?(\/|$|\?)/i.test(path)) return true;
        if (/^th\.bing\.com$/i.test(host) && /^\/th\/id\//i.test(path)) return true;
        if (/image|img|photo|pic|thumb|thumbnail|media|asset|static|upload|cdn|gstatic|googleusercontent/.test(hintText)) {
          return true;
        }
      } catch (e) {
        return false;
      }
 
      return false;
    }
 
    function createFallbackLink(url) {
      var link = document.createElement("a");
 
      link.href = url;
      link.target = "_blank";
      link.rel = "noopener noreferrer";
      link.className = "extlink";
      link.textContent = url;
 
      return link;
    }
 
    function createImageOrLink(url) {
      var cleanUrl = normalizeUrl(url);
 
      if (!cleanUrl) return document.createTextNode("");
 
      if (!isLikelyImageUrl(cleanUrl)) {
        return createFallbackLink(cleanUrl);
      }
 
      var img = document.createElement("img");
 
      img.src = cleanUrl;
      img.alt = "image";
      img.loading = "lazy";
      img.referrerPolicy = "no-referrer";
 
      img.onerror = function () {
        img.replaceWith(createFallbackLink(cleanUrl));
      };
 
      return img;
    }
 
    function fixMedia(wrapId) {
      var wrap = document.getElementById(wrapId);
 
      if (!wrap) return;
 
      var nodes = Array.from(wrap.childNodes);
 
      nodes.forEach(function (node) {
        if (node.nodeType !== Node.TEXT_NODE) return;
 
        var text = node.textContent;
 
        if (!text || !text.trim()) return;
 
        var frag = document.createDocumentFragment();
        var regex = /https?:\/\/[^\s"'<>]+/ig;
        var match;
        var lastIndex = 0;
        var hasMatch = false;
 
        while ((match = regex.exec(text)) !== null) {
          hasMatch = true;
 
          var url = normalizeUrl(match[0]);
 
          frag.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));
          frag.appendChild(createImageOrLink(url));
 
          lastIndex = match.index + match[0].length;
        }
 
        if (hasMatch) {
          frag.appendChild(document.createTextNode(text.slice(lastIndex)));
          node.replaceWith(frag);
        }
      });
 
      var links = Array.from(wrap.querySelectorAll("a[href]"));
 
      links.forEach(function (link) {
        var url = normalizeUrl(link.getAttribute("href"));
 
        if (!isLikelyImageUrl(url)) return;
 
        link.replaceWith(createImageOrLink(url));
      });
    }
 
    fixMedia("imgWrapPhrase");
  })();
</script>
/* ===== Global ===== */
 
.card {
  font-family:
    -apple-system,
    BlinkMacSystemFont,
    "Segoe UI",
    Arial,
    "PingFang SC",
    "Hiragino Sans GB",
    "Microsoft YaHei",
    sans-serif;
  font-size: 20px;
  line-height: 1.65;
  color: #1f2933;
  background: linear-gradient(180deg, #f7f8fb 0%, #eef1f5 100%);
  padding: 26px 18px;
  box-sizing: border-box;
}
 
/* ===== Card Container Feel ===== */
 
.card > * {
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
}
 
/* ===== Phrase ===== */
 
.phrase {
  font-size: 32px;
  font-weight: 800;
  text-align: center;
  margin-bottom: 26px;
  color: #111827;
  letter-spacing: -0.02em;
  line-height: 1.25;
}
 
/* ===== Sections ===== */
 
.section {
  background: rgba(255, 255, 255, 0.96);
  border-radius: 18px;
  padding: 18px 20px;
  margin-bottom: 18px;
  box-shadow:
    0 10px 28px rgba(15, 23, 42, 0.08),
    0 2px 6px rgba(15, 23, 42, 0.04);
  border: 1px solid rgba(226, 232, 240, 0.9);
}
 
/* ===== Label ===== */
 
.label {
  display: inline-flex;
  align-items: center;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #64748b;
  margin-bottom: 10px;
}
 
.label::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: #94a3b8;
  margin-right: 8px;
}
 
/* ===== Content ===== */
 
.content {
  font-size: 20px;
  color: #243040;
  white-space: pre-line;
}
 
/* ===== Image ===== */
 
.imgwrap {
  margin-top: 10px;
  text-align: center;
  white-space: normal;
}
 
.imgwrap img {
  display: block;
  max-width: 100%;
  max-height: 280px;
  margin: 8px auto 2px;
  border-radius: 16px;
  object-fit: contain;
  box-shadow: 0 8px 22px rgba(15, 23, 42, 0.14);
}
 
.extlink {
  display: inline-block;
  margin-top: 6px;
  padding: 8px 10px;
  border-radius: 10px;
  background: #f1f5f9;
  color: #2563eb;
  font-size: 14px;
  line-height: 1.45;
  word-break: break-all;
  text-decoration: none;
}
 
.extlink:hover {
  text-decoration: underline;
}
 
/* ===== Examples ===== */
 
.examples {
  margin: 8px 0 0 0;
  padding: 0;
  list-style: none;
}
 
.examples li {
  position: relative;
  font-size: 19px;
  color: #374151;
  margin-bottom: 8px;
  padding-left: 18px;
}
 
.examples li::before {
  content: "›";
  position: absolute;
  left: 0;
  top: 0;
  color: #94a3b8;
  font-weight: 700;
}
 
/* ===== Mobile ===== */
 
@media (max-width: 480px) {
  .card {
    padding: 20px 14px;
    font-size: 18px;
  }
 
  .phrase {
    font-size: 28px;
    margin-bottom: 22px;
  }
 
  .section {
    border-radius: 16px;
    padding: 16px 17px;
  }
 
  .content {
    font-size: 18px;
  }
 
  .examples li {
    font-size: 17px;
  }
 
  .imgwrap img {
    max-height: 240px;
  }
}
 
/* ===== Dark Mode ===== */
 
.nightMode .card,
body.nightMode .card {
  background: linear-gradient(180deg, #0f1115 0%, #171a21 100%);
  color: #e5e7eb;
}
 
.nightMode .section,
body.nightMode .section {
  background: rgba(31, 35, 45, 0.96);
  border: 1px solid rgba(75, 85, 99, 0.65);
  box-shadow:
    0 10px 26px rgba(0, 0, 0, 0.35),
    0 1px 4px rgba(0, 0, 0, 0.25);
}
 
.nightMode .phrase,
body.nightMode .phrase {
  color: #f9fafb;
}
 
.nightMode .label,
body.nightMode .label {
  color: #9ca3af;
}
 
.nightMode .label::before,
body.nightMode .label::before {
  background: #6b7280;
}
 
.nightMode .content,
body.nightMode .content {
  color: #e5e7eb;
}
 
.nightMode .examples li,
body.nightMode .examples li {
  color: #d1d5db;
}
 
.nightMode .examples li::before,
body.nightMode .examples li::before {
  color: #6b7280;
}
 
.nightMode .imgwrap img,
body.nightMode .imgwrap img {
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
}
 
.nightMode .extlink,
body.nightMode .extlink {
  background: #111827;
  color: #93c5fd;
}