← 全部文章

教程

用 CSS 和 JavaScript 移除软付费墙

有些付费墙把整篇文章发给你,然后把它藏在一个灰色遮罩层后面,并锁住页面让你无法滚动。文字已经在你的浏览器里 —— 你只是读不到它。本文介绍如何用 CSS 和 JavaScript 移除那个遮罩层。先讲一个重要的区分,再说一段关于伦理的诚实提示。

软付费墙与硬付费墙

这一点很重要,所以先读它。

本文讲软付费墙 —— 恢复那些已经待在你浏览器里的文字的可见性。你无法绕过硬付费墙,也不应该尝试。

关于伦理与法律的诚实提示

优质新闻的生产是要花钱的。软付费墙是发行方押注「唠叨」比「封锁」更有效。在你自己的浏览器里给页面重新换皮是合法的 —— 这与让广告拦截器和阅读模式得以存在的是同一种权利 —— 但合法并非故事的全部。

做一个体面的读者:如果你依赖某家刊物,就订阅它。把这些技巧用在偶尔的一次性文章、用于无障碍访问,或读朋友发给你的东西 —— 而不是当作再也不为新闻付费的手段。被你抽走资金的新闻编辑部最终会关门。

找出是什么藏起了文章

打开 DevTools 的 Elements 面板。软付费墙用一小套把戏,通常是组合使用:

点一点遮罩元素,读它的计算样式。记下类名 —— 你接下来要瞄准它们。

移除遮罩层

遮罩层是叠在最上面的一个独立元素。用 CSS 把它隐藏:

/* Common paywall overlay class and ID patterns */
.paywall,
.paywall-overlay,
.subscription-wall,
.piano-overlay,
.tp-modal,
.tp-backdrop,
[class*="paywall" i],
[class*="metering" i],
[id*="paywall" i] {
  display: none !important;
}

i 标志做大小写不敏感的属性匹配,就像处理 cookie 横幅时那样。先宽泛起手,如果误伤了什么再收紧到具体的类。

解锁 body 滚动

如果页面仍然被冻住,隐藏遮罩层就毫无意义。软付费墙锁住滚动,让你够不到隐藏的文字。把它强行恢复:

/* Restore normal scrolling */
html, body {
  overflow: auto !important;
  position: static !important;
  height: auto !important;
}

如果某个脚本不断重新施加锁定,一条小小的 JS 规则可以靠循环清除内联样式来打败它:

// Re-assert scrolling against a script that keeps locking it
setInterval(() => {
  document.documentElement.style.overflow = 'auto';
  document.body.style.overflow = 'auto';
  document.body.style.position = 'static';
}, 400);

去掉文字的模糊

许多付费墙让前两段保持清晰,把其余部分模糊掉作为引子。文字完全在那里 —— 只是失焦了。移除那个 filter:

/* Kill the blur teaser */
.article-body,
.article-content,
[class*="blur" i],
[class*="fade" i] {
  filter: none !important;
  -webkit-filter: none !important;
}

如果模糊落在某个特定的子元素上,检查它并瞄准那个确切的类 —— 一刀切的 * { filter: none } 可能破坏页面其他地方正当的效果。

移除 max-height 钳制

另一个经典引子:文章容器有一个 max-heightoverflow: hidden,于是你看到顶部和一段渐变淡出。把钳制解除:

/* Unclamp the article so the full text shows */
.article-body,
.post-content,
[class*="article" i][class*="clamp" i],
[class*="gated" i] {
  max-height: none !important;
  overflow: visible !important;
  -webkit-mask-image: none !important;
  mask-image: none !important;
}

/* Remove the gradient fade element if it is a separate node */
.content-fade,
[class*="gradient-fade" i] {
  display: none !important;
}

整合成一条规则

每家发行方用的组合略有不同。在 JustZix 里高效的做法是每个站点一条规则,作用域收紧:

  1. 创建一条规则,URL 模式为 https://news.example.com/*
  2. 把遮罩层、解锁滚动、去模糊和解钳制的 CSS 粘进 CSS 标签。
  3. 只有当某个脚本不断重新锁定页面时,才加上解锁滚动的 JS。
  4. 把这些规则放在一个叫「阅读」的文件夹里,方便你作为一组来审查和禁用。

因为规则限定在一个域,它绝不会影响一个你宁愿干脆订阅的站点。

另见

对于偶尔藏在软遮罩层后面的文章,安装 JustZix 并写一条限定范围的规则。如果你经常读某家刊物 —— 就为它付费。那才是让文章源源不断的东西。

为这篇文章评分

暂无评分 — 成为第一个。

自己动手试试

安装 JustZix,粘贴本文中的任意代码片段。两分钟,从零到一条在你所有设备上生效的规则。

获取 JustZix

功能 · 工作原理 · 示例 · 应用场景