mcpField
C
cnki-advanced-search

cnki-advanced-search

github.com/cookjohn生産性1.0k739 回インストール33 週間前に更新
リポジトリ

cnki-advanced-search について

自然言語の条件から CNKI を絞り込んで検索するスキルです。項目、著者、出典、期間、出典カテゴリを指定し、結果件数を取得できます。

主な機能

  1. 01条件を検索項目に振り分け
  2. 02著者・雑誌・期間で絞り込み
  3. 03SCI、EI、CSSCI などを選択
  4. 04検索結果件数の取得

活用シーン

  1. 01期間と出典カテゴリを指定した論文検索
  2. 02著者や雑誌による検索範囲の絞り込み

MCP 対応

Chrome DevTools MCP で CNKI に移動し、条件を入力して検索し、結果を読み取ります。

インストール

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

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

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

詳細

CNKI 詳細検索(高级检索)

旧形式の詳細検索インターフェース(出典カテゴリのチェックボックスがある唯一のインターフェース)を使用して、CNKI で絞り込み検索を実行します。

引数

$ARGUMENTS は、検索条件を自然言語で記述したものです。以下を特定してください。

  • 主題キーワード(主题)— デフォルトのフィールド
  • タイトルキーワード(篇名)
  • キーワード(关键词)
  • 著者名(作者)— 独立したフィールド #au_1_value1
  • 雑誌/出典(文献来源)— 独立したフィールド #magazine_value1
  • 期間(时间范围)— #startYear / #endYear
  • 出典カテゴリ(来源类别:SCI、EI、北大核心、CSSCI、CSCD)

手順

1. 移動

mcp__chrome-devtools__navigate_page を使用 → https://kns.cnki.net/kns/AdvSearch?classid=7NS01R8M

2. 検索して結果を取得(単一の非同期 evaluate_script)

プレースホルダーの値を実際の検索条件に置き換えてください。

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
  };
}
3. 報告

詳細検索:「{query}」({fieldType})+ 出典:{sourceTypes} → {total} 件の結果。

ツール呼び出し:2 回(navigate + evaluate_script)

検証済みセレクター(旧形式のインターフェース)

フォームフィールド
要素セレクター/選択インデックス備考
行1 フィールドタイプselects[0]SU=主題、TI=篇名、KY=キーワード、TKA=篇関摘、AB=抄録
行1 キーワード#txt_1_value1主キーワード入力欄
行1 行内の第2キーワード#txt_1_value2同じ行の最初のキーワードとの AND/OR/NOT
行1 行内論理selects[2]AND=含む、OR=または含む、NOT=含まない
行間論理selects[5]AND=かつ、OR=または、NOT=含まない
行2 フィールドタイプselects[6]行1と同じ選択肢
行2 キーワード#txt_2_value12行目のキーワード
行2 行内の第2キーワード#txt_2_value2
著者#au_1_value1プレースホルダー「中国語名/英語名/ピンイン」
著者所属#au_1_value2プレースホルダー「正式名称/略称/旧称」
文献出典#magazine_value1プレースホルダー「雑誌名/ISSN/CN」
基金#base_value1
開始年selects[14] / #startYear<select> 1915~2026
終了年selects[15] / #endYear<select> 2026~1915
検索ボタンdiv.searchinput/button ではありません
出典タイプのチェックボックス(来源类型)
出典チェックボックス ID備考
全雑誌#gjAllデフォルトで選択済み。他を選択する前に選択解除が必要
SCI 出典雑誌#SCIvalue="Y"
EI 出典雑誌#EIvalue="Y"
北大コア雑誌#hxvalue="Y"
CSSCI#CSSCIvalue="Y"
CSCD#CSCDvalue="Y"

複数の出典タイプを同時に選択できます(OR 論理)。

結果
要素セレクター備考
結果件数.pagerTitleCellテキスト「共找到 X 条结果」
ページ表示.countPageMarkテキスト「1/300」

CAPTCHA の検出

#tcaptcha_transform_dy 要素の getBoundingClientRect().top >= 0 を確認してください。

重要な注意事項

  • 旧形式の URL(kns.cnki.net/kns/AdvSearch)を必ず使用してください。新しいインターフェース(kns8s/AdvSearch)には出典カテゴリのチェックボックスがありません。
  • classid=7NS01R8M パラメーターにより、正しいフォームレイアウトが読み込まれます。
  • 結果ページは cnki-parse-results および cnki-navigate-pages スキルに対応しています。

コメント