From cnki-journal-search
Search for journals/publications on CNKI by name, ISSN, CN, or sponsor. Use when the user wants to find a specific journal or browse publications.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cnki-journal-search:cnki-journal-search [journal name or ISSN or CN number][journal name or ISSN or CN number]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
`$ARGUMENTS` is a journal name, ISSN, CN number, or sponsor name.
$ARGUMENTS is a journal name, ISSN, CN number, or sponsor name.
Use mcp__chrome-devtools__navigate_page → https://navi.cnki.net/knavi
Use mcp__chrome-devtools__evaluate_script. Replace QUERY_HERE with actual search term:
async () => {
const query = "QUERY_HERE";
// Wait for page load
await new Promise((r, j) => {
let n = 0;
const c = () => { if (document.querySelector('input.researchbtn')) r(); else if (++n > 30) j('timeout'); else setTimeout(c, 500); };
c();
});
// Check captcha (visible on screen, not hidden SDK at top:-1000000)
const outer = document.querySelector('#tcaptcha_transform_dy');
if (outer && outer.getBoundingClientRect().top >= 0) return { error: 'captcha' };
// Auto-detect search type and fill
const select = document.querySelector('select');
if (select) {
if (/^\d{4}-\d{3}[\dXx]$/.test(query)) select.value = 'ISSN';
else if (/^\d{2}-\d{4}/.test(query)) select.value = 'CN';
select.dispatchEvent(new Event('change', { bubbles: true }));
}
const input = document.querySelector('input[placeholder*="检索词"]');
if (input) input.value = query;
// Click search button (verified selector: input.researchbtn)
document.querySelector('input.researchbtn')?.click();
// Wait for results
await new Promise((r, j) => {
let n = 0;
const c = () => { if (document.body.innerText.includes('条结果')) r(); else if (++n > 30) j('timeout'); else setTimeout(c, 500); };
c();
});
// Click 期刊 tab to filter journals only
const tabs = document.querySelectorAll('li a');
for (const a of tabs) { if (a.innerText.trim() === '期刊') { a.click(); break; } }
await new Promise(r => setTimeout(r, 1500));
// Extract journal results
const body = document.body.innerText;
const countMatch = body.match(/共\s*(\d+)\s*条结果/) || body.match(/找到\s*(\d+)\s*条结果/);
const count = countMatch ? parseInt(countMatch[1]) : 0;
const results = [];
const titleLinks = document.querySelectorAll('a[href*="knavi/detail"]');
titleLinks.forEach(link => {
const text = link.innerText?.trim();
if (!text || text.length < 2) return;
const parent = link.closest('li, .list-item') || link.parentElement?.parentElement;
const pt = parent?.innerText || '';
results.push({
name: text.split('\n')[0]?.trim(),
url: link.href,
issn: pt.match(/ISSN[::]\s*(\S+)/)?.[1] || '',
cn: pt.match(/CN[::]\s*(\S+)/)?.[1] || '',
cif: pt.match(/复合影响因子[::]\s*([\d.]+)/)?.[1] || '',
aif: pt.match(/综合影响因子[::]\s*([\d.]+)/)?.[1] || '',
citations: pt.match(/被引次数[::]\s*([\d,]+)/)?.[1] || '',
downloads: pt.match(/下载次数[::]\s*([\d,]+)/)?.[1] || '',
sponsor: pt.match(/主办单位[::]\s*(.+?)(?=\n|ISSN)/)?.[1]?.trim() || ''
});
});
return { query, count, results };
}
期刊检索 "$ARGUMENTS"(共 {count} 条):
1. {name}
ISSN: {issn} | CN: {cn}
复合影响因子: {cif} | 综合影响因子: {aif}
被引: {citations} | 下载: {downloads}
list_pages + select_pagecnki-journal-indexinput.researchbtn (not generic button)Check #tcaptcha_transform_dy element's getBoundingClientRect().top >= 0.
Tencent captcha SDK preloads DOM at top: -1000000px (off-screen, not active).
Only return error: 'captcha' when top >= 0 (actually visible to user).
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub yuanyuanma03/academic-research-skills --plugin cnki-journal-search