用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/cookjohn/wos-skills --skill wos-download命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | wos-download |
| description | Download PDF full text for a WoS paper via publisher links. |
| argument-hint | [WoS ID or DOI] |
| user-invocable | true |
| disable-model-invocation | true |
Download PDF full text for a paper from Web of Science.
a.download trick only works when the browser is on the same-origin page displaying the PDF. It does NOT work for cross-origin redirects (e.g., WoS → Wiley).If not already on the full record page:
navigate_page({
url: "{BASE_URL}/wos/woscc/full-record/{WOS_ID}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
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.();
doi = doiEl?. || ;
{ title, links, doi };
}
Navigate to the publisher link:
navigate_page({
url: "{CHOSEN_LINK}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
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.() || href.() ||
text.().() || text.() === ;
}).( ({
: a.?.()?.(, ),
: a.?.(, )
}));
bodyText = ..?.(, ) || ;
loginRequired = bodyText.() || bodyText.() ||
bodyText.() || bodyText.();
paywall = bodyText.() || bodyText.() ||
bodyText.();
{
: loginRequired ? : paywall ? : pdfLinks. > ? : ,
: url.(, ),
: pdfLinks.(, ),
: .
};
}
| Status | Action |
|---|---|
downloaded | Report success, file saved to default download folder |
pdf_links_found | Click the "Download PDF" link on the publisher page |
login_required | Inform user: "Publisher requires login. Try accessing via institutional VPN/WebVPN or download manually." |
paywall | Inform user: "This paper requires a subscription." |
publisher_page | Inform user: "On publisher page but no direct PDF link found." |
If pdf_links_found, use take_snapshot to find the Download PDF button, then click it:
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
Example: Johnson_2025_Citizen-Centric_AI_Government.pdf
/api/gateway?...DestURL=...) redirect through GetFTR to publisher. The final destination depends on institutional access./doi/epdf/...) is an iframe-based reader, not a downloadable PDF.initScript on every navigation基于 SOC 职业分类