ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

源码深度解读:bypass-paywalls-clean-filters 用户脚本的核心实现原理

源码深度解读:bypass-paywalls-clean-filters 用户脚本的核心实现原理 源码深度解读bypass-paywalls-clean-filters 用户脚本的核心实现原理【免费下载链接】bypass-paywalls-clean-filters项目地址: https://gitcode.com/gh_mirrors/by/bypass-paywalls-clean-filters想免费阅读新闻网站上的付费文章bypass-paywalls-clean-filters 就是一套开源的绕过付费墙方案它由广告拦截过滤规则与用户脚本双引擎组成。本文不讨论怎么偷内容而是带你从源码层面看懂它如何精准识别并解除新闻网站的付费墙Paywall限制——这套实现原理对任何想理解前端反爬、DOM 操作与油猴脚本UserScript开发的开发者都是一份极佳的学习样本。项目整体架构过滤器 用户脚本的双引擎设计这个仓库的结构非常清晰只有两个核心部分文件作用bpc-paywall-filter.txtuBlock Origin / AdGuard 兼容的广告拦截规则负责堵拦截计费脚本、删除 Cookie、剥离锁定样式userscript/目录下的 7 个脚本负责疏深度修复特定站点的 DOM、重建被隐藏的文章正文为什么需要两套机制因为很多网站的付费墙是纯前端实现——正文明明已经加载到 HTML 里只是被 CSS、class 或 JS 锁住了。过滤规则负责外科手术式的拦截用户脚本则负责更精细的器官移植。仓库内按语言分出了 7 个用户脚本userscript/bpc.en.user.js英语、bpc.de.user.js德语、bpc.fr.user.js法语、bpc.it.user.js意大利语、bpc.nl.user.js荷兰语、bpc.fi.se.user.js芬兰语/瑞典语、bpc.es.pt.user.js西班牙语/葡萄牙语针对不同语系媒体做定制修复。用户脚本的运行环境元数据里的玄机打开userscript/bpc.en.user.js开头你会看到一段标准的 UserScript 元数据块这是理解整个脚本的钥匙match *://*.com/*等规则声明脚本在哪些域名下运行相当于上岗许可证connect archive.fo、connect webcache.googleusercontent.com等授权脚本跨域请求存档站点这是后面兜底方案能工作的前提grant GM.xmlHttpRequest申请油猴的高级跨域请求权限。元数据之后整个脚本被包在一个 IIFE立即执行函数里并开启use strict严格模式避免污染全局作用域。核心机制一域名路由分发——if/else 的优雅暴力脚本最朴素也最核心的设计是一个超长的if / else if链按域名把世界媒体分组处理if (matchDomain(nzherald.co.nz)) { // 新西兰先驱报把 isPremium 标记改为 false } else if (matchDomain([thehindu.com, thehindubusinessline.com])) { // 印度教报系清掉 Adblock 检测与订阅状态 }其中matchDomain是路由分发的核心函数见userscript/bpc.en.user.js3911 行附近function matchDomain(domains, hostname) { var matched_domain false; if (!hostname) hostname window.location.hostname; if (typeof domains string) domains [domains]; domains.some(domain (hostname domain || hostname.endsWith(. domain)) (matched_domain domain)); return matched_domain; }它既支持单域名字符串也支持域名数组还能通过endsWith匹配子域名——比如thestar.com与www.thestar.com都能命中。脚本中还预定义了大量的媒体集团域名组如usa_gannett_domains甘尼特报团、usa_tribune_domains论坛报集团等同一集团站点往往共用同一套付费墙技术因此可以合并处理这也是代码能保持精简的秘诀。核心机制二Cookie 清理——重置阅读计数最常见的付费墙是计量墙Metered Paywall免费读者可读 N 篇文章超出即锁定。原理就是靠 Cookie 或 localStorage 计数。脚本的反制手段简单粗暴——直接删 Cookiefunction setCookie(names, value, domain , path /, days 0) { var max_age days * 24 * 60 * 60; // 支持字符串、数组与正则三种匹配方式 // ... 写入空值 max-age0 使 Cookie 立即过期 window.localStorage.clear(); // 顺带清空本地存储 }比如对澳洲 Crikey 系网站一行setCookie(blaize_session, , domain, /, 0)就把计量会话重置了。在过滤规则文件bpc-paywall-filter.txt里同类操作由 uBlock 的 scriptlet 完成例如artforum.com##js(cookie-remover, /^/) apollo-magazine.com##js(cookie-remover, blaize_session)cookie-remover是 uBlock Origin 内置的脚本注入器等价于在页面里执行删除 Cookie 的 JS。这展示了规则文件 用户脚本两条腿走路的协同方式。核心机制三DOM 清洗——剥掉锁定层的衣服很多付费墙并不删除正文而是给正文容器加一个锁定 class如content-locked再配一个遮罩层。脚本要做的是把衣服脱掉removeDOMElement(...elements)直接移除遮罩、横幅、广告容器hideDOMElement(...elements)给元素强加display:none !importantremoveClassesByPrefix(el, prefix)/removeClassesList(list)按前缀批量剥离锁定 classclearPaywall(paywall, paywall_action)按配置选择删元素还是删 class/attribute。规则文件里的对应写法更简洁直接用 uBlock 的 cosmetic filteringcitywire.com##js(rc, article-locked, .article-locked) bloomberg.com##js(ra,>function waitDOMElement(selector, tagName , callback, multiple false) { new window.MutationObserver(function (mutations) { for (let mutation of mutations) { for (let node of mutation.addedNodes) { if (node.matches(selector)) { callback(node); if (!multiple) this.disconnect(); } } } }).observe(document, { subtree: true, childList: true }); }只要目标节点一出现就立刻执行回调处理完自动断开监听性能开销极小。这是处理 SPA单页应用和延迟渲染站点如纽约时报、Medium的关键技术。核心机制五页面级注入——绕过页面自己的反制某些站点会检测脚本是否运行在页面上下文比如通过window.Adblock之类的全局标记。此时用户脚本的沙箱环境反而成了障碍insert_script应运而生userscript/bpc.en.user.js4414 行function insert_script(func, insertAfterDom) { let script document.createElement(script); script.setAttribute(id, bpc_script); script.appendChild(document.createTextNode(( func )();)); (insertAfterDom || document.body || document.head).appendChild(script); }它把函数序列化为字符串动态创建script标签插入页面让代码在页面自身的 JS 上下文中执行——比如直接改写window.Fusion.globalContent.isPremium false从数据源头解除锁定比操作 DOM 更彻底。核心机制六内容重建——从 JSON 里捞回正文最硬核的一招当正文被彻底移除时脚本直接从页面内嵌的 JSON 数据里把文章内容重新解析出来。getArticleJsonScript会查找application/ldjson类型的脚本标签getArticleQuintype则针对 Quintype 内容平台印度多家媒体使用解析#static-page中的结构化数据把 text、title、image、tweet、YouTube 视频等元素逐一重建为 HTML。对于使用 WordPress REST API 的站点getJsonUrlText会直接fetch文章的 JSON 接口let json_url window.location.origin /wp-json/wp/v2/posts/ article_id; fetch(json_url).then(response { /* 解析 json.content.rendered 并注入页面 */ });拿到 JSON 后用DOMParser解析再通过getJsonUrlAdd把重建的正文替换进文章容器。这一整套数据层恢复逻辑见userscript/bpc.en.user.js4425 至 4560 行展示了如何绕过 UI 层直接从数据源取回内容——堪称整份源码最精彩的部分。核心机制七兜底方案——外部存档链接当以上手段全部失效脚本会在文章顶部插入一个红色提示条提供外部镜像链接archive.today 存档getArchive/archiveLink、Google 网页快照googleWebcacheLink、Freedium / ReadMediumMedium 专用等。archiveRandomDomain还会随机挑选archive.fo / archive.is / archive.li等镜像域名规避单点封禁。有趣的是randomIP函数——它生成随机 IP 字符串用于配合某些对请求频率敏感的存档服务。这些细节体现了项目对反反爬生态的深入理解。附加能力AMP 页面重定向AMP加速移动页面经常被当作付费墙的后门——AMP 版文章往往不带计量限制。脚本的amp_redirect会检测 AMP 页面并跳转到对应的 canonical原始地址ampToHtml则反向操作把某些站点重定向回非 AMP 版本。amp_images_replace/amp_iframes_replace还会把amp-img、amp-iframe替换为标准 HTML 标签保证内容完整渲染。过滤规则里的宝藏scriptlet 用法速查bpc-paywall-filter.txt虽然只有 700 多行却浓缩了 uBlock Origin scriptlet 的各种实战用法scriptlet作用示例cookie-remover删除指定 Cookieadweek.com##js(cookie-remover, blaize_session)rc移除 classelespanol.com##js(rc, content-not-granted-paywall, ...)ra移除属性bizjournals.com##js(ra, style, .paywalled-content[style], stay)set-local-storage-item清空 localStorage 键值csmonitor.com##js(set-local-storage-item, /^/, $remove$)json-prune删除 JSON 响应字段gadget.pico.tools##js(json-prune, locked)set覆盖全局变量dagsavisen.no##js(set, window.Fusion.globalContent..., 0)配合||piano.io/xbuilder/experience/execute$xmlhttprequest,third-party这类网络请求拦截规则可以在请求层面直接掐断计费系统的数据上报。总结一套值得反复研读的前端反制范本回看整个 bypass-paywalls-clean-filters 项目它的核心实现原理可以浓缩为四句话匹配用matchDomain做域名路由按媒体集团批量适配重置删 Cookie、清 localStorage让计量墙失忆剥离移除锁定 class/属性/遮罩元素把正文从牢笼里放出来重建从 JSON 数据层或外部存档恢复完整内容。对普通用户而言只需在 Tampermonkey 中安装对应语言的用户脚本如userscript/bpc.en.user.js并在 uBlock Origin 中订阅bpc-paywall-filter.txt即可体验对开发者而言这份源码是学习 MutationObserver、DOM 重建、scriptlet 注入、跨域请求授权等前端高级技巧的绝佳教材。理解原理不是鼓励绕过付费而是让你在面对任何前端限制时都能多一种优雅的解决思路。【免费下载链接】bypass-paywalls-clean-filters项目地址: https://gitcode.com/gh_mirrors/by/bypass-paywalls-clean-filters创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表