mcpField
C
cnki-export

cnki-export

github.com/cookjohn生産性1.0k414 回インストール33 週間前に更新
リポジトリ

cnki-export について

CNKIの論文引用データをZoteroやRISに出力し、GB/T 7714形式の引用文も作成するスキルです。個別論文と検索結果の一括処理に対応します。

主な機能

  1. 01論文データの個別・一括出力
  2. 02Zoteroへの項目送信
  3. 03RISファイルへの保存
  4. 04GB/T 7714形式の引用生成

活用シーン

  1. 01CNKIの検索結果を一括でZoteroに追加
  2. 02論文詳細ページから引用データを保存
  3. 03RISまたはGB/T 7714形式の文献を準備

MCP 対応

Chrome DevTools MCPでCNKIページからデータを取得し、ローカルスクリプトでZoteroデスクトップに接続します。スクリプトがMCPサービスを公開するとはREADMEに記載されていません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cookjohn/cnki-skills --skill cnki-export

インストール後、Claude Code で/cnki-exportを入力して読み込まれたか確認します。

同梱ファイルscripts/push_to_zotero.py

詳細

CNKI エクスポートと Zotero の連携

CNKI から論文の引用データをエクスポートし、Zotero に直接送信するか、RIS ファイルとして保存します。

引数

  • zotero(デフォルト)— ローカル API 経由で Zotero デスクトップに送信します
  • ris — .ris ファイルとして保存します
  • gb — GB/T 7714 形式の引用テキストを出力します
  • 論文の URL を指定することもできます

モードの選択

状況に応じて適切なモードを選択してください。

状況モードツール呼び出し
論文の詳細ページを表示している単一エクスポート(Step 1A)evaluate 1 回 + bash 1 回 = 2 回
検索結果ページで、すべてまたは選択した論文を保存する一括エクスポート(Step 1B)evaluate 1 回 + bash 1 回 = 2 回
検索してから保存する必要がある先に cnki-search を使用し、その後一括エクスポート合計 4 回

複数の論文を保存する場合は、常に一括エクスポート(1B)を優先してください。 各詳細ページへの移動が不要になり、論文 1 件あたり約 3 回の呼び出しを節約できます。

手順

1A. 単一エクスポート:論文の詳細ページから

mcp__chrome-devtools__evaluate_script を使用します。

async () => {
  const url = document.querySelector('#export-url')?.value;
  const params = document.querySelector('#export-id')?.value;
  const uniplatform = new URLSearchParams(window.location.search).get('uniplatform') || 'NZKPT';
  if (!url || !params) return { error: 'Not on a paper detail page' };

  const resp = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({ filename: params, displaymode: 'GBTREFER,elearning,EndNote', uniplatform })
  });
  const data = await resp.json();
  if (data.code !== 1) return { error: data.msg };

  const result = {};
  for (const item of data.data) {
    result[item.mode] = item.value[0];
  }

  const body = document.body.innerText;
  result.pageUrl = window.location.href;
  result.issn = body.match(/ISSN[::]\s*(\S+)/)?.[1] || '';
  result.dbcode = document.querySelector('#paramdbcode')?.value || '';
  result.dbname = document.querySelector('#paramdbname')?.value || '';
  result.filename = document.querySelector('#paramfilename')?.value || '';

  return result;
}
1B. 一括エクスポート:検索結果ページから(複数の論文に推奨)

CNKI の検索結果ページで、チェックボックスの値を取得し、エクスポート API を直接呼び出します。詳細ページへの移動は不要です。

重要な発見:input.cbItem チェックボックスの value は、詳細ページの #export-id と同じ(同じ暗号化 ID)です。

mcp__chrome-devtools__evaluate_script を使用します。

async () => {
  const API_URL = 'https://kns.cnki.net/dm8/API/GetExport';

  // Get all checkbox values (= export encrypted IDs)
  const checkboxes = document.querySelectorAll('.result-table-list tbody input.cbItem');
  const rows = document.querySelectorAll('.result-table-list tbody tr');

  if (checkboxes.length === 0) return { error: 'No results on page' };

  const allPapers = [];
  for (let i = 0; i < checkboxes.length; i++) {
    const exportId = checkboxes[i].value;
    const paperUrl = rows[i]?.querySelector('td.name a.fz14')?.href || '';

    const resp = await fetch(API_URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: new URLSearchParams({ filename: exportId, displaymode: 'GBTREFER,elearning,EndNote', uniplatform: 'NZKPT' })
    });
    const data = await resp.json();
    if (data.code === 1) {
      const result = {};
      for (const item of data.data) { result[item.mode] = item.value[0]; }
      result.pageUrl = paperUrl;
      // Extract ISSN from ENDNOTE %@ field
      const issnMatch = result.ENDNOTE?.match(/%@\s*([^\s<]+)/);
      result.issn = issnMatch ? issnMatch[1] : '';
      result.dbcode = 'CJFQ';
      result.dbname = '';
      result.filename = '';
      allPapers.push(result);
    }
  }

  return allPapers; // JSON array, directly writable to file for Python script
}

特定の論文のみをエクスポートする場合(例:#1、#3、#5)、インデックスで絞り込みます。

// Replace the for loop condition:
const indices = [0, 2, 4]; // 0-indexed: papers #1, #3, #5
for (let i = 0; i < checkboxes.length; i++) {
  if (!indices.includes(i)) continue;
  // ... rest same
}
2. Zotero に送信

エクスポートデータ(単一オブジェクトまたは JSON 配列)を一時ファイルに保存し、Python スクリプトを実行します。

python "e:/cnki/.claude/skills/cnki-export/scripts/push_to_zotero.py" /tmp/papers.json

Python スクリプトは、単一論文の {} と一括処理の [{}, {}, ...] の両方の JSON 入力に対応しています。

  • UTF-8 エンコーディング(Windows のエンコーディングの問題を回避)
  • ELEARNING 形式を Zotero のアイテムフィールドに解析
  • POST http://127.0.0.1:23119/connector/saveItems を呼び出し
  • 戻り値:201 = 成功、500 = エラー、0 = Zotero が起動していない
3. 結果を報告

単一:

已将论文添加到 Zotero:
  标题: {title}
  作者: {authors}
  期刊: {journal}

GB/T 7714 引用: {gbt_citation}

一括:

已批量添加 {count} 篇论文到 Zotero:
  1. {title1} ({journal1})
  2. {title2} ({journal2})
  ...

エクスポート API リファレンス

パラメーター値取得元
API URLhttps://kns.cnki.net/dm8/API/GetExport固定。どのページからでも動作
filename暗号化 ID詳細ページ:#export-id;検索結果ページ:input.cbItem の値
displaymodeGBTREFER,elearning,EndNoteカンマ区切りのモード
uniplatformNZKPT必須

確認済みのセレクター

要素セレクターページ
エクスポート URL#export-url詳細ページのみ
エクスポート ID#export-id詳細ページのみ
チェックボックス(= エクスポート ID)input.cbItem検索結果ページ
検索結果の行.result-table-list tbody tr検索結果ページ
タイトルリンクtd.name a.fz14検索結果ページ

Zotero API リファレンス

POST http://127.0.0.1:23119/connector/saveItems
Content-Type: application/json
X-Zotero-Connector-API-Version: 3

レスポンス: 201 = 作成済み、500 = エラー コレクション: Zotero で現在選択されているコレクションに保存されます。

コレクションを照会するには:

python "e:/cnki/.claude/skills/cnki-export/scripts/push_to_zotero.py" --list

重要な注意事項

  • Windows のエンコーディング: Python スクリプトを使用する必要があります。bash/curl 経由で中国語の JSON を直接渡すことはできません
  • Zotero の起動が必要: localhost:23119 を使用するには、Zotero デスクトップをバックグラウンドで起動しておく必要があります
  • 中国語の著者: name フィールドを使用します(分割せず単一フィールドで指定)。creatorType: "author" を指定します
  • 一括エクスポートでツール呼び出しを約 90% 削減: 論文 9 件の場合、33 回の呼び出しから 3 回に削減されます
  • CNKI エクスポート API: filename には暗号化 ID(#export-id または input.cbItem の値)を指定する必要があります。#paramfilename は使用しないでください

コメント