mcpField
C
cnki-download

cnki-download

github.com/cookjohnドキュメント1.0k758 回インストール33 週間前に更新
リポジトリ

cnki-download について

cnki-downloadは、CNKIから論文をダウンロードするスキルです。現在のページまたは指定URLを使い、PDFとCAJに対応し、ログイン状態と認証画面を確認します。

主な機能

  1. 01現在のページやURLからダウンロード
  2. 02PDFとCAJ形式に対応
  3. 03ログイン状態と認証画面を確認
  4. 04論文タイトルを取得

活用シーン

  1. 01CNKI論文の全文ダウンロード
  2. 02ログインが必要かの確認
  3. 03認証画面への対応

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cookjohn/cnki-skills --skill cnki-download

インストール後、Claude Code で/cnki-downloadを入力して読み込まれたか確認します。

詳細

CNKI 論文のダウンロード(文献下载)

前提条件

ユーザーは、ダウンロード権限のある CNKI アカウントにログインしている必要があります。

引数

$ARGUMENTS は論文詳細ページの URL を指定できます(省略可)。空欄の場合は現在のページを使用します。

手順

1. 移動(URL が指定されている場合)

URL が指定されている場合:navigate_page を使って URL に直接移動します(wait_for は不要です。手順 2 で待機します)。

重要:検索結果ページのリンクをクリックする代わりに、必ず navigate_page を使用してください。クリックすると新しいタブが開き、追加で 3 回のツール呼び出し(list_pages + select_page + take_snapshot)が必要になります。

2. ステータスの確認とダウンロード(単一の非同期 evaluate_script)

FORMAT を "pdf" または "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. 結果の報告

JS の結果に基づいて、次のように対応します。

  • status: downloading → 「PDF のダウンロードを開始しました:{title}。Chrome のダウンロード マネージャーで確認してください。」
  • error: not_logged_in → ユーザーにログインするよう伝えます
  • error: captcha → ユーザーに CAPTCHA を解決するよう伝えます

ツール呼び出し:1~2 回(URL がある場合は navigate_page + evaluate_script)

確認済みセレクター

要素セレクター備考
PDF のダウンロード#pdfDownli.btn-dlpdf 内の <a>
CAJ のダウンロード#cajDownli.btn-dlcaj 内の <a>
ダウンロード領域.download-btns親の <div>
未ログイン.downloadlink.icon-notlogged
タイトル.brief h1末尾の「网络首发」を削除

CAPTCHA の検出

#tcaptcha_transform_dy 要素の getBoundingClientRect().top >= 0 を確認します。 top >= 0(表示されている)の場合にのみ有効です。事前読み込みされた SDK は top: -1000000px にあります。

コメント