Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)

文章目录

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 排查占用方,避免下次启动又被抢。

相关推荐
李伟_Li慢慢3 小时前
02-从硬件说起WebGL
前端·three.js
风123456789~3 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
IT曙光3 小时前
ubuntu apt-get离线源制作
linux·ubuntu
kyriewen3 小时前
看了微软几万人用AI编程的数据——效率涨24%的代价没人提
前端·ai编程·claude
2601_963771373 小时前
How to Scale Your WordPress Store Traffic in 2026
前端·php·plugin
亿元程序员4 小时前
老板说我的3D箭头游戏用来做试玩太普通了,没人想玩,让我变点花样...
前端
其实防守也摸鱼4 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
李伟_Li慢慢4 小时前
01-threejs架构原理-课程简介
前端·three.js