集成示例
curl
bash
# 影响因子
curl -X POST https://api.byteslink.cn/journals/dev/impact-factors/ \
-H "X-API-Key: pp_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"journals": ["J Med Chem", "CLINICAL SOCIAL WORK JOURNAL"]}'
# 预警 / 掠夺性期刊检查
curl -X POST https://api.byteslink.cn/journals/dev/warnings/ \
-H "X-API-Key: pp_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"journals": ["CONNECTION SCIENCE"]}'Python
python
import requests
BASE = "https://api.byteslink.cn/journals"
HEADERS = {"X-API-Key": "pp_xxxxxxxx"}
def query(endpoint: str, journals: list[str]) -> list[dict]:
"""批量查询,自动按 20 个一批拆分(每批计费 1 次)"""
results = []
for i in range(0, len(journals), 20):
r = requests.post(f"{BASE}/dev/{endpoint}/",
json={"journals": journals[i:i+20]},
headers=HEADERS, timeout=10)
if r.status_code == 402:
raise RuntimeError("额度不足,请充值")
r.raise_for_status()
results += r.json()["results"]
return results
ifs = query("impact-factors", ["J Med Chem", "CLINICAL SOCIAL WORK JOURNAL"])
warns = query("warnings", ["CONNECTION SCIENCE"])
print(ifs[0]["impact_factor"], warns[0]["is_warning"])
# 命中的具体名单(预警名单 / 掠夺性期刊)
for w in warns:
if w["is_warning"]:
print(w["query"], "命中:", [s["name"] for s in w["sources"]])Zotero 插件
典型需求:在条目列表显示影响因子/分区,并将预警 / 掠夺性期刊标红。
javascript
const BASE = "https://api.byteslink.cn/journals";
const API_KEY = "pp_xxxxxxxx"; // 从插件首选项读取
async function fetchJournalData(endpoint, journals) {
const resp = await Zotero.HTTP.request("POST", `${BASE}/dev/${endpoint}/`, {
headers: { "X-API-Key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ journals }),
responseType: "json",
});
return resp.response.results;
}
// 取当前选中条目的期刊名(去重,批量一次最多 20 个)
function selectedJournalNames() {
const items = Zotero.getActiveZoteroPane().getSelectedItems();
const names = items
.map((it) => it.getField("publicationTitle"))
.filter(Boolean);
return [...new Set(names)].slice(0, 20);
}
async function annotateItems() {
const names = selectedJournalNames();
if (!names.length) return;
// 两个接口并发请求(各计费 1 次)
const [ifs, warns] = await Promise.all([
fetchJournalData("impact-factors", names),
fetchJournalData("warnings", names),
]);
const ifMap = new Map(ifs.map((r) => [r.query, r.impact_factor]));
// 命中的名单可能有多个来源,保留名称用于 tooltip 提示
const warnMap = new Map(
warns
.filter((r) => r.is_warning)
.map((r) => [r.query, r.sources.map((s) => s.name).join("、")])
);
for (const name of names) {
const f = ifMap.get(name);
const label = f ? `IF ${f.JIF} | JCR Q${f.Q} | 中科院 ${f.N} 区` : "未收录";
const danger = warnMap.has(name) ? `(${warnMap.get(name)},建议标红)` : "";
Zotero.debug(`${name}: ${label} ${danger}`);
// 实际插件中:写入自定义列 / extra 字段,命中名单的期刊设置红色行样式,
// tooltip 展示 sources 中的 name / desc
}
}实现建议:
- 结果按期刊名做本地缓存(IF 数据按年更新、名单数据低频更新),减少额度消耗
- 收到
402时引导用户去用户中心充值,收到429时退避重试 - API Key 存放在插件首选项中,不要硬编码进发布版本
is_warning只做布尔标红即可;需要区分「中科院预警」与「掠夺性期刊」时读取sources[].code
OpenClaw Skill
Skill 只需封装一个"期刊安全检查 + 指标查询"动作:
yaml
# skill 配置示意
name: journal-check
description: 查询期刊影响因子/分区,并检查是否命中中科院国际期刊预警名单或掠夺性期刊名单
env:
JOURNAL_API_KEY: 用户的 API Keypython
# skill 执行逻辑示意
import os, requests
def journal_check(names: list[str]) -> str:
base = "https://api.byteslink.cn/journals"
headers = {"X-API-Key": os.environ["JOURNAL_API_KEY"]}
body = {"journals": names[:20]}
ifs = requests.post(f"{base}/dev/impact-factors/", json=body,
headers=headers, timeout=10).json()["results"]
warns = requests.post(f"{base}/dev/warnings/", json=body,
headers=headers, timeout=10).json()["results"]
lines = []
for a, b in zip(ifs, warns):
if a["found"]:
f = a["impact_factor"]
metric = f"IF={f['JIF']}, JCR Q{f['Q']}, 中科院{f['N']}区"
else:
metric = "JCR 未收录"
if b["is_warning"]:
hit = "、".join(s["name"] for s in b.get("sources", []))
flag = f"⚠️ 命中名单:{hit}"
else:
flag = "✅ 不在预警/掠夺性名单"
lines.append(f"{a['query']}: {metric} | {flag}")
return "\n".join(lines)