mcpField
C
cnki-journal-search

cnki-journal-search

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

cnki-journal-search について

誌名、ISSN、CN 番号、または主催者名で CNKI の雑誌を検索するスキルです。検索結果から識別情報、インパクトファクター、被引用数、ダウンロード数を取得します。

主な機能

  1. 01誌名や識別番号で検索
  2. 02主催者名による検索
  3. 03ISSN と CN 番号の抽出
  4. 04影響指標・被引用数・DL 数の取得

活用シーン

  1. 01雑誌の ISSN と CN 番号の確認
  2. 02検索結果の影響指標や利用数の比較

MCP 対応

Chrome DevTools MCP で CNKI の雑誌検索ページを開き、検索を実行して結果を抽出します。

インストール

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

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

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

詳細

CNKI ジャーナル検索(期刊检索)

引数

$ARGUMENTS は、ジャーナル名、ISSN、CN 番号、または発行元名です。

手順

1. 移動

mcp__chrome-devtools__navigate_page を使用 → https://navi.cnki.net/knavi

2. 検索して結果を抽出(単一の evaluate_script、wait_for は使用しない)

mcp__chrome-devtools__evaluate_script を使用します。QUERY_HERE を実際の検索語に置き換えてください。

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. 結果を提示
期刊检索 "$ARGUMENTS"(共 {count} 条):

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

注意事項

  • ジャーナルの詳細ページは新しいタブで開きます。list_pages と select_page を使用してください
  • ジャーナルの検索結果が1件のみの場合、cnki-journal-index の詳細ページに自動で移動できます
  • 検索ボタンのセレクター:input.researchbtn(汎用的な button ではありません)

CAPTCHA の検出

#tcaptcha_transform_dy 要素の getBoundingClientRect().top >= 0 を確認してください。 Tencent の CAPTCHA SDK は DOM を top: -1000000px に事前読み込みします(画面外で、アクティブではありません)。 top >= 0(ユーザーに実際に表示されている)の場合にのみ、error: 'captcha' を返してください。

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

コメント