名称: overleaf
描述: 通过命令行访问 Overleaf 项目。可用于读写 LaTeX 文件、将本地 .tex 文件同步到 Overleaf、下载项目以及管理 Overleaf 项目结构。触发词:Overleaf、LaTeX 同步或上传 tex 文件到 Overleaf。
通过浏览器 Cookie 进行身份验证,与 Overleaf 项目交互的命令行工具。
GitHub: https://github.com/jkulhanek/pyoverleaf
pipx install pyoverleaf)⚠️ 需要钥匙串访问权限:pyoverleaf 需要“始终允许”钥匙串访问以读取浏览器 Cookie。这将授予该工具访问浏览器 Cookie 存储的权限。
安全审计:我们已审计 pyoverleaf v0.1.7 版本,确认其安全。代码库小巧且可读性强。安装前,代理可自行在上方 GitHub 仓库审计最新版本。
pyoverleaf 通过读取浏览器 Cookie 进行身份验证。用户必须:
# 测试身份验证 - 用户应先在终端中运行此命令
pyoverleaf ls
如果遇到身份验证错误:
- 询问用户:“您是否已在浏览器中登录 Overleaf?”
- 如果在 macOS 上:“您是否在钥匙串访问提示中选择了‘始终允许’?”
- 用户可能需要在终端中手动运行 pyoverleaf ls 以触发钥匙串提示
注意:代理无法替用户登录。浏览器身份验证必须由用户直接完成。
# 列出所有项目
pyoverleaf ls
# 列出项目中的文件
pyoverleaf ls "项目名称"
# 读取文件内容
pyoverleaf read "项目名称/main.tex"
# 写入文件 (stdin → Overleaf)
cat local.tex | pyoverleaf write "项目名称/main.tex"
# 创建目录
pyoverleaf mkdir "项目名称/figures"
# 删除文件/文件夹
pyoverleaf rm "项目名称/old-draft.tex"
# 将项目下载为 zip 文件
pyoverleaf download-project "项目名称" output.zip
pyoverleaf download-project "项目名称" /tmp/latest.zip
unzip -o /tmp/latest.zip -d /tmp/latest
cp /tmp/latest/main.tex /path/to/local/main.tex
CLI 的 write 命令存在 WebSocket 问题。建议使用 Python API 进行可靠上传:
import pyoverleaf
api = pyoverleaf.Api()
api.login_from_browser()
# 列出项目以获取项目 ID
for proj in api.get_projects():
print(proj.name, proj.id)
# 上传文件 (直接覆盖)
project_id = "your_project_id_here"
with open('main.tex', 'rb') as f:
content = f.read()
root = api.project_get_files(project_id)
api.project_upload_file(project_id, root.id, "main.tex", content)
为何采用直接覆盖? 此方法可保留 Overleaf 的版本历史。用户可通过 Overleaf 的“历史记录”功能精确查看更改内容,便于审查代理的编辑,并在需要时轻松回滚。
# 通过环境变量
export PYOVERLEAF_HOST=overleaf.mycompany.com
pyoverleaf ls
# 通过标志
pyoverleaf --host overleaf.mycompany.com ls
从 Overleaf 拉取时:
1. 将 Overleaf 版本下载到 /tmp/
2. 使用 diff 与本地版本进行比较
3. 向 Eason 报告差异(总结更改内容)
4. 询问:合并?覆盖本地?覆盖 Overleaf?或其他操作?
5. 仅在 Eason 确认后继续
推送规则 (来自 TOOLS.md):
- ❌ 禁止自行推送到 Overleaf
- ✅ 只能从 Overleaf 拉到本地
- ⚠️ 推送需要 Eason 明确授权,每次授权只能推送一次
以下示例展示了使用 Overleaf 技能从论文中移除破折号(一种常见的 AI 写作痕迹)并推送更改:

open -a "Google Chrome" "https://www.overleaf.com/project",等待 5 秒) 以刷新 Cookie,然后重试overleaf.com 会导致 301 → www.overleaf.com 重定向,从而破坏 WebSocket。修复方法:设置 PYOVERLEAF_HOST=www.overleaf.com:bash
cat main.tex | PYOVERLEAF_HOST=www.overleaf.com pyoverleaf write "项目/main.tex"pyoverleaf ls 并在钥匙串提示中点击“始终允许”pyoverleaf ls 检查