mcpField
W
wos-download

wos-download

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

wos-download について

wos-downloadは、Web of Scienceの論文レコードからPDF全文の取得を試みるブラウザー操作スキルです。出版元のリンクをたどり、ダウンロード、ログイン要求、ペイウォールなどの状態を判定します。アクセス可否は機関の購読状況によります。

主な機能

  1. 01Web of Scienceレコードから全文リンクを抽出
  2. 02出版元ページへの移動
  3. 03PDF、ログイン要求、ペイウォールの判定
  4. 04所定形式でのダウンロードファイル名設定

活用シーン

  1. 01Web of Scienceの論文PDF取得を試みる
  2. 02機関アクセスを利用して出版元PDFを取得
  3. 03論文をダウンロードできない理由を特定

インストール

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

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

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

詳細

WoS ダウンロード

Web of Science から論文の全文 PDF をダウンロードします。

重要な制限事項

  • PDF へのアクセスは機関の購読状況によって異なります。オープンアクセス論文でも、出版社のサイトで認証が必要な場合があります。
  • クロスオリジンでのダウンロード:a.download の手法は、PDF を表示している同一オリジンのページをブラウザーで開いている場合にのみ機能します。クロスオリジンのリダイレクト(例:WoS → Wiley)では機能しません。
  • 出版社のログイン画面:Wiley、Elsevier、Springer などでは、機関プロキシを使わずにアクセスすると、オープンアクセス論文でもログインページにリダイレクトされる場合があります。

手順

ステップ 1:論文の詳細ページに移動する

すでに論文の詳細ページを開いている場合は不要です。

navigate_page({
  url: "{BASE_URL}/wos/woscc/full-record/{WOS_ID}",
  initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
ステップ 2:全文へのリンクを見つける
async () => {
  for (let i = 0; i < 20; i++) {
    if (document.querySelector('[data-ta="FullRTa-fullRecordtitle-0"]')) break;
    await new Promise(r => setTimeout(r, 500));
  }
  await new Promise(r => setTimeout(r, 1000));

  const title = document.querySelector('[data-ta="FullRTa-fullRecordtitle-0"]')?.textContent?.trim() || '';

  const links = [...document.querySelectorAll('a[data-ta^="FRLinkTa"]')].map(a => ({
    text: a.textContent?.trim()?.replace(/open_in_new/g, '').trim(),
    href: a.href,
    dataTa: a.getAttribute('data-ta')
  }));

  const doiEl = document.querySelector('a[href*="doi.org"]');
  const doi = doiEl?.href || '';

  return { title, links, doi };
}
ステップ 3:全文へのリンクを開く

出版社のリンクに移動します。

navigate_page({
  url: "{CHOSEN_LINK}",
  initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
ステップ 4:PDF の状態を確認してダウンロードを試みる
async () => {
  await new Promise(r => setTimeout(r, 5000));

  const url = window.location.href;
  const contentType = document.contentType;

  // Direct PDF — trigger download immediately
  if (contentType === 'application/pdf') {
    const a = document.createElement('a');
    a.href = url;
    a.download = '{FILENAME}';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    return { status: 'downloaded', url };
  }

  // Publisher HTML page — look for PDF links
  const pdfLinks = [...document.querySelectorAll('a')].filter(a => {
    const href = a.href || '';
    const text = a.textContent || '';
    return href.includes('/pdf/') || href.includes('.pdf') ||
           text.toLowerCase().includes('download pdf') || text.toLowerCase() === 'pdf';
  }).map(a => ({
    text: a.textContent?.trim()?.substring(0, 50),
    href: a.href?.substring(0, 120)
  }));

  // Check for access denial
  const bodyText = document.body.innerText?.substring(0, 1000) || '';
  const loginRequired = bodyText.includes('Sign in') || bodyText.includes('Log in') ||
                         bodyText.includes('Individual login') || bodyText.includes('Institutional login');
  const paywall = bodyText.includes('Purchase') || bodyText.includes('Subscribe') ||
                  bodyText.includes('Access Denied');

  return {
    status: loginRequired ? 'login_required' : paywall ? 'paywall' : pdfLinks.length > 0 ? 'pdf_links_found' : 'publisher_page',
    url: url.substring(0, 100),
    pdfLinks: pdfLinks.slice(0, 5),
    pageTitle: document.title
  };
}
ステップ 5:結果に応じて対応する
状態対応
downloaded成功を報告します。ファイルは既定のダウンロードフォルダーに保存されています
pdf_links_found出版社のページにある「PDF をダウンロード」リンクをクリックします
login_requiredユーザーに「出版社へのログインが必要です。機関の VPN/WebVPN 経由でアクセスするか、手動でダウンロードしてください」と伝えます
paywallユーザーに「この論文の閲覧には購読が必要です」と伝えます
publisher_pageユーザーに「出版社のページを開いていますが、PDF への直接リンクが見つかりません」と伝えます
出版社の「PDF をダウンロード」ボタンをクリックする

pdf_links_found の場合は、take_snapshot で「PDF をダウンロード」ボタンを見つけてから、click でクリックします。

1. take_snapshot → find "Download PDF" link uid
2. click(uid)
3. evaluate_script → wait 5s, check if PDF loaded (contentType === 'application/pdf')
4. If PDF loaded → trigger download with a.download

ファイル名の形式

{FirstAuthor}_{Year}_{ShortTitle}.pdf

例:Johnson_2025_Citizen-Centric_AI_Government.pdf

既知の問題

  • WoS ゲートウェイリンク(/api/gateway?...DestURL=...)は GetFTR を経由して出版社にリダイレクトされます。最終的なリンク先は、機関のアクセス権によって異なります。
  • Wiley:機関の Cookie がない場合、オープンアクセス論文でもログインページが表示されます。ePDF ビューアー(/doi/epdf/...)は iframe ベースのリーダーであり、ダウンロード可能な PDF ではありません。
  • Elsevier/ScienceDirect:機関にアクセス権がある場合は PDF が直接配信されることがあります。アクセス権がない場合は、抄録ページが表示されます。
  • ダウンロードを試みた後、SID が失われます:外部の出版社サイトに移動すると、WoS のパフォーマンスエントリーがクリアされます。WoS に戻ったら、URL ベースの検索を行うか、まず任意の WoS ページに移動して SID を再確立してください。

メモ

  • このスキルでは、3~4 回のツール呼び出しを使用します:論文の詳細ページに移動 + リンクを抽出 + 出版社に移動 + ダウンロード
  • PDF へのアクセスは機関の購読状況によって異なります
  • ナビゲーションのたびに必ず initScript を使用してください
  • ダウンロードに失敗した場合は、機関の VPN 経由でのアクセス、またはブラウザーでの手動ダウンロードを提案してください

コメント