一键导入
pdf-bib-import
将一个文件夹中的多篇 PDF 论文批量提取题录信息(标题、作者、年份、期刊、卷期页码、DOI、摘要),并导入飞书多维表格。当用户需要把一批 PDF 论文的书目信息、题录信息汇总到飞书 Base / 多维表格时触发。关键词:PDF、论文、题录、书目、批量导入、飞书多维表格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
将一个文件夹中的多篇 PDF 论文批量提取题录信息(标题、作者、年份、期刊、卷期页码、DOI、摘要),并导入飞书多维表格。当用户需要把一批 PDF 论文的书目信息、题录信息汇总到飞书 Base / 多维表格时触发。关键词:PDF、论文、题录、书目、批量导入、飞书多维表格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
全球人文社科顶刊研究方法扫描与汇总工具。通过 OpenAlex API 抓取社会学、政治学、 心理学、传播学、管理学、经济学、人类学、教育学、历史学、语言学、地理学、方法论专刊、 AI-社科交叉期刊、数字人文期刊等 14 大类顶刊近 24 个月(可调)论文, 用启发式规则做大规模方法打标 + AI 识别(L1 家族标签,可处理万篇级), AI 相关方法单独成章并细分 AI-as-tool 与 AI-as-object, 输出 Excel 方法矩阵(4 Sheet)+ Markdown 趋势报告(含教学转化建议)。 面向课程策划人员、研究方法课程教师、研究生方法训练设计者。 触发条件:用户提到"调研顶刊方法""扫描顶刊研究方法""人文社科方法趋势" "最新研究方法汇总""课程方法更新""AI 研究方法扫描""global top journals methods" "scan top journals for methods",或说"帮我看看最近顶刊都用什么方法"、 "查一下过去两年顶刊的 AI 方法"、"为方法论课程准备最新素材"、 "全球顶刊最新研究方法调研"。即使用户只是模糊地说"整理最新研究方法"、 "方法前沿有什么",只要上下文是学术/教学,也应触发此 skill。
企业战略制定工具(Corporate Strategy Maker)。当CEO或高管提出以下需求时触发: 制定战略、战略规划、战略诊断、战略审视、年度战略、三年规划、竞争策略、增长路径、 商业模式设计、战略迭代、战略执行方案、OKR制定、战略重点、业务方向选择。 适用场景:新公司战略制定、现有战略审视与迭代、特定战略议题深度分析、 年度战略复盘与更新、竞争应对策略、转型路径设计。 不适用:日常运营决策、单一产品功能需求、HR/财务等职能级决策(除非上升至战略级别)。
知网(CNKI)高级检索论文自动化工具。当用户提供研究关键词或研究选题时,自动执行 三阶段检索:①主体联合检索(倒剥洋葱法,多组核心概念 AND 联合,获取直接相关文献); ②独立补充检索(对各核心概念组分别单独检索,获取间接相关的背景文献与理论文献); ③汇总合并(去重后按类别分色展示,输出统一 Excel 文件)。 触发条件:用户提到需要在知网/CNKI检索论文、高级检索、按关键词搜索CSSCI/C刊论文、 下载题录信息、获取论文摘要、按被引排序检索;或说"帮我在知网检索XX相关论文"、 "用知网高级检索搜索XX主题的C刊论文"、"帮我检索XX关键词的CSSCI论文"。
外文学术文献检索工具(社会科学方向)。基于 OpenAlex 开放 API(无需机构账号、无需 API key), 执行三阶段检索:①主体联合检索(最具体组主检索+其他组后置文本过滤,实现真正 AND 语义) ②独立补充检索(研究对象背景文献 + 核心理论文献)③汇总去重分类 Excel。 同步生成 WoS/Scopus 布尔检索式供有机构权限的用户使用。 触发条件:用户提到需要检索外文/英文/SSCI文献、检索国外学术数据库、帮我搜英文文献、 foreign literature search、检索 SSCI/SCI 论文等。
Skill 安装工具(Skill Installer)。从多种来源安装 Claude Code skill, 内置安全审查流程,安装前自动执行 skill-vetter 协议。 支持:GitHub 仓库路径(owner/repo/skill-name)、原始文件 URL、 本地文件路径、直接粘贴 SKILL.md 内容。 当用户说"安装这个skill""install skill""帮我装这个""从GitHub安装skill" "把这个skill装上""安装 owner/repo/skill-name"时触发此 skill。 注意:所有安装在写入文件前必须经过安全审查,无法获取内容的来源一律拒绝安装。
研究设计内部一致性检查工具(Design Coherence Check)。系统检查研究设计在 本体论-认识论-方法论-具体方法四个层次之间的一致性,识别认识论矛盾、 方法论-方法不匹配、效度语言混用等深层问题。 当用户说"帮我检查研究设计""研究设计有没有问题""认识论和方法一致吗" "方法选对了吗""设计是否自洽""审稿人会质疑我的方法论吗" "我的方法论部分这样写合适吗""帮我审查方法章节的逻辑"时触发此 skill。 注意:这不是方法操作指导工具(具体编码/分析操作请用其他 skill), 而是专门检查研究设计"哲学层"与"操作层"之间内在一致性的元方法工具。
| name | pdf-bib-import |
| version | 1.0.0 |
| description | 将一个文件夹中的多篇 PDF 论文批量提取题录信息(标题、作者、年份、期刊、卷期页码、DOI、摘要),并导入飞书多维表格。当用户需要把一批 PDF 论文的书目信息、题录信息汇总到飞书 Base / 多维表格时触发。关键词:PDF、论文、题录、书目、批量导入、飞书多维表格。 |
| metadata | {"requires":{"bins":["lark-cli","pdftotext","pdfinfo","python3"]}} |
成本控制:数据提取必须用脚本完成,禁止用 AI 逐篇读取 PDF——每次 AI 读取都消耗大量 token。
正确流程:写脚本提取 → 人工/脚本校对 → 脚本批量写入飞书,AI 只负责生成脚本和配置飞书结构。
在 /tmp 下生成 extract_bib.py,利用 pdftotext(/opt/homebrew/bin/pdftotext)批量提取:
#!/usr/bin/env python3
"""
extract_bib.py — 从 PDF 目录批量提取题录,输出 bib_data.json
用法:python3 extract_bib.py <pdf_dir>
"""
import os, sys, json, subprocess, re
def run(cmd):
return subprocess.run(cmd, capture_output=True, text=True).stdout.strip()
def extract_pdf_meta(path):
info = run(["/opt/homebrew/bin/pdfinfo", path])
meta = {}
for line in info.splitlines():
if ":" in line:
k, _, v = line.partition(":")
meta[k.strip()] = v.strip()
text = run(["/opt/homebrew/bin/pdftotext", "-l", "2", path, "-"])
return meta, text
def guess_fields(meta, text):
"""从 pdfinfo + 前两页文字中猜测题录字段,返回 dict。"""
lines = [l.strip() for l in text.splitlines() if l.strip()]
return {
"论文题目": meta.get("Title", ""),
"作者": meta.get("Author", ""),
"发表年份": None,
"期刊名称": "",
"卷期页码": "",
"DOI": "",
"摘要": "",
"_raw_text_preview": "\n".join(lines[:40]), # 供人工核查
}
def main():
pdf_dir = sys.argv[1] if len(sys.argv) > 1 else "."
results = []
for fname in sorted(os.listdir(pdf_dir)):
if not fname.lower().endswith(".pdf"):
continue
fpath = os.path.join(pdf_dir, fname)
meta, text = extract_pdf_meta(fpath)
rec = guess_fields(meta, text)
rec["_filename"] = fname
results.append(rec)
print(f" ✓ {fname}")
out = "/tmp/bib_data.json"
with open(out, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"\n已写出 {len(results)} 条记录 → {out}")
print("请检查 bib_data.json,补全缺失字段后再执行 Step 3 导入。")
if __name__ == "__main__":
main()
运行:
python3 /tmp/extract_bib.py "/path/to/pdf_folder"
pdftotext 能提取机器可读 PDF 的文字,但有些 PDF:
_raw_text_preview 字段中判断并手动补全打开 /tmp/bib_data.json,检查并补全各字段,删除 _raw_text_preview 和 _filename。
前置条件: 先阅读
../lark-shared/SKILL.md了解认证规则。
lark-cli base +base-create --name "论文题录数据库"
# 记录返回的 base_token
lark-cli base +table-list --base-token <BASE_TOKEN>
lark-cli base +table-update --base-token <BASE_TOKEN> --table-id <TABLE_ID> --json '{"name":"论文题录"}'
先重命名默认"文本"字段,再删除多余默认字段,最后创建所需字段:
# 查看现有字段(记录各字段 id)
lark-cli base +field-list --base-token <BASE_TOKEN> --table-id <TABLE_ID>
# 将默认文本字段重命名为"论文题目"
lark-cli base +field-update --base-token <BASE_TOKEN> --table-id <TABLE_ID> \
--field-id <TEXT_FIELD_ID> --json '{"type":"text","name":"论文题目","style":{"type":"plain"}}'
# 删除多余默认字段(日期、附件、单选)
lark-cli base +field-delete --base-token <BASE_TOKEN> --table-id <TABLE_ID> --field-id <ID> --yes
# 创建其余字段(串行执行)
cd /tmp
for field in \
'{"type":"text","name":"作者","style":{"type":"plain"}}' \
'{"type":"number","name":"发表年份"}' \
'{"type":"text","name":"期刊名称","style":{"type":"plain"}}' \
'{"type":"text","name":"卷期页码","style":{"type":"plain"}}' \
'{"type":"text","name":"DOI","style":{"type":"plain"}}' \
'{"type":"text","name":"摘要","style":{"type":"plain"}}'; do
echo "$field" > field.json
lark-cli base +field-create --base-token <BASE_TOKEN> --table-id <TABLE_ID> --json @field.json
sleep 0.3
done
生成 /tmp/import_to_lark.sh,从 /tmp/bib_data.json 读取记录并逐条写入:
cat << 'PYEOF' > /tmp/import_to_lark.py
#!/usr/bin/env python3
"""
import_to_lark.py — 从 bib_data.json 批量写入飞书 Base
用法:python3 import_to_lark.py <BASE_TOKEN> <TABLE_ID> [bib_data.json]
"""
import json, sys, subprocess, time, os
def upsert(base_token, table_id, record):
tmp = "/tmp/_rec.json"
# 去除空值字段(避免写入空字符串覆盖)
payload = {k: v for k, v in record.items()
if not k.startswith("_") and v not in (None, "", 0)}
# 年份是数字,0 代表未知,保持过滤
with open(tmp, "w", encoding="utf-8") as f:
json.dump(payload, f, ensure_ascii=False)
result = subprocess.run(
["lark-cli", "base", "+record-upsert",
"--base-token", base_token,
"--table-id", table_id,
"--json", "@_rec.json"],
capture_output=True, text=True, cwd="/tmp"
)
return json.loads(result.stdout)
def main():
base_token = sys.argv[1]
table_id = sys.argv[2]
data_file = sys.argv[3] if len(sys.argv) > 3 else "/tmp/bib_data.json"
with open(data_file, encoding="utf-8") as f:
records = json.load(f)
ok, fail = 0, 0
for i, rec in enumerate(records, 1):
title = rec.get("论文题目", rec.get("_filename", f"record-{i}"))
resp = upsert(base_token, table_id, rec)
if resp.get("ok"):
ok += 1
print(f" [{i}/{len(records)}] ✓ {title[:60]}")
else:
fail += 1
print(f" [{i}/{len(records)}] ✗ {title[:60]}: {resp}")
time.sleep(0.5) # 避免写入冲突
print(f"\n完成:{ok} 成功 / {fail} 失败")
if __name__ == "__main__":
main()
PYEOF
python3 /tmp/import_to_lark.py <BASE_TOKEN> <TABLE_ID> /tmp/bib_data.json
| 问题 | 解决方案 |
|---|---|
| pdftotext 提取为空(扫描件) | 手动填写 bib_data.json,或用 OCR 工具 |
| PDF 元数据乱码 / 错误 | 忽略 meta,从 _raw_text_preview 手工提取 |
lark-cli --json @file 报路径错误 | 必须 cd /tmp 后再执行,使用相对路径 @_rec.json |
| 写入冲突 1254291 | 增大 time.sleep() 到 1 秒 |
| 字段不存在 1254045 | 检查字段名拼写,与 +field-list 返回结果一致 |