集成示例
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"])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]));
const warnSet = new Set(
warns.filter((r) => r.is_warning).map((r) => r.query)
);
for (const name of names) {
const f = ifMap.get(name);
const label = f ? `IF ${f.JIF} | JCR Q${f.Q} | 中科院 ${f.N} 区` : "未收录";
const danger = warnSet.has(name) ? "(预警期刊,建议标红)" : "";
Zotero.debug(`${name}: ${label} ${danger}`);
// 实际插件中:写入自定义列 / extra 字段,预警期刊设置红色行样式
}
}实现建议:
- 结果按期刊名做本地缓存(IF 数据按年更新、预警名单低频更新),减少额度消耗
- 收到
402时引导用户去用户中心充值,收到429时退避重试 - API Key 存放在插件首选项中,不要硬编码进发布版本
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 未收录"
flag = "⚠️ 预警期刊" if b["is_warning"] else "✅ 不在预警名单"
lines.append(f"{a['query']}: {metric} | {flag}")
return "\n".join(lines)