用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/cookjohn/sd-skills --skill sd-download命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | sd-download |
| description | Download PDF from ScienceDirect articles. Requires institutional or subscriber access. |
| argument-hint | [PII or article URL] |
| disable-model-invocation | true |
Download PDF files from ScienceDirect articles to the user's local disk.
If already on the article page, skip navigation. Otherwise use navigate_page with initScript:
navigate_page({
url: "{BASE_URL}/science/article/pii/{PII}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
Then extract the PDF URL with evaluate_script:
async () => {
// Wait for page to load
for (let i = 0; i < 20; i++) {
if (document.querySelector('a[href*="pdfft"]') || document.querySelector('.access-options')) break;
await new Promise(r => setTimeout(r, 500));
}
const pdfLink = document.querySelector('a[href*="pdfft"][class*="accessbar"]')
|| document.querySelector('a[href*="pdfft"]');
if (pdfLink) {
return { pdfUrl: pdfLink.href };
}
const noAccess = document.querySelector('.access-options, .get-access, [class*="GetAccess"]');
if (noAccess) {
return { error: 'No access. User needs institutional or subscriber access.' };
}
return { error: 'PDF link not found on this page.' };
}
Open the PDF URL with initScript:
navigate_page({
url: "{pdfUrl}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
After navigation, wait 5s then check the page state with evaluate_script:
async () => {
await new Promise(r => setTimeout(r, 5000));
return {
contentType: document.contentType,
title: document.title,
url: window.location.href.substring(0, 80)
};
}
Three possible outcomes:
A) contentType === 'application/pdf' → PDF loaded directly. Skip to Step 4.
B) Title is "Security verification" or body contains "Are you a robot" → Turnstile checkbox appeared. Auto-click:
take_snapshot to get the a11y tree. Find the checkbox inside the Cloudflare iframe:
Iframe "包含 Cloudflare 安全质询的小组件"
checkbox "确认您是真人" ← target uid
click(uid) on the checkbox element. (Chrome DevTools MCP works at CDP protocol level and can interact with cross-origin iframes.)document.contentType:
application/pdf → success, proceed to Step 4.C) Title is "请稍候…" → JS challenge still running. Wait another 5s and re-check. Usually resolves to A or B.
Once contentType === 'application/pdf', the PDF is displayed in browser but NOT saved to disk yet. Trigger the actual download with evaluate_script:
(pii) => {
const a = document.createElement('a');
a.href = window.location.href;
a.download = pii + '-main.pdf';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
return { downloaded: true, filename: pii + '-main.pdf' };
}
Pass the PII as an argument so the filename is meaningful (e.g. S0022169426003136-main.pdf).
Tell the user the PDF has been downloaded and the filename.
Note: Batch download requires authentication. Checkboxes and download buttons are only visible to logged-in users.
On the search results page, select articles using checkboxes. Each checkbox id is the PII.
Use evaluate_script:
(piis) => {
piis.forEach(pii => {
const cb = document.getElementById(pii);
if (cb && !cb.checked) cb.click();
});
const downloadBtn = document.querySelector('.download-all-link-button');
if (downloadBtn) {
downloadBtn.click();
return { success: true, message: 'Download initiated for selected articles.' };
}
const form = document.querySelector('form[action*="pdf/download"]');
if (!form) return { error: 'Download form not found. User may need to log in.' };
return { error: 'Download button not found.' };
}
{BASE_URL}/science/article/pii/{PII}/pdfft?md5={HASH}&pid=1-s2.0-{PII}-main.pdf
The md5 hash is unique per article and session. It cannot be constructed — it must be extracted from the page.
disable-model-invocation: true — it must be explicitly invoked with /sd-download.