CommunityPesquisa e Análise de Dadosgithub.com

GreenWich-art/agent-skills

Baixe artigos biomédicos de acesso aberto em PDF do PMC com resolução offline de Proof-of-Work. Gatilhos: 下载文献PDF, PMC PDF, 403/404 em links PDF, Preparando para baixar, página reCAPTCHA, texto completo OA, arquivos suplementares, baixar PDF do artigo.

O que é agent-skills?

Esta habilidade permite que agentes de IA baixem artigos biomédicos de acesso aberto (OA) em PDF diretamente do PubMed Central (PMC), mesmo quando protegidos por desafios Proof-of-Work (PoW). Ela implementa uma cadeia de fallback robusta: primeiro tenta texto estruturado via EuropePMC, depois localiza PDFs via Unpaywall, segue com resolução offline de PoW para PDFs do PMC, tenta materiais suplementares e, por fim, recorre a links diretos de editoras (com suporte a contorno via navegador). A habilidade é compatível com Claude Code, Cursor, Codex e outras ferramentas de terminal de IA, oferecendo um script Python (`scripts/pmc_pdf.py`) que automatiza a descoberta do nome real do arquivo PDF (extraído da tag `citation_pdf_url`), resolve o PoW localmente (SHA-256 com nonce) e lida com limites de taxa e reCAPTCHA. Inclui verificações de integridade pós-download e orientações sobre ética de uso, como evitar download em massa e respeitar acordos de assinatura institucional.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/GreenWich-art/agent-skills/tree/HEAD/skills/pmc-oa-pdf-fetch

Installed? Explore more Pesquisa e Análise de Dados skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

PMC / OA – Obtenção de PDF de Literatura

Pré-requisitos

Apenas para artigos de Acesso Aberto (OA) (CC BY / CC BY-NC / CC BY-NC-ND, etc.). Não use para contornar paywalls de artigos assinados – isso constitui violação de direitos autorais. Verifique o status OA: Unpaywall retorna is_oa: true ou EuropePMC isOpenAccess: Y.

Cenário de Assinatura Institucional (Complemento Importante)

Quando a universidade/instituição do usuário possui assinatura de banco de dados da editora, o download manual de artigos individuais é totalmente compatível dentro dos termos de licença, mas é necessário atentar para:

  • Rede do campus / IP institucional: As editoras reconhecem o IP, não o usuário. O 5º nível da cadeia de fallback (link direto da editora) geralmente retorna 200 sem bloqueio do Cloudflare – nesse caso, o pipeline desta skill pode obter diretamente o conteúdo assinado, sem qualquer lógica de login.
  • Acesso externo: Priorize o uso de VPN institucional (transparente para scripts, configurada uma vez); WebVPN (proxy baseado em reescrita de URL) não é suportado devido às regras variáveis entre instituições e à necessidade de cookies de sessão.
  • Não implemente automação de login Shibboleth/OpenAthens: Requer armazenamento local de credenciais, representando risco de segurança; além disso, os fluxos IdP variam muito entre instituições, inviabilizando uma implementação genérica.
  • Linha vermelha para download em massa: Quase todas as licenças institucionais de editoras diferenciam entre download manual individual e downloading sistemático/em massa. Mesmo com assinatura, a coleta automatizada em massa viola os termos, podendo levar ao bloqueio de todo o bloco de IPs da instituição. Para necessidades reais de mineração de texto completo em larga escala, solicite a API TDM (Text Mining) da editora (ex.: Elsevier TDM API, Springer Nature Meta API) pelos canais oficiais de cota, em vez de usar esta skill para loops em massa.

Cadeia de Fallback (Ordem Estrita)

PrioridadeViaComando / EndpointDescrição
1EuropePMC Texto Completo Estruturadohttps://www.ebi.ac.uk/europepmc/webservices/rest/{PMCID}/fullTextXMLMais estável. Extrai estrutura de texto completo com precisão de subtítulos. Retorna JATS XML
2Unpaywall localiza localização OAhttps://api.unpaywall.org/v2/{DOI}[email protected]Lê oa_locations[].url_for_pdf, fornece link direto para PDF
3Resolução PoW do PMCscripts/pmc_pdf.py <PMCID> <out.pdf>Veja abaixo. Solução principal para obter PDF do artigo
4EuropePMC Materiais Suplementareshttps://www.ebi.ac.uk/europepmc/webservices/rest/{PMCID}/supplementaryFilesRetorna ZIP: imagens originais (gr1…=Figura 1…) + PDF de material suplementar (mmc1.pdf)
5Link direto da editoraCada editora .../article-pdf/...Geralmente retorna 403 (Cloudflare). Tente por último

Endpoints Confirmadamente Inválidos (Não Perca Tempo)

  • …/rest/{PMCID}/fullTextPDF → 404 (obsoleto)
  • …/rest/{PMCID}/fulltextRepo → 403
  • https://europepmc.org/articles/{PMCID}?pdf=render → 403
  • https://europepmc.org/backend/ptpmcrender.fcgi?accid=…&blobtype=pdf → 403
  • https://www.ncbi.nlm.nih.gov/pmc/utils/oa/oa.fcgi?id=… → 404 (serviço OA migrado)
  • Páginas de artigo ashpublications.org ficam presas no desafio Cloudflare "Aguarde…" em navegadores headless, não utilizável

★ Pré-requisito: Nome do arquivo PDF do PMC não é fixo, deve ser resolvido primeiro

O nome do arquivo em https://pmc.ncbi.nlm.nih.gov/articles/{PMCID}/pdf/<nome>.pdf varia conforme periódico e ano. Codificar main.pdf resultará em 404 na maioria dos casos.

Periódico testadoNome real do arquivo
Am J Hematolmain.pdf
Blood Advancesmain.pdf
HemaSphereHEM3-10-e70338.pdf
Am J HematolAJH-101-1790.pdf
Liver InternationalLIV-46-0.pdf
Haematologica111300.pdf (volume 111 + página inicial 300, abreviatura do periódico omitida)
Blood (manuscrito NIH)nihms-2192199.pdf

Método de resolução (por prioridade; múltiplos testes acertaram o 1º em todos os casos)

  1. Tag <meta name="citation_pdf_url" content="https://pmc.ncbi.nlm.nih.gov/articles/{PMCID}/pdf/XXX.pdf"> na página do artigo ← Mais confiável
  2. grep -oE 'href="[^"]*?/pdf/[^"]+?\.pdf"' pegue o primeiro resultado
  3. Fallback pdf/main.pdf

Padrões de nomenclatura (não confiáveis, apenas para referência): Periódicos Wiley OA frequentemente <abreviatura>-<volume impresso>-0.pdf (ex.: LIV-46-0.pdf); com número de artigo <abreviatura>-<volume>-<número_artigo>.pdf (ex.: HEM3-10-e70338.pdf); mesmo periódico <abreviatura>-<volume>-<página_inicial>.pdf (ex.: AJH-101-1790.pdf); também há variante "volume+página inicial, sem abreviatura" (ex.: 111300.pdf da Haematologica = volume 111 + página inicial 300).

Ao buscar a página do artigo, descarte cookies: Use uma requisição independente, sem manter cookies, para ler a página; a requisição do PDF ainda deve ser iniciada de uma sessão de cookies nova. Se levar ncbi_sid / ncbi_pinger gerados pela página do artigo para a requisição do PDF, será imediatamente elevado para reCAPTCHA (testado). scripts/pmc_pdf.py já implementa isso.

Solução Principal: Resolução Offline do Proof-of-Work do PMC

Princípio

https://pmc.ncbi.nlm.nih.gov/articles/{PMCID}/pdf/<nome>.pdf alterna entre dois tipos de página de desafio com base em estratégia de risco:

  • Página PoW (1817 bytes, título Preparing to download ...) → Resolvível offline, este é o canal que queremos.
  • Página reCAPTCHA (~20 KB, título contém reCAPTCHA) → Não resolvível offline.

Chave para acionar PoW em vez de reCAPTCHA: Use User-Agent simplificado e não acesse a página do artigo antes de solicitar o PDF.

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)

Contraexemplos (elevam para reCAPTCHA, testados):

  • UA completo do Chrome (…AppleWebKit/537.36 … Chrome/1xx.0.0.0 Safari/537.36)
  • Primeiro fazer GET da página do artigo (carregando ncbi_sid / ncbi_pinger) e depois solicitar o PDF

Algoritmo PoW (reversamente engenheirado de pow-*.js, confirmado)

A página PoW contém quatro constantes embutidas: POW_CHALLENGE / POW_DIFFICULTY / POW_COOKIE_NAME / POW_COOKIE_PATH.

  1. Encontre o menor inteiro não negativo nonce tal que sha256(challenge + str(nonce)).hexdigest() comece com '0' * difficulty;
  2. Defina o Cookie: <POW_COOKIE_NAME> = challenge + "," + nonce (caminho = POW_COOKIE_PATH);
  3. Com esse Cookie e Referer: https://pmc.ncbi.nlm.nih.gov/articles/{PMCID}/, refaça a requisição ao link direto do PDF → Deve retornar 200 com Content-Type: application/pdf.

difficulty típico = 4 (cerca de 65536 hashes, concluído em submilissegundo localmente).

Script Único

# Recomendado: resolve automaticamente o nome real do PDF (via citation_pdf_url) e resolve o PoW offline
python3 scripts/pmc_pdf.py PMC13575452 ./out.pdf

# Se já resolveu o nome do arquivo, pode especificar diretamente, pulando a requisição à página do artigo
python3 scripts/pmc_pdf.py PMC13575452 ./out.pdf --pdf-name LIV-46-0.pdf

# Modo silencioso (apenas linha de resultado)
python3 scripts/pmc_pdf.py PMC13575452 ./out.pdf --quiet

Comportamento do script: Primeiro, com UA simplificado descartando cookies, solicita a página do artigo para resolver o link real do PDF → depois, com sessão de cookies nova, faz uma requisição fria a esse link → se obtiver diretamente o PDF, salva; caso contrário, resolve as constantes PoW, encontra o nonce, preenche o Cookie e tenta novamente. Se precisar forçar a reobtenção do desafio, basta reexecutar (o script não persiste cookies, cada execução é uma sessão nova).

★★ Duas regras rígidas que devem ser lembradas (lições amargas testadas)

1. O segundo parâmetro posicional é o caminho completo do arquivo de saída, não um diretório. Passar um diretório lançará IsADirectoryError: [Errno 21] Is a directory depois de já ter obtido o PDF, desperdiçando a resolução PoW e o PDF obtido. ❌ pmc_pdf.py PMC13482240 --outdir /caminho/para/dir  ✅ pmc_pdf.py PMC13482240 /caminho/para/dir/xxx.pdf

2. O canal de PDF do PMC tem característica de "uma única oportunidade". A primeira requisição fria geralmente passa pelo PoW e obtém o PDF verdadeiro; requisitar o mesmo PDF novamente imediatamente após quase certamente será elevado para reCAPTCHA (não é um rate limit comum que "basta trocar o UA"). Portanto, acerte o caminho de saída na primeira vez, absolutamente não "teste antes". Testado: primeira rodada status=200 type=application/pdf bytes=23970819, segundos depois a mesma URL retorna type=text/html bytes=21329 (página de desafio reCAPTCHA). Uma vez perdida essa oportunidade, vá diretamente para a rota de fallback da editora na próxima seção, não fique repetindo no PMC.

Solução de Problemas

SintomaCausaAção
Retorna HTML com POW_CHALLENGEEntrou no canal PoW (normal)Deixe o script resolver
Retorna HTML com recaptchaElevado para reCAPTCHATroque para UA simplificado, limpe cookies da sessão, espere e tente novamente; se ainda falhar, use vias 4/5
404 / "Article not found"Nome do arquivo PDF erradoVolte à página do artigo e resolva citation_pdf_url, não codifique main.pdf
nonce não convergedifficulty aumentadoVerifique difficulty; se >5, considere resolução assíncrona ou multiprocessamento
Resolução bem-sucedida mas PDF ainda é HTMLCookie domain/path incorretoConfirme cookie domain como pmc.ncbi.nlm.nih.gov e path como POW_COOKIE_PATH
IsADirectoryError: Is a directoryParâmetro de saída tratado como diretórioO segundo parâmetro é o caminho completo do arquivo de saída. Neste ponto, o PDF já foi obtido mas não salvo – não reexecute imediatamente (acionará reCAPTCHA), corrija o caminho e, se já elevado, vá para a rota da editora
Primeira vez bem-sucedida, segunda imediatamente reCAPTCHARate limit de "uma oportunidade" do PMC para o mesmo caminho de PDFVeja a regra rígida 2 acima; abandone o PMC, vá para a rota de fallback da editora
citation_pdf_url retorna -mmc1.pdfO PDF do artigo não está no repositório, resolveu para material suplementarComum em periódicos como Blood (texto completo JATS disponível mas PDF do artigo não). Abandone imediatamente a rota PMC, não use material suplementar como se fosse o artigo (testado)

★ Existe rate limit a nível de IP (testado) Após solicitar repetidamente PDFs do PMC em curto período (ex.: baixar vários artigos consecutivos), mesmo com UA simplificado correto, será diretamente elevado para reCAPTCHA, e aguardar 45 segundos ainda não recupera. Padrão: "primeira bem-sucedida, todas subsequentes falham". Ação: ① Em downloads em lote, deixe intervalo suficiente entre requisições; ② Uma vez em estado reCAPTCHA, não tente repetidamente (só prolonga o bloqueio), mude para outras tarefas ou use a via 4 (supplementaryFiles) e links diretos da editora; ③ Se houver necessidade real de múltiplos artigos, baixe sob demanda em vez de pré-aquecer em lote.

★★ Rota de Fallback: Quando o PMC está travado por reCAPTCHA, use o site da editora (testado e eficaz)

Quando o link direto do PMC for duas vezes elevado para reCAPTCHA (rate limit a nível de IP, não recupera após espera) e o periódico alvo for totalmente OA, usar o site da editora é mais confiável do que continuar tentando o PMC:

UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
# 1) Resolução de DOI → observe em qual página de artigo da editora cai
curl -s -o /dev/null -w "final: %{url_effective}\nHTTP: %{http_code}\n" -A "$UA" -L "https://doi.org/<DOI>"
# 2) Na página do artigo, resolva o link direto real do PDF
curl -s -A "$UA" "https://<publisher-article-page>" | grep -oiE '<meta name="citation_pdf_url"[^>]*>|href="[^"]*\.pdf[^"]*"' | sort -u | head
# 3) Baixe diretamente com Referer (editoras quase não validam Referer, mas é mais seguro)
curl -sL --retry 3 -A "$UA" -e "$ARTICLE_PAGE" -o "$OUT" "$PDF_URL"

★★ Quando a página da editora está completamente bloqueada pelo Cloudflare: Use o navegador "Imprimir como PDF" (testado e eficaz)

O ashpublications.org (periódicos ASH) nesta rodada apresentou bloqueio completo do Cloudflare, com a experiência anterior de "esperar 10 s e abrir" não se repetindo. Caminho alternativo eficaz:

  1. Abra a página de texto completo do PMC (não o PDF), contornando o site da editora
  2. Use a ferramenta de impressão do navegador para salvar a página como PDF: agent-browser pdf
  3. Quando o reCAPTCHA aparecer pela primeira vez, execute open novamente para passar

Ponto de decisão: Se o periódico alvo pertence a ASH / ScienceDirect com forte proteção Cloudflare, não fique repetindo com curl – baixa taxa de sucesso e agrava o bloqueio. Vá diretamente para o canal do navegador.

  • Testado e viável: Haematologica / Ferrata Storti – doi.org/10.3324/haematol.2025.287698 → haematologica.org/article/view/12187 → haematologica.org/article/download/12187/78653 → 2.91 MB / 14 páginas.
  • Não viável: Editoras com bloqueio do tipo Cloudflare (ASH ashpublications.org, Wiley onlinelibrary.wiley.com/doi/pdfdirect/..., De Gruyter, Thieme) – essas só podem ser acessadas pelo canal PMC ou sessão de navegador.
  • Julgamento prévio: Apenas periódicos totalmente OA / Gold OA valem a pena tentar essa rota (periódicos assinados encontrarão paywall, proibido contornar).

★ Verificação de Integridade: Downloads grandes interrompidos corrompem xref

Se o curl for interrompido por SIGTERM/timeout ao baixar PDF, o cabeçalho do arquivo ainda será %PDF-1.6 e o tamanho aparentará ok, mas o pdfinfo reportará Invalid XRef entry. Portanto, após o download, não confie apenas no cabeçalho e tamanho; todos os itens a seguir devem ser verificados:

head -c 8 "$OUT"                                  # %PDF-…
tail -c 32 "$OUT" | od -c | tail -3               # Deve mostrar startxref … %%EOF
pdfinfo "$OUT" | grep -E "Pages|Page size"        # Número de páginas deve ser consistente com o volume/edição

Somente com todos os três itens ok o download é considerado completo; caso contrário, baixe novamente (adicione --retry 3), não entregue um arquivo corrompido.

Materiais Suplementares e Imagens

Quando o PDF do artigo está inacessível, o endpoint supplementaryFiles geralmente ainda está disponível, e seu conteúdo costuma ser exatamente as imagens do artigo e métodos suplementares:

curl -sL -o sup.zip "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC13049628/supplementaryFiles"
unzip -o sup.zip -d sup/

Convenção de nomenclatura (Wiley / ASH): *-gr1…*-grN correspondem às Figuras 1…N, *-ga1 é o resumo gráfico, *-mmc1.pdf é o material suplementar.

Ao Usar Ferramentas de Navegador

Use agent-browser apenas quando for necessário clicar, fazer login ou renderizar páginas JS. Em cenários puramente de download, não inicie o navegador – PoW pode ser resolvido offline, iniciar Chromium só adiciona centenas de MB de overhead e pontos de falha. Se realmente precisar do navegador:

  • Certifique-se de que um node funcional está no PATH (senão o daemon pode exceder o tempo limite de inicialização);
  • Ao finalizar a tarefa, sempre execute agent-browser close para evitar daemons zumbis.

Lista de Verificação

  • Antes de baixar, confirme que o artigo alvo é OA (ou que está dentro do bloco de IPs da assinatura institucional – nesse caso, links diretos da editora estão disponíveis, mas ainda apenas para download manual individual, proibido em lote)
  • Resolva o nome real do arquivo PDF a partir da tag citation_pdf_url da página do artigo (não codifique main.pdf)
  • Após salvar, verifique se o cabeçalho é %PDF
  • Verifique o final por startxref / %%EOF (arquivos grandes interrompidos deixam cabeçalho intacto mas xref corrompido; pdfinfo detecta)
  • Valide o número de páginas: use re.findall(rb'/Count\s+(\\d+)', data) ou conte /Type /Page, não confie no file out.pdf (no macOS frequentemente reporta erroneamente "1 pages"); também pode usar mdls -name kMDItemNumberOfPages
  • Extraia primeira e última página para verificar o conteúdo (pdftotext -f 1 -l 1 / -f N -l N), confirmando que não é material suplementar ou outro artigo
  • Registre o PMCID / DOI / caminho do arquivo salvo para verificação posterior
  • Em caso de falha, relate honestamente o motivo, não use material suplementar ou imagens como substituto do PDF do artigo

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

GreenWich-art/agent-skills

桌面 GUI 操作的统一编排入口。当用户要求操作一个只有图形界面的应用(改设置、点按钮、填表单、操作无 CLI/连接器的软件)时使用此 skill。提供四级能力:①路由决策——判断任务该走连接器、浏览器控制、Office 技能、命令行还是 computer use 桌面接管;②授权引导——检测并引导用户完成 macOS 辅助功能/屏幕录制权限授权,处理授权不生效等常见坑;③任务派发与验证——按目标/边界/失败处理三段式描述派发 GUI 任务,并以最终截图为准确认结果;④AX 兜底层——内置 axctl 工具做元素级无障碍读写(AXPress 语义点击,不碰鼠标不抢焦点),适用于 computer use 不可用或轻量场景。台前调度全场景实测(macOS 15 + 27.0.1 复检)。触发词:操控电脑、操作某个软件、点某个按钮、GUI 操作、电脑设置。

GreenWich-art/agent-skills

按学术论文规范(小三黑体一级标题/四号黑体二级/小四正文宋体1.5倍行距/三线表/中西文混排Times New Roman/统计量斜体) 批量重整 Markdown 或已有 docx 的格式。用户说"按学术格式排版""三线表""小三号黑体标题""1.5倍行距" "数字英文用Times New Roman""P值斜体"时使用。基于 python-docx 直接生成 docx,不走逐段插入。 不适用:高校课程论文/作业的字体字号约定(标准不同);党政机关公文国标 GB/T 9704 (又是另一套标准)。三套标准不可混用。

GreenWich-art/agent-skills

参考文献的 GB/T 7714-2015 著录规范化,以及 URL / DOI / PMID / PMC 链接的 可访问性批量核验与"假失效"识别。 触发场景: - 论文 / 综述 / 作业要交,需要核对参考文献格式 - "帮我按国标改一下参考文献" - 要交付一份文献清单,需要确认链接没死 - 已经有一堆 links,要批量验证哪些还能打开 含一个可复用脚本 `scripts/check_refs.py`,能自动判别 URL / DOI / PMID / PMC 并并发核验,且能区分「真死」与「被反爬」——后者不该判为失效。 不适用:从零生成一份带引文的正文(那是写作任务); Zotero 样式定制(见正文第六节,按需手工改 CSL)。

GreenWich-art/agent-skills

Local OCR using the macOS Vision framework. Triggers: OCR, 识别图片文字, 提取截图内容, 扫描件转文字, 图片转文字, 扫描版PDF转文字, read text from image/screenshot/photo/scanned PDF. Local-first and offline; prefer it over cloud OCR whenever data is sensitive or the machine is offline.

Habilidades Relacionadas