Skip to content

集成示例

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 Key
python
# 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)