文章目录
- [Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)](#Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150))
-
- 环境
- 第一反应:按官方文档测一下
- [Zotero 实际在听哪里](#Zotero 实际在听哪里)
- [是不是 native messaging 没注册](#是不是 native messaging 没注册)
- [那 Zotero 怎么跑到 23124 去的](#那 Zotero 怎么跑到 23124 去的)
- 根因:端口占用触发静默回退
- 修复
- 防复发
- 小结
Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)
Edge 装了 Zotero Connector,桌面 Zotero 9.0.6 也开着。点保存按钮,图标变灰、提示「unable to communicate with Zotero」。这是一篇关于这个具体故障的排查笔记。
环境
| 项目 | 版本 |
|---|---|
| 操作系统 | Ubuntu 24.04 |
| Zotero | 9.0.6(解压式安装在 ~/Zotero) |
| 浏览器 | Microsoft Edge 150 |
| Zotero Connector | v5.0.210(Edge 扩展 ID nmhdhpibnnopknkmonacoephklnflpho) |
第一反应:按官方文档测一下
Zotero 官方 KB 给的诊断入口是这一句:访问 http://127.0.0.1:23119/connector/ping,看到「Zotero is running」就说明桌面应用是好的,问题在浏览器那边;看不到就说明桌面应用没就绪。
我在 Edge 地址栏打开这个 URL:
text
curl: (7) Failed to connect to 127.0.0.1 port 23119
桌面 Zotero 明明在跑,任务栏也有图标。但 23119 没人接。
Zotero 实际在听哪里
列出 zotero 进程持有的本地端口:
bash
$ ss -lntp | grep zotero
LISTEN 127.0.0.1:19876 ... zotero-bin
LISTEN 127.0.0.1:23116 ... zotero-bin
LISTEN 127.0.0.1:23124 ... zotero-bin
挨个 curl:
| 端口 | /connector/ping 响应 |
|---|---|
| 23119 | connection refused |
| 23124 | Zotero is running |
| 23116 | timeout |
| 19876 | timeout |
Connector server 实际跑在 23124 上,而不是 KB 说的 23119。
是不是 native messaging 没注册
看到端口不是预期值,第一反应是 native messaging host 的 manifest 没装------这是 Linux 解压式安装的常见坑。
检查 Edge 的 manifest 目录:
bash
$ ls ~/.config/microsoft-edge/NativeMessagingHosts/
(empty)
空的。看起来就是这个问题了。
但接下来查 connector 扩展的源码(zotero/zotero-connectors),看到 src/common/zotero.js 里写死了:
js
"connector.url": 'http://127.0.0.1:23119/',
Connector 不通过 native messaging 探测 Zotero,就是直接打 23119。manifest 目录空不空对这个问题其实无关紧要。这条路走死了。
那 Zotero 怎么跑到 23124 去的
回到 Zotero 自己。看 HTTP server 的默认端口:
bash
$ unzip -p ~/Zotero/app/omni.ja defaults/preferences/zotero.js | grep httpServer
pref("extensions.zotero.httpServer.enabled", true);
pref("extensions.zotero.httpServer.port", 23119);
pref("extensions.zotero.httpServer.localAPI.enabled", false);
默认就是 23119。那为什么实际是 23124?看用户配置:
bash
$ grep httpServer ~/.zotero/zotero/<profile>/prefs.js
user_pref("extensions.zotero.httpServer.localAPI.enabled", true);
user_pref("extensions.zotero.httpServer.port", 23124);
第 88 行被改成了 23124。这文件是什么时候被改的?
bash
$ stat -c '%y' ~/.zotero/zotero/<profile>/prefs.js
2026-07-13 08:42:20
就在这次启动 Zotero 后的一分钟内。是 Zotero 自己写的,不是手工改的。
根因:端口占用触发静默回退
Zotero 的 HTTP server 是 Firefox 的 HttpServer。它的行为是:调用 start(port) 时,如果 port 被占用,会自动找下一个空闲端口,并把实际监听的端口写到 prefs。
我这次启动 Zotero 时,23119 恰好被另一个进程占着------很可能是某个短命的本地服务,活着的时候占住 23119,被我用 kill 清掉后没人再起来。Zotero 启动那一瞬间发现 23119 不空,就退到 23124,并把 23124 写进了 prefs.js。
之后那个短命进程退出,23119 空了,但 Zotero 已经把 23124 当成事实上的「我的端口」记在了配置里。下次再启动还是会读这个 23124。
Connector 是写死的 23119,根本不知道桌面应用换了端口。链路在这里断了。
修复
bash
# 1. 停 Zotero
pkill -f ~/Zotero/zotero-bin
sleep 2
# 2. 确认 23119 现在是空的
ss -lntp | grep :23119 || echo "(23119 free)"
# 3. 改 prefs.js,把端口改回默认
sed -i 's/httpServer.port", 23124/httpServer.port", 23119/' \
~/.zotero/zotero/<profile>/prefs.js
# 4. 启动 Zotero
~/Zotero/zotero &
# 5. 验证
curl http://127.0.0.1:23119/connector/ping
# <!DOCTYPE html><html><body>Zotero is running</body></html>
回到 Edge 打开任何学术页面,Zotero Connector 图标变彩色、能触发保存,问题解决。
防复发
如果过几天 connector 又断了,先看 prefs.js 是不是又被改回 23124。如果是:
bash
# 找到占用 23119 的进程
sudo lsof -i :23119
# 或在 Zotero 启动那一瞬间抓 snapshot:
ss -lntp | grep :23119
常见会撞 23119 的本地服务:AnkiConnect(默认 8765,但有人在反代时改成 23119)、Calibre Content Server(默认 8080)、某些调试代理和远程开发隧道。
如果找不到占用方但又确实复发,可以在 Zotero 启动前临时占住 23119,让其他进程让路:
bash
# 占用 23119 直到 Zotero 起来
( sleep 1 && exec nc -lk 23119 ) &
~/Zotero/zotero &
这个方法很 ugly,但能稳定避免回退。
更彻底的办法是改 connector 而不是改 Zotero------给 connector 加一个 native messaging host,让它动态询问 Zotero 实际监听哪个端口。Connector 仓库目前没有这种机制,等官方支持。
小结
Connector 的 URL 是写死的 23119,Zotero 在 23119 被占时会静默回退到其他端口并把端口写入 prefs.js。这两边的设计对不上,端口一旦错位就静默断连。修复就是改 prefs.js 把端口改回 23119,再用 lsof 排查占用方,避免下次启动又被抢。