起因

最近几年我有个习惯:常用的网页喜欢"装"成独立的桌面 app。一个窗口一个站,Dock 里独立图标,Cmd+Tab 能切,不会和浏览器里几十个 tab 混在一起。

但用着用着会发现一些挠头的小毛病:

  • 网页里有一个浮窗挡视线,每次都要手动关
  • 某个面板的字号偏小,眼睛累
  • 一段广告位想隐藏掉
  • 偶尔想改两行 CSS 让深色模式更耐看一点

这种东西用 DevTools 当场都能改,但代价是一刷新就没了。装 Tampermonkey / Violentmonkey 也行,但近一两年这类扩展为了配合浏览器的 MV3 安全策略,默认都要用户去开发者模式里手动勾"允许用户脚本"这种选项才能跑——自己用倒还行,想推荐给身边非技术的朋友用一下,光是讲清楚这几步就够费劲了。更别说有些站点的 JS bundle 我想直接换掉一小段——这种活儿用扩展本来也做不到。

我想要的其实很简单:

  1. 任何一个网页,输一行 URL 就能当独立 app 跑
  2. 我自己写的 userscript,能用 Tampermonkey 那套 @match 语法直接装上去——不走扩展、不用让用户去开发者模式里勾"允许用户脚本"
  3. 脚本就是磁盘上的几个 .js 文件,跨重启都还在,方便我自己 grep / git 管

试了一圈现成方案没有完全对得上的,所以索性自己写了一个,叫 Pouch。Rust + Tauri v2,macOS 和 Windows 都有打好的包。

核心思路

Pouch 在概念上其实就两件事:

第一件,把网页装进窗口里。 用 Tauri 起一个 webview,cookie、storage、origin 全都是站点真实的那一份,不做任何重写。你登录过的状态、保存过的偏好,跟你在 Safari/Edge 里看完全一样。

第二件,把你的 userscript 注入进去。 Pouch 内置了一个 Tampermonkey 风格的脚本调度器——扫 inject/ 目录,把符合 @match 规则的 .js 文件在 document_start 时机插进页面。整条链路不依赖任何浏览器扩展,没有"先去开发者模式里勾选项"的额外步骤,也不受 MV3 那套生命周期限制。

配置长什么样

一切都收敛在一个 TOML:

# 启动时打开哪些 URL,第一条是主窗口,剩下的各自独立窗口、共享 cookie
startup_urls = ["https://www.leelib.com"]

# 窗口初始尺寸:inherit/default/maximized/fullscreen 或自定义 width/height
window_dimensions = "inherit"

# 这些 URL 直接放行,不走 Pouch 的内部处理;通常用于 analytics / 字体 CDN / 三方静态资源
ignore_urls = [
  { suffix = "gstatic.com" },
  { suffix = "googletagmanager.com" },
  { suffix = "google-analytics.com" },
  { suffix = "cdn.jsdelivr.net" },
  { wildcard = "*.google.com" },
]

[updater]
auto_check = true

macOS 下这个文件在 ~/Library/Application Support/Pouch/hook.conf.toml,Windows 下在 %APPDATA%\Pouch\。改完按 Cmd+R(Windows 重启进程)就生效。

ignore_urls 提供四种匹配方式,按精度递增挑就行:host 后缀、host 通配、整 URL 通配、整 URL 正则。

注入脚本

inject/ 目录下放任意 .js 文件,文件头写一个 Tampermonkey 风格的元数据块:

// ==UserScript==
// @name   tweak example
// @match  https://www.example.com/*
// ==/UserScript==

(function () {
  console.log('[tweak] running on', location.host);
  // your tweaks here
})();

几条规则值得提一下:

  • 脚本运行在 document_start,比页面自己的 JS 还早,所以拦改 window.fetch、提前注入 hook 都来得及
  • 每个脚本各自包在独立的 try/catch 里,一个挂了不会拖累别的
  • @match 默认是 glob,*/;想用正则就写 @match regex:^https://...
  • 不写 @match 的脚本会在扫描阶段被跳过——这是故意的,省得你哪天不小心把全局脚本塞到所有站点里
  • iframe 里只跑显式命中的脚本,光写 @match * 是不会在 iframe 里运行的;想覆盖 iframe,单独写一条更精确的规则

SPA 的路由切换 不会 重新触发脚本(webview 没真正 navigate),如果你想 hook URL 变化,自己挂 history.pushState 就行。

一些可能不显眼但其实有用的细节

多窗口共享 storage。 配置里 startup_urls 写几条,Pouch 就开几个窗口。每个窗口是独立的 webview,但 cookie、localStorage 共享同一份——本质上等价于"同一个浏览器里的多个 tab,只是装在不同 OS 窗口里"。这对一个账号要同时盯多个面板的场景挺香。

标题栏的三个小按钮(macOS)。 右上角放了三颗:reveal data folder(直接跳到 inject/ 和配置文件那个位置)、reload from config(重新读 TOML 并重启)、toggle DevTools。原本是为了我自己调试方便,后来发现日常用最多的居然是第一个——改完文件想看磁盘上长啥样,按一下就完事。

安装走 Homebrew 和 Scoop。 macOS:

brew install --cask leaker/tap/pouch

Windows:

scoop bucket add leaker https://github.com/leaker/scoop-bucket
scoop install pouch

Windows 走 Scoop 是有意为之的——portable zip 不会被 SmartScreen 拦下来。没装包管理器的话,Releases 页.dmg.exe 直接下。

HTTPS 证书提示。 第一次启动 Pouch 会要一次系统级的信任提示——它需要本地 CA 才能看到、改写 HTTPS 流量。点一次同意,之后再启动都不会再问。

适合用 Pouch 吗?

我自己常拿它做几件事:

  1. 常驻型网页变 app。 工作里某个内部仪表盘、某个 webmail、某个 SaaS 控制台——Cmd+Tab 切起来比 tab 快得多
  2. 给老旧 web 应用打补丁。 厂商不更新了,但有个我每天用的 bug;写 5 行 userscript 永久治好
  3. 隐藏掉某个网页里让人心烦的元素。 一个 document.querySelector('.popup').remove() 写进 userscript,在 document_start 跑就完事,再也不用每次手动关
  4. 给某个站点做个人功能扩展。 自动展开折叠的评论、给页面加一组快捷键、自动登录跳转——一段 userscript 就够

不适合的场景也很明显:你想要 ad block、想要密码管理、想要扩展生态——那应该继续用 Chrome/Firefox + 扩展。Pouch 没那个野心,它只想做"webview + Tampermonkey 风格的脚本注入",把"我自己写的那点小补丁"持久地挂在我每天用的几个网页上。

最后

代码全开源,MIT,地址在 github.com/leaker/pouch

写这个东西的初衷其实挺朴素:MV3 之后的浏览器扩展给不了我想要的"零摩擦写脚本"体验,Electron 套壳又太重,DevTools 改完一刷新就没了,那就自己造一个。结果造着造着发现还挺好用——常用的几个网页都已经被我塞进去当独立 app 跑了,每个都带着我自己的几行小补丁,挺安心。

如果你也常觉得"这个网页要是能再改一点点就好了",可以试试。

仗剑江湖WebMUD客户端

最近在学习AI与一些前端方面的知识,各种前端方向依然属于我不擅长的领域,也是在为后面一些可能的情况存储知识储备。

前段时间忆起只有老网虫才知道的在西陆版的WebMUD游戏 “仗剑江湖” 游玩的岁月。或许只是突然心生怀念,就把早之前2012年写的一个客户端程序(仗剑江湖MUD客户端)拿出来找个服进去逛逛。

意外的有个服里还有不少活人,结果聊的正开心时突然程序崩溃了。原本的程序对付老最古老的江湖版本应该是可以稳定跑的,目前来看可能是遇到了之前开发那东西时没遇到过的状况。后来实际中了解也知道了因为别人江湖添加了很多他自己独有的活动和內容。

现在想修复一下,可原来那时的程序源码早不知道丢哪里去了。

那就干脆重新撸一个,刚好试试目前不擅长的方向可以做到哪些事情。

使用说明

  1. 配置好 地址.txt 为你们游玩的江湖网址,例如我压缩包里内置了 追梦仗剑江湖

    如果需要游玩其他服,只用把这个文件里的地址修改为其他的江湖地址即可

  2. 没有账号的同学记得先去你们的江湖网页注册好账号,我这里就不加注册功能了。别人网站有可能有公告之类的提示信息,还是要去看看。

  3. 启动主程序 仗剑江湖WEBMUD客户端.exe 剩下的应该各位都是老手可以看得懂了

目录说明

  • 脚本 - 是存放脚本的目录,目前内置了另一个辅助工具里内置的所有脚本。
  • 脚本/按钮 - 是存放游戏图形区域下方 快捷按钮 的脚本,所有放在这个目录的脚本都会被加载到按钮里。
  • 脚本/挂机 - 是右下方 循环挂机 功能的脚本,只能进行重复间隔时间自动逐步执行的脚本功能。
  • 脚本/快速行走 - 是右侧 快速行走 功能的脚本,分为两级目录。第一级为分类目录,第二级为快速行走脚本名称,通常使用目标地点或目标人物名称作为文件名以方便搜索。 (记得善用 快速行走 下方的 搜索所有脚本 功能。另外可以在快速行走的脚本列表用 双击 来代替 快速行走 按钮进行执行)
  • 用户 - 是存放多角色信息的目录,会保存用户最后在线以及会话信息用于免登录的快速进入游戏功能。里面还存放着对应角色的系统日志,每次进入游戏后会自动加载历史日志。系统日志不用特意清理,本身会限制只最后5000条日志。
  • fonts - 是放字体的目录,里面有个我认为比较漂亮的字体会被加载到网页。如果你们觉得不漂亮,可以用同样 woff2 格式的字体文件替换成你们喜欢的
  • downloads - 是把游戏里的图片下载到本地缓存的目录,第一次进某个服会图片加载速度会比较慢。但缓存好了以后图片都从本地加载,可以帮巫师他们节省一些不必要的流量开销。如果某个服有更新图片资源,删除这个目录让程序自己重新缓存即可。
  • 窗口信息.json - 用于记录最后一次窗口大小的。每次启动后会按照上次的窗口大小还原,如果不小心窗口变的奇怪,就把这个删掉重新启动程序即可。
  • 其他那些奇怪的文件都是程序打包后运行时所需要的,如果不小心删除了某个文件程序可能会无法正常运行

下载地址

OneDrive:

仗剑江湖WebMUD客户端

本站资源:

仗剑江湖WebMUD客户端

后记

暂时就这些,更多自动化的功能暂时不会加。因为游戏服的大部分人包括我都更喜欢手动慢慢玩,就是体会这种慢节奏像读一遍互动式小说的乐趣。

如果发现问题,请联系邮箱回馈: admin@leelib.com

程序会在我修正完问题后自动发现更新并提示,只需要点击一下按钮刷新过后,不出意外的话使用的就是新版本了。

更新历史

1.0.1

  • 由于一些原因不再使用阿里云CDN,所以更新了一些功能用于适配新的CDN。
  • 更新 Electron 内核到当前最新 v30.0.8。由于目前新的 Electron 版本压缩包超过100MB,不再适合存储在 GitHub 里,所以额外建了资源站来存储当作备选下载线路

1.0.0

  • 完成基本功能

webmud

为一个元老级的MUD游戏开发的一个PC客户端。利用业余时间完成(主要是这阵子要钻研一个很有技术难度的工作,整天要对着封包一个字节一个字节比对,头疼的厉害。)。

下载地址:仗剑江湖MUD客户端ver1.0beta

更新历史

ver 1.0 beta 2012.06.13

  • 增加游戏界面功能
  • 增加高级脚本功能及界面
  • 高级脚本内部变量:Self
  • 高级脚本内部函数:GetActor,Log,Cmd,Sleep, IsFaintStatus
  • 高级脚本内实现 <hit> <kill> <get> <check> 等基本命令
  • 高级脚本内实现RunLine,RunScript等功能
  • 高级脚本内实现OnAddActor,OnDelActor, OnChangePic,OnChangeAll,OnGetTask, OnTaskOver,OnThing,OnHitOver,OnFaint, OnWake,OnDead,OnDazuoOver,OnBuyItem, OnBehead,OnPickUp,OnPickUpFrom, OnItemInfo 等触发事件

ver 0.4 beta 2012.04.03

  • 增加按钮脚本个数为20个,具体按钮脚本的内 容到 script按纽list.txt 里面配置
  • 增加脚本指令 具体使用方法请看 脚本指令说明.txt
  • 增加自动任务功能。 具体使用方法请看 自动任务说明.txt

ver 0.3 beta 2012.03.25

  • 增加门派脚本功能,配置:scriptlist.txt
  • 命令框自动保存最后发送的10条命令。可在命 令框使用键盘上下键翻找
  • 增加显示当前任务信息功能,用于准备做自动 任务。如有发现什么任务没识别出来的,请联 系作者并回馈。

ver 0.2sp1 beta 2012.03.24

  • 修正有些人登录出错的问题
  • 优化了网络代码网络效率提高,减少内存使用

var 0.2 beta 2012.03.24

  • 增加挂机功能,文件目录:script挂机
  • 增加按钮功能,文件目录:script按纽
  • 信息页面每当显示内容超过500行自动清空
  • 当前玩家名称显示在血条上面
  • 关闭主窗口会返回登录窗口

ver 0.1 beta 2012.03.23

  • 支持游戏基本功能。命令、聊天信息、房间信 息、当前房间人物列表等。

运行环境

操作系统:WinXP以上版本 内存需求: 512M

使用说明:

配置客户端目录下的 Config.ini 文件,修改Host为你需要登录的网站地址。这个地址从你登录游戏以后的页面提取。例如登录以后地址是:http://xxx.example.com/cgi-bin/mud/login1 那么这里就填:http://xxx.example.com

附加说明:

双击房间人物列表中的人物可以将人物名字插到命令行的最后

如发现BUG或有好的建议,请在下面留言。