cnki-export について
CNKIの論文引用データをZoteroやRISに出力し、GB/T 7714形式の引用文も作成するスキルです。個別論文と検索結果の一括処理に対応します。
主な機能
- 01論文データの個別・一括出力
- 02Zoteroへの項目送信
- 03RISファイルへの保存
- 04GB/T 7714形式の引用生成
活用シーン
- 01CNKIの検索結果を一括でZoteroに追加
- 02論文詳細ページから引用データを保存
- 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 URL | https://kns.cnki.net/dm8/API/GetExport | 固定。どのページからでも動作 |
| filename | 暗号化 ID | 詳細ページ:#export-id;検索結果ページ:input.cbItem の値 |
| displaymode | GBTREFER,elearning,EndNote | カンマ区切りのモード |
| uniplatform | NZKPT | 必須 |
確認済みのセレクター
| 要素 | セレクター | ページ |
|---|---|---|
| エクスポート 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は使用しないでください