Skip to content
Research
Skill

/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.

BOOST
From plugin
cnki-skills
98910 skills1 agent
Install
$ npx -y skills add cookjohn/cnki-skills --skill cnki-journal-search --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/cnki-journal-search

Context preview

The summary Claude sees to decide when to auto-load this skill.

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.

SKILL.md

cnki-journal-search.SKILL.md
name: cnki-journal-search
description: 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.
argument-hint: "[journal name or ISSN or CN number]"

CNKI Journal Search (期刊检索)

Arguments

`$ARGUMENTS` is a journal name, ISSN, CN number, or sponsor name.

Steps

1. Navigate

Use `mcp__chrome-devtools__navigate_page` → `https://navi.cnki.net/knavi`

2. Search + extract results (single evaluate_script, NO wait_for)

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 };
}

3. Present results

期刊检索 "$ARGUMENTS"(共 {count} 条):

1. {name}
   ISSN: {issn} | CN: {cn}
   复合影响因子: {cif} | 综合影响因子: {aif}
   被引: {citations} | 下载: {downloads}

Notes

  • Journal detail pages open in **new tab** — use `list_pages` + `select_page`
  • If only 1 journal result, can auto-navigate to detail page for `cnki-journal-index`
  • Search button selector: `input.researchbtn` (not generic `button`)

Captcha detection

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).

Tool calls: 2 (navigate + evaluate_script)

Read more
Ships withcnki-skills

CNKI (中国知网) skills for Claude Code — search, browse journals, download PDFs, export to Zotero via Chrome DevTools MCP

Get the whole plugin
Stats
994
Stars
83
Forks
Quiet
Maintenance
Python
Language
7mo ago
Last commit
7mo ago
Created
5h ago
Added

Repo: cookjohn/cnki-skills

Other skills on cnki-skills.