一键导入
cnki-export
Export paper from CNKI and push to Zotero, or save as RIS file. Use when user wants to save a paper to Zotero or export citation data.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Export paper from CNKI and push to Zotero, or save as RIS file. Use when user wants to save a paper to Zotero or export citation data.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | cnki-export |
| description | Export paper from CNKI and push to Zotero, or save as RIS file. Use when user wants to save a paper to Zotero or export citation data. |
| argument-hint | [zotero|ris|gb] [paper URL or blank if on detail page] |
RC browser tool: navigate with
browser action=open url="..."; run the JS in each step viabrowser action=act kind=evaluate fn="<the async function shown>"(the whole function body goes intofn). Never pass aprofile— RC uses its default managed Chrome (CDP 18800).
Export paper citation data from CNKI and push directly to Zotero, or save as RIS file.
zotero (default) — push to Zotero desktop via local APIris — save as .ris filegb — output GB/T 7714 citation textChoose the right mode based on context:
| Context | Mode | Tool calls |
|---|---|---|
| On a paper detail page | Single export (Step 1A) | 1 evaluate + 1 bash = 2 |
| On a search results page, save all/selected | Batch export (Step 1B) | 1 evaluate + 1 bash = 2 |
| Need to search then save | Use cnki-search first, then batch export | 4 total |
Always prefer batch export (1B) when multiple papers need saving. It avoids navigating to each detail page (saves ~3 calls per paper).
Use browser action=act kind=evaluate:
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;
}
On any CNKI search results page, extract checkbox values and call the export API directly — no need to navigate to detail pages.
Key discovery: input.cbItem checkbox value === detail page #export-id (same encrypted ID).
Use browser action=act kind=evaluate:
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
}
To export only specific papers (e.g. #1, #3, #5), filter by index:
// 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
}
Save the export data (single object or JSON array) to a temp file, then run the Python script:
python3 skills/cnki-export/scripts/push_to_zotero.py /tmp/papers.json
The Python script handles both single paper {} and batch [{}, {}, ...] JSON input.
POST http://127.0.0.1:23119/connector/saveItemsSingle:
已将论文添加到 Zotero:
标题: {title}
作者: {authors}
期刊: {journal}
GB/T 7714 引用: {gbt_citation}
Batch:
已批量添加 {count} 篇论文到 Zotero:
1. {title1} ({journal1})
2. {title2} ({journal2})
...
| Parameter | Value | Source |
|---|---|---|
| API URL | https://kns.cnki.net/dm8/API/GetExport | Fixed, works from any page |
| filename | Encrypted ID | Detail page: #export-id; Results page: input.cbItem value |
| displaymode | GBTREFER,elearning,EndNote | Comma-separated modes |
| uniplatform | NZKPT | Required |
| Element | Selector | Page |
|---|---|---|
| Export URL | #export-url | Detail page only |
| Export ID | #export-id | Detail page only |
| Checkbox (= export ID) | input.cbItem | Search results page |
| Result rows | .result-table-list tbody tr | Search results page |
| Title link | td.name a.fz14 | Search results page |
POST http://127.0.0.1:23119/connector/saveItems
Content-Type: application/json
X-Zotero-Connector-API-Version: 3
Response: 201 = created, 500 = error Collection: Saves to Zotero's currently selected collection.
Query collections:
python3 skills/cnki-export/scripts/push_to_zotero.py --list
localhost:23119 requires Zotero desktop in backgroundname field (single field, not split), creatorType: "author"filename must be encrypted ID (#export-id or input.cbItem value), NOT #paramfilenameMain orchestration workflow for systematic literature research - search, evaluate, traverse, synthesize via the rp_* tools pipeline (Scopus + OpenAlex)
Collaboratively build and refine paper screening rubrics through brainstorming, test-driven development, and iterative feedback
Safely remove intermediate files from completed research sessions while preserving important data
Perform advanced search on CNKI with field filters like author, title, journal, date range, source category (SCI/EI/CSSCI/北大核心). Use when user needs precise filtered search beyond simple keywords.
Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to download a specific paper.
Query journal indexing/inclusion status on CNKI - check which databases include a journal (北大核心, CSSCI, CSCD, SCI, EI, etc.), get impact factors and evaluation data. Use when user asks about a journal's level, indexing, or ranking.