cnki-download
Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to…
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.
$ npx -y skills add cookjohn/cnki-skills --skill cnki-advanced-search --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/cnki-advanced-searchContext preview
The summary Claude sees to decide when to auto-load this skill.
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.
name: cnki-advanced-search description: 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. argument-hint: "[describe search criteria in natural language]"
Perform a filtered search on CNKI using the **old-style** advanced search interface (only interface with source category checkboxes).
`$ARGUMENTS` describes the search criteria in natural language. Parse it to identify:
Use `mcp__chrome-devtools__navigate_page` → `https://kns.cnki.net/kns/AdvSearch?classid=7NS01R8M`
Replace placeholder values with actual search criteria:
async () => {
// --- Config: fill in actual values ---
const query = "KEYWORDS"; // row 1 search keywords
const fieldType = "SU"; // SU=主题, TI=篇名, KY=关键词, TKA=篇关摘, AB=摘要
const query2 = ""; // row 2 keywords (optional, "" to skip)
const fieldType2 = "KY"; // row 2 field type
const rowLogic = "AND"; // AND=并且, OR=或者, NOT=不含 (between row 1 and 2)
const sourceTypes = ["CSSCI"]; // any of: "SCI", "EI", "hx", "CSSCI", "CSCD" ([] = all)
const startYear = ""; // e.g. "2020" or "" for no limit
const endYear = ""; // e.g. "2025" or "" for no limit
const author = ""; // author name or ""
const journal = ""; // journal name or ""
// --- Wait for form ---
await new Promise((r, j) => {
let n = 0;
const c = () => { if (document.querySelector('#txt_1_value1')) r(); else if (n++ > 30) j('timeout'); else setTimeout(c, 500); };
c();
});
// Captcha check
const cap = document.querySelector('#tcaptcha_transform_dy');
if (cap && cap.getBoundingClientRect().top >= 0) return { error: 'captcha' };
const selects = Array.from(document.querySelectorAll('select')).filter(s => s.offsetParent !== null);
// --- Source type: uncheck 全部, check targets ---
if (sourceTypes.length > 0) {
const gjAll = document.querySelector('#gjAll');
if (gjAll && gjAll.checked) gjAll.click();
for (const st of sourceTypes) {
const cb = document.querySelector('#' + st);
if (cb && !cb.checked) cb.click();
}
}
// --- Row 1: field type + keyword ---
selects[0].value = fieldType;
selects[0].dispatchEvent(new Event('change', { bubbles: true }));
const input = document.querySelector('#txt_1_value1');
input.value = query;
input.dispatchEvent(new Event('input', { bubbles: true }));
// --- Row 2: field type + keyword (optional) ---
if (query2) {
selects[5].value = rowLogic; // row logic: AND/OR/NOT
selects[5].dispatchEvent(new Event('change', { bubbles: true }));
selects[6].value = fieldType2;
selects[6].dispatchEvent(new Event('change', { bubbles: true }));
const input2 = document.querySelector('#txt_2_value1');
input2.value = query2;
input2.dispatchEvent(new Event('input', { bubbles: true }));
}
// --- Author (optional) ---
if (author) {
const auInput = document.querySelector('#au_1_value1');
if (auInput) { auInput.value = author; auInput.dispatchEvent(new Event('input', { bubbles: true })); }
}
// --- Journal (optional) ---
if (journal) {
const magInput = document.querySelector('#magazine_value1');
if (magInput) { magInput.value = journal; magInput.dispatchEvent(new Event('input', { bubbles: true })); }
}
// --- Date range (optional) ---
if (startYear) { selects[14].value = startYear; selects[14].dispatchEvent(new Event('change', { bubbles: true })); }
if (endYear) { selects[15].value = endYear; selects[15].dispatchEvent(new Event('change', { bubbles: true })); }
// --- Submit ---
document.querySelector('div.search')?.click();
// Wait for results
await new Promise((r, j) => {
let n = 0;
const c = () => {
if (document.body.innerText.includes('条结果')) r();
else if (n++ > 40) j('timeout');
else setTimeout(c, 500);
};
setTimeout(c, 2000);
});
// Captcha check again
const cap2 = document.querySelector('#tcaptcha_transform_dy');
if (cap2 && cap2.getBoundingClientRect().top >= 0) return { error: 'captcha' };
return {
query, fieldType, query2, fieldType2, rowLogic,
sourceTypes, startYear, endYear, author, journal,
total: document.querySelector('.pagerTitleCell')?.innerText?.match(/([\d,]+)/)?.[1] || '0',
page: document.querySelector('.countPageMark')?.innerText || '1/1',
url: location.href
};
}> Advanced search: "{query}" ({fieldType}) + source: {sourceTypes} → {total} results.
| Element | Selector / Select index | Notes | |---------|------------------------|-------| | 行1 字段类型 | `selects[0]` | SU=主题, TI=篇名, KY=关键词, TKA=篇关摘, AB=摘要 | | 行1 关键词 | `#txt_1_value1` | main keyword input | | 行1 行内第二词 | `#txt_1_value2` | same-row AND/OR/NOT with first keyword | | 行1 行内逻辑 | `selects[2]` | AND=并含, OR=或含, NOT=不含 | | **行间逻辑** | `selects[5]` | **AND=并且, OR=或者, NOT=不含** | | 行2 字段类型 | `selects[6]` | same options as row 1 | | 行2 关键词 | `#txt_2_value1` | second row keyword | | 行2 行内第二词 | `#txt_2_value2` | | | 作者 | `#au_1_value1` | placeholder "中文名/英文名/拼音" | | 作者单位 | `#au_1_value2` | placeholder "全称/简称/曾用名" | | 文献来源 | `#magazine_value1` | placeholder "期刊名称/ISSN/CN" | | 基金 | `#base_value1` | | | 起始年 | `selects[14]` / `#startYear` | `<select>` 1915-2026 | | 结束年 | `sele
CNKI (中国知网) skills for Claude Code — search, browse journals, download PDFs, export to Zotero via Chrome DevTools MCP
Repo: cookjohn/cnki-skills
Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to…
Export paper from CNKI and push to Zotero, or save as RIS file. Use when user wants to save a…
Query journal indexing/inclusion status on CNKI - check which databases include a journal…
Search for journals/publications on CNKI by name, ISSN, CN, or sponsor. Use when the user…
Browse journal issues, view table of contents, and download original TOC PDF from CNKI. Use…
Navigate CNKI search result pages (next/previous/specific page) or change sort order. Use…