Skip to content
Research
Skill

/cnki-download

Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to download a specific paper.

BOOST
From plugin
cnki-skills
98910 skills1 agent
Install
$ npx -y skills add cookjohn/cnki-skills --skill cnki-download --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-download

Context preview

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

Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to download a specific paper.

SKILL.md

cnki-download.SKILL.md
name: cnki-download
description: Download a paper PDF/CAJ from CNKI. Requires user to be logged in. Use when user wants to download a specific paper.
argument-hint: "[paper URL or blank if already on detail page]"

CNKI Paper Download (文献下载)

Prerequisites

User **must be logged in** to CNKI with download permissions.

Arguments

`$ARGUMENTS` is optionally a paper detail URL. If blank, uses current page.

Steps

1. Navigate (if URL provided)

If URL provided: use `navigate_page` to go to the URL directly (no wait_for needed — Step 2 handles waiting).

**Important**: Always use `navigate_page` instead of clicking links on the search results page. Clicking opens a new tab and wastes 3 extra tool calls (`list_pages` + `select_page` + `take_snapshot`).

2. Check status and download (single async evaluate_script)

Replace `FORMAT` with `"pdf"` or `"caj"`:

async () => {
  // Wait for page load
  await new Promise((r, j) => {
    let n = 0;
    const c = () => {
      if (document.querySelector('.brief h1')) 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', message: 'CNKI 正在显示滑块验证码。请在 Chrome 中手动完成拼图验证。' };
  }

  const format = "FORMAT"; // "pdf" or "caj"

  // Check download links
  const pdfLink = document.querySelector('#pdfDown') || document.querySelector('.btn-dlpdf a');
  const cajLink = document.querySelector('#cajDown') || document.querySelector('.btn-dlcaj a');

  // Check login status
  const notLogged = document.querySelector('.downloadlink.icon-notlogged')
    || document.querySelector('[class*="notlogged"]');
  if (notLogged) {
    return { error: 'not_logged_in', message: '下载需要登录。请先在 Chrome 中登录知网账号。' };
  }

  const title = document.querySelector('.brief h1')?.innerText?.trim()?.replace(/\s*网络首发\s*$/, '') || '';

  if (format === 'pdf' && pdfLink) {
    pdfLink.click();
    return { status: 'downloading', format: 'PDF', title };
  } else if (format === 'caj' && cajLink) {
    cajLink.click();
    return { status: 'downloading', format: 'CAJ', title };
  } else if (pdfLink) {
    pdfLink.click();
    return { status: 'downloading', format: 'PDF', title };
  } else if (cajLink) {
    cajLink.click();
    return { status: 'downloading', format: 'CAJ', title };
  }

  return { error: 'no_download', message: '未找到下载链接', hasPDF: !!pdfLink, hasCAJ: !!cajLink };
}

3. Report

Based on JS result:

  • `status: downloading` → "PDF 下载已触发:{title}。请在 Chrome 下载管理器中查看。"
  • `error: not_logged_in` → tell user to log in
  • `error: captcha` → tell user to solve captcha

Tool calls: 1–2 (navigate_page if URL + evaluate_script)

Verified selectors

| Element | Selector | Notes | |---------|----------|-------| | PDF download | `#pdfDown` | `<a>` inside `li.btn-dlpdf` | | CAJ download | `#cajDown` | `<a>` inside `li.btn-dlcaj` | | Download area | `.download-btns` | parent `<div>` | | Not logged in | `.downloadlink.icon-notlogged` | | | Title | `.brief h1` | strip trailing "网络首发" |

Captcha detection

Check `#tcaptcha_transform_dy` element's `getBoundingClientRect().top >= 0`. Only active when `top >= 0` (visible). Pre-loaded SDK sits at `top: -1000000px`.

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.