{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyM743MkTKE3mW+HoMkj7Og9"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["**Script verifica_endpointOAI.ipynb:** verifica automaticamente se o Repositório Institucional possui endpoint OAI-PMH funcional e identifica informações básicas do protocolo via verbo `Identify`.\n","\n","\n","---\n","\n","\n","Ordem de detecção do endpoint OAI-PMH:\n","\n","1. Normalizar URL do repositório\n","\n","* Remove barras finais `/`\n","* Remove sufixos conhecidos do DSpace:\n","  * `/xmlui`\n","  * `/jspui`\n","\n","Ex:\n","\n","* `https://repositorio.exemplo.br/xmlui/` → `https://repositorio.exemplo.br`\n","\n","\n","2. Testar caminhos OAI conhecidos\n","\n","O script tenta automaticamente os endpoints:\n","\n","* `/server/oai/request`\n","* `/oai/request`\n","\n","Ex:\n","\n","* `https://repositorio.exemplo.br/server/oai/request?verb=Identify`\n","* `https://repositorio.exemplo.br/oai/request?verb=Identify`\n","\n","\n","3. Validar resposta OAI-PMH\n","\n","Critérios para considerar o endpoint válido:\n","\n","* HTTP 200\n","* presença da tag `<Identify` no XML retornado\n","\n","\n","4. Extrair metadados do verbo Identify\n","\n","Campos coletados:\n","\n","* `repositoryName`\n","* `adminEmail`\n","* `protocolVersion`\n","* `earliestDatestamp`\n","\n","\n","5. Se nenhum endpoint funcionar\n","\n","Retorna:\n","\n","* código HTTP da última tentativa\n","* tipo de erro da requisição\n","* ou `\"resposta sem Identify\"`\n","\n","\n","---\n","\n","\n","🧠 Estratégia de detecção\n","\n","O script utiliza:\n","\n","* `requests` para acesso HTTP\n","* `xml.etree.ElementTree` para parsing XML\n","* namespace oficial OAI-PMH:\n","  \n","  `http://www.openarchives.org/OAI/2.0/`\n","\n","\n","---\n","\n","\n","⚠️ Observações importantes:\n","\n","* Alguns repositórios respondem HTTP 200 mesmo sem OAI válido\n","* Reverse proxy e balanceadores podem alterar respostas\n","* Certificados SSL inválidos podem causar falhas de conexão\n","* Alguns RIs possuem OAI apenas em caminhos não padronizados\n","* O script considera apenas endpoints OAI-PMH convencionais do DSpace\n","* Há delay (`sleep`) entre requisições para evitar bloqueios automáticos"],"metadata":{"id":"My7j3U8U25td"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"qJMw7sVr1500"},"outputs":[],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","source":["import requests\n","from urllib.parse import urljoin\n","import pandas as pd\n","from tqdm import tqdm\n","import xml.etree.ElementTree as ET\n","import time"],"metadata":{"id":"nenLJzLA2BUI"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Lista dos repositórios que usam DSpace (128)\n","repositorios_validados_DSpace = [\n","    (\"NPA – Instituto Nacional de Pesquisas da Amazônia\", \"https://repositorio.inpa.gov.br\"),\n","    (\"UNIR – Universidade Federal de Rondônia\", \"https://ri.unir.br/\"),\n","    (\"UFAM – Universidade Federal do Amazonas\", \"https://riu.ufam.edu.br/\"),\n","    (\"UFPA – Universidade Federal do Pará\", \"https://repositorio.ufpa.br/\"),\n","    (\"UFT – Universidade Federal do Tocantins\", \"https://repositorio.uft.edu.br/\"),\n","    (\"UFRA – Universidade Federal Rural da Amazônia\", \"https://repositorio.ufra.edu.br/\"),\n","    (\"IFAM – Instituto Federal do Amazonas\", \"https://riu.ufam.edu.br/\"),\n","    (\"PATUA – Instituto Evandro Chagas\", \"https://patua.iec.gov.br/\"),\n","    (\"UNIFAP – Universidade Federal do Amapá\", \"https://repositorio.unifap.br/\"),\n","    (\"UFOPA – Universidade Federal do Oeste do Pará\", \"https://repositorio.ufopa.edu.br/\"),\n","    (\"UFRR – Universidade Federal de Roraima\", \"http://repositorio.ufrr.br:8080\"),\n","    (\"IFAP – Instituto Federal de Educação, Ciência e Tecnologia do Amapá\", \"https://repositorio.ifap.edu.br/\"),\n","    (\"FHCGV – Fundação Hospital de Clínicas Gaspar Vianna\", \"http://repositorio.gasparvianna.pa.gov.br/\"),\n","    (\"IFPA – Instituto Federal do Pará\", \"https://repositorio.ifpa.edu.br/\"),\n","    (\"IFRO – Instituto Federal de Rondônia\", \"https://repositorio.ifro.edu.br/\"),\n","    (\"Instituto Federal de Educação, Ciência e Tecnologia da Bahia (IFBA)\", \"https://repositorio.ifba.edu.br\"),\n","    (\"Instituto Federal de Educação, Ciência e Tecnologia de Pernambuco (IFPE)\", \"https://repositorio.ifpe.edu.br\"),\n","    (\"Instituto Federal de Educação, Ciência e Tecnologia de Sergipe (IFS)\", \"https://repositorio.ifs.edu.br/biblioteca/\"),\n","    (\"Instituto Federal de Educação, Ciência e Tecnologia do Ceará (IFCE)\", \"https://repositorio.ifce.edu.br/\"),\n","    (\"Instituto Federal do Piauí (IFPI)\", \"http://bia.ifpi.edu.br:8080/\"),\n","    (\"Instituto Federal do Rio Grande do Norte (IFRN)\", \"https://memoria.ifrn.edu.br/\"),\n","    (\"Instituto Federal do Sertão Pernambucano (IF Sertão PE)\", \"https://releia.ifsertao-pe.edu.br/\"),\n","    (\"Universidade de Pernambuco (UPE)\", \"https://repositorio.ufpe.br/\"),\n","    (\"Universidade do Estado da Bahia (UNEB)\", \"https://saberaberto.uneb.br/\"),\n","    (\"Universidade do Estado do Rio Grande do Norte (UERN)\", \"https://repositorio.apps.uern.br/\"),\n","    (\"Universidade Estadual da Paraíba (UEPB)\", \"https://repositorio.uepb.edu.br/\"),\n","    (\"Universidade Estadual de Feira de Santana (UEFS)\", \"http://tede2.uefs.br:8080/\"),\n","    (\"Fundação Universidade Estadual do Piauí (UEPI)\", \"https://repositorio.uespi.br/\"),\n","    (\"Universidade Estadual do Maranhão (UEMA)\", \"https://repositorio.uema.br/\"),\n","    (\"Universidade Federal da Bahia (UFBA)\", \"https://repositorio.ufba.br/\"),\n","    (\"Universidade Federal da Paraíba (UFPB)\", \"https://repositorio.ufpb.br/\"),\n","    (\"Universidade Federal de Alagoas (UFAL)\", \"https://www.repositorio.ufal.br/\"),\n","    (\"Universidade Federal de Campina Grande (UFCG)\", \"https://dspace.sti.ufcg.edu.br/\"),\n","    (\"Universidade Federal de Pernambuco (UFPE)\", \"https://repositorio.ufpe.br/\"),\n","    (\"Universidade Federal de Sergipe (UFS)\", \"https://ri.ufs.br/\"),\n","    (\"Universidade Federal do Agreste de Pernambuco (UFAPE)\", \"https://logos.ufape.edu.br/\"),\n","    (\"Universidade Federal do Cariri (UFCA)\", \"https://repositorio.ufca.edu.br/\"),\n","    (\"Universidade Federal do Ceará (UFC)\", \"https://repositorio.ufc.br/\"),\n","    (\"Universidade Federal do Maranhão (UFMA)\", \"https://repositorio.ufma.br/\"),\n","    (\"Universidade Federal do Oeste da Bahia (UFOB)\", \"https://repositorio.ufob.edu.br/\"),\n","    (\"Universidade Federal do Piauí (UFPI)\", \"http://repositorio.ufpi.br:8080/\"),\n","    (\"Universidade Federal do Recôncavo da Bahia (UFRB)\", \"https://ri.ufrb.edu.br/\"),\n","    (\"Universidade Federal do Rio Grande do Norte (UFRN)\", \"https://repositorio.ufrn.br/\"),\n","    (\"Universidade Federal Rural de Pernambuco (UFRPE)\", \"https://arandu.ufrpe.br/\"),\n","    (\"Universidade Federal Rural do Semi-Árido (UFERSA)\", \"https://repositorio.ufersa.edu.br/\"),\n","    (\"Instituto Brasileiro de Informação em Ciência e Tecnologia (Ibict)\", \"https://ridi.ibict.br/\"),\n","    (\"Universidade de Brasília (UnB)\", \"https://repositorio.unb.br/\"),\n","    (\"Universidade Federal de Mato Grosso (UFMT)\", \"https://ri.ufmt.br/\"),\n","    (\"Universidade Federal da Grande Dourados (UFGD)\", \"https://repositorio.ufgd.edu.br/\"),\n","    (\"Universidade Federal de Mato Grosso do Sul (UFMS)\", \"https://repositorio.ufms.br/\"),\n","    (\"Universidade Federal do Goiás (UFG)\", \"https://repositorio.bc.ufg.br/\"),\n","    (\"Universidade Estadual de Goiás (UEG)\", \"https://repositorio.ueg.br/\"),\n","    (\"Instituto Federal de Brasília (IFB)\", \"https://repositorio.ifb.edu.br/\"),\n","    (\"Instituto Federal Goiano (IF Goiano)\", \"https://repositorio.ifgoiano.edu.br/\"),\n","    (\"Instituto Federal de Goiás (IFGoiás)\", \"https://repositorio.ifg.edu.br/\"),\n","    (\"Universidade Federal de Catalão (UFCAT)\", \"https://repositorio.ufcat.edu.br/\"),\n","    (\"Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira (INEP)\", \"https://riep.inep.gov.br/\"),\n","    (\"Fundação Nacional de Saúde (FUNASA)\", \"https://repositorio.funasa.gov.br/\"),\n","    (\"Universidade Estadual de Ponta Grossa\", \"https://tede2.uepg.br/\"),\n","    (\"Universidade Estadual do Centro – Oeste\", \"https://tede.unicentro.br/jspui/\"),\n","    (\"Universidade Estadual do Oeste do Paraná\", \"https://tede.unioeste.br/\"),\n","    (\"Universidade Tuiuti do Paraná\", \"https://tede.utp.br/jspui/\"),\n","    (\"Universidade Federal de Santa Maria\", \"https://repositorio.ufsm.br/\"),\n","    (\"Pontifícia Universidade Católica do Rio Grande do Sul\", \"https://repositorio.pucrs.br/\"),\n","    (\"Instituto Federal de Educação Ciência e Tecnologia Farroupilha\", \"https://repositorio.ifrs.edu.br/\"),\n","    (\"Universidade Federal da Fronteira Sul\", \"https://rd.uffs.edu.br/\"),\n","    (\"Universidade Federal do Paraná\", \"https://acervodigital.ufpr.br\"),\n","    (\"Universidade Cesumar – Unicesumar\", \"https://rdu.unicesumar.edu.br/\"),\n","    (\"Universidade de Caxias do Sul\", \"https://repositorio.ucs.br/\"),\n","    (\"Universidade do Estado de Santa Catarina\", \"https://repositorio.udesc.br/\"),\n","    (\"Universidade Estadual de Londrina\", \"https://repositorio.uel.br/\"),\n","    (\"Universidade Estadual do Norte do Paraná\", \"https://repositorio.uenp.edu.br/\"),\n","    (\"Universidade Federal de Pelotas\", \"https://repositorio.ufpel.edu.br/\"),\n","    (\"Universidade do Extremo Sul Catarinense\", \"http://repositorio.unesc.net/\"),\n","    (\"Universidade Regional do Noroeste do Estado do Rio Grande do Sul\", \"https://bibliodigital.unijui.edu.br\"),\n","    (\"Universidade Federal da Integração Latino-Americana\", \"https://dspace.unila.edu.br\"),\n","    (\"Universidade Federal do Pampa\", \"https://repositorio.unipampa.edu.br/\"),\n","    (\"Universidade do Vale do Rio dos Sinos\", \"https://repositorio.jesuita.org.br/\"),\n","    (\"Universidade do Sul de Santa Catarina\", \"https://repositorio.animaeducacao.com.br/\"),\n","    (\"Universidade do Vale do Taquari\", \"https://www.univates.br/bdu\"),\n","    (\"Universidade Estadual de Maringá\", \"http://repositorio.uem.br:8080/jspui/\"),\n","    (\"Universidade Federal de Santa Catarina\", \"https://repositorio.ufsc.br/\"),\n","    (\"Universidade Federal do Rio Grande\", \"https://repositorio.furg.br/\"),\n","    (\"Universidade Tecnológica Federal do Paraná\", \"https://repositorio.utfpr.edu.br/\"),\n","    (\"Universidade de Passo Fundo\", \"https://repositorio.upf.br/\"),\n","    (\"Universidade La Salle\", \"https://repositorio.unilasalle.edu.br/\"),\n","    (\"Instituto Federal de Educação Ciência e Tecnologia do Rio Grande do Sul (IFRS)\", \"https://repositorio.ifrs.edu.br/\"),\n","    (\"Universidade Federal do Rio Grande do Sul\", \"https://lume.ufrgs.br/\"),\n","    (\"BUTANTAN – Instituto Butantan\", \"https://repositorio.butantan.gov.br/\"),\n","    (\"FCRB – Fundação Casa de Rui Barbosa\", \"https://rubi.casaruibarbosa.gov.br/\"),\n","    (\"FESPSP – Fundação Escola de Sociologia e Política de São Paulo\", \"https://repositorio.fespsp.org.br/\"),\n","    (\"FGV – Fundação Getúlio Vargas\", \"https://repositorio.fgv.br/\"),\n","    (\"FIOCRUZ – Fundação Oswaldo Cruz\", \"https://arca.fiocruz.br/\"),\n","    (\"FJP – Fundação João Pinheiro\", \"https://repositorio.fjp.mg.gov.br/\"),\n","    (\"Fundação Técnico-Educacional Souza Marques\", \"https://rism.souzamarques.br/\"),\n","    (\"IBICT – Instituto Brasileiro de Informação em Ciência e Tecnologia\", \"https://repositorio.ibict.br/\"),\n","    (\"IFES – Instituto Federal do Espírito Santo\", \"https://repositorio.ifes.edu.br\"),\n","    (\"IFMG – Instituto Federal de Minas Gerais\", \"https://repositorio.ifmg.edu.br/\"),\n","    (\"IFRJ – Instituto Federal do Rio de Janeiro\", \"https://repositorio.ifrj.edu.br/\"),\n","    (\"IFSP – Instituto Federal de Educação, Ciência e Tecnologia de São Paulo\", \"https://repositorio.ifsp.edu.br/\"),\n","    (\"INCA – Instituto Nacional do Câncer\", \"https://ninho.inca.gov.br/\"),\n","    (\"INCAPER – Instituto Capixaba de Pesquisa, Assistência Técnica e Extensão Rural\", \"https://biblioteca.incaper.es.gov.br/digital/\"),\n","    (\"INSPER – Instituto de Ensino e Pesquisa\", \"https://repositorio.insper.edu.br/\"),\n","    (\"IPEA – Instituto de Pesquisa Econômica Aplicada\", \"https://repositorio.ipea.gov.br/\"),\n","    (\"IPEN – Instituto de Pesquisas Energéticas e Nucleares\", \"https://repositorio.ipen.br/\"),\n","    (\"PUC – Campinas\", \"https://repositorio.sis.puc-campinas.edu.br/\"),\n","    (\"UEMG – Universidade do Estado de Minas Gerais\", \"http://www.repositorio.uemg.br/\"),\n","    (\"UERJ – Universidade do Estado do Rio de Janeiro\", \"https://www.bdtd.uerj.br:8443/\"),\n","    (\"UFES – Universidade Federal do Espírito Santo\", \"https://repositorio.ufes.br/\"),\n","    (\"UFF – Universidade Federal Fluminense\", \"https://app.uff.br/riuff/\"),\n","    (\"UFJF – Universidade Federal de Juiz de Fora\", \"https://repositorio.ufjf.br/\"),\n","    (\"UFLA – Universidade Federal de Lavras\", \"https://repositorio.ufla.br/\"),\n","    (\"UFMG – Universidade Federal de Minas Gerais\", \"https://repositorio.ufmg.br/\"),\n","    (\"UFOP – Universidade Federal de Ouro Preto\", \"https://www.repositorio.ufop.br/\"),\n","    (\"UFRJ – Universidade Federal do Rio de Janeiro\", \"https://pantheon.ufrj.br/\"),\n","    (\"UFRRJ – Universidade Federal Rural do Rio de Janeiro\", \"https://rima.ufrrj.br/\"),\n","    (\"UFSCAR – Universidade Federal de São Carlos\", \"https://repositorio.ufscar.br/\"),\n","    (\"UFSJ – Universidade Federal de São João del-Rei\", \"https://repositorio.ufsj.edu.br/\"),\n","    (\"UFU – Universidade Federal de Uberlândia\", \"https://repositorio.ufu.br/\"),\n","    (\"UFV – Universidade Federal de Viçosa\", \"https://locus.ufv.br/\"),\n","    (\"UFVJM – Universidade Federal dos Vales do Jequitinhonha e Mucuri\", \"https://repositorio.ufvjm.edu.br/\"),\n","    (\"UMC – Universidade de Mogi das Cruzes\", \"https://repositorio.umc.br/\"),\n","    (\"UNESP – Universidade Estadual Paulista\", \"https://repositorio.unesp.br/\"),\n","    (\"UNIFAL-MG – Universidade Federal de Alfenas\", \"https://repositorio.unifal-mg.edu.br/\"),\n","    (\"UNIFEI – Universidade Federal de Itajubá\", \"https://repositorio.unifei.edu.br\"),\n","    (\"UNIFESP – Universidade Federal de São Paulo\", \"https://repositorio.unifesp.br/\"),\n","    (\"UNIRIO – Universidade Federal do Estado do Rio de Janeiro\", \"http://www.repositorio-bc.unirio.br:8080/xmlui/\"),\n","    (\"UVV – Universidade de Vila Velha\", \"https://repositorio.uvv.br/\")\n","]"],"metadata":{"id":"HYxDqBaessi-"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# CONFIG\n","TIMEOUT = 10\n","\n","CAMINHOS_OAI = [\n","    \"/server/oai/request\",\n","    \"/oai/request\"\n","]\n","\n","HEADERS = {\n","  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \"\n","                 \"AppleWebKit/537.36 (KHTML, like Gecko) \"\n","                 \"Chrome/120.0.0.0 Safari/537.36\",\n","  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n","  \"Accept-Language\": \"pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7\",\n","  \"Connection\": \"keep-alive\"\n","}"],"metadata":{"id":"1o2vDoD72F93"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# FUNÇÕES\n","\n","def normalizar_url(url):\n","    url = str(url).strip().rstrip(\"/\")\n","\n","    for sufixo in [\"/xmlui\",\"/xmlui/\", \"/jspui\",\"/jspui/\",]:\n","        if url.endswith(sufixo):\n","            url = url.replace(sufixo, \"\")\n","\n","    return url\n","\n","\n","def extrair_identify(xml_texto):\n","    try:\n","        root = ET.fromstring(xml_texto)\n","\n","        # namespace padrão do OAI\n","        ns = {\"oai\": \"http://www.openarchives.org/OAI/2.0/\"}\n","\n","        identify = root.find(\"oai:Identify\", ns)\n","\n","        if identify is None:\n","            return {}\n","\n","        return {\n","            \"repository_name\": (identify.findtext(\"oai:repositoryName\", default=\"\", namespaces=ns)),\n","            \"admin_email\": (identify.findtext(\"oai:adminEmail\", default=\"\", namespaces=ns)),\n","            \"protocol_version\": (identify.findtext(\"oai:protocolVersion\", default=\"\", namespaces=ns)),\n","            \"earliest_datestamp\": (identify.findtext(\"oai:earliestDatestamp\", default=\"\", namespaces=ns)),\n","        }\n","\n","    except ET.ParseError:\n","        return {}\n","\n","\n","def testar_endpoint(nome, base_url):\n","    base_url = normalizar_url(base_url)\n","\n","    ultimo_status = \"\"\n","    ultimo_erro = \"\"\n","\n","    for caminho in CAMINHOS_OAI:\n","        endpoint = urljoin(base_url, caminho)\n","        identify_url = endpoint + \"?verb=Identify\"\n","\n","        try:\n","            r = requests.get(identify_url, timeout=TIMEOUT, headers=HEADERS)\n","\n","            status = r.status_code\n","            texto = r.text\n","\n","            if status == 200 and \"<Identify\" in texto:\n","                dados_identify = extrair_identify(texto)\n","\n","                return {\n","                    \"instituicao\": nome,\n","                    \"base_url\": base_url,\n","                    \"endpoint_oai\": endpoint,\n","                    \"status_http\": status,\n","                    \"identify_ok\": True,\n","                    \"repository_name\": dados_identify.get(\"repository_name\", \"\"),\n","                    \"admin_email\": dados_identify.get(\"admin_email\", \"\"),\n","                    \"protocol_version\": dados_identify.get(\"protocol_version\", \"\"),\n","                    \"earliest_datestamp\": dados_identify.get(\"earliest_datestamp\", \"\"),\n","                    \"erro\": \"\"\n","                }\n","            else:\n","                ultimo_status = status\n","                ultimo_erro = \"resposta sem Identify\"\n","\n","        except requests.RequestException as e:\n","            ultimo_status = \"erro\"\n","            ultimo_erro = type(e).__name__\n","\n","    return {\n","        \"instituicao\": nome,\n","        \"base_url\": base_url,\n","        \"endpoint_oai\": \"\",\n","        \"status_http\": ultimo_status,\n","        \"identify_ok\": False,\n","        \"repository_name\": \"\",\n","        \"admin_email\": \"\",\n","        \"protocol_version\": \"\",\n","        \"earliest_datestamp\": \"\",\n","        \"erro\": ultimo_erro or \"falha ao encontrar endpoint\"\n","    }\n","\n","\n","def processar_lista(lista_repositorios):\n","    resultados = []\n","\n","    for nome, url in tqdm(lista_repositorios, desc=\"Verificando OAI-PMH\"):\n","        resultado = testar_endpoint(nome, url)\n","        resultados.append(resultado)\n","\n","        time.sleep(0.8)  # para evitar bloqueios\n","\n","    return resultados"],"metadata":{"id":"OSS6WvjHo8AG"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["resultados = processar_lista(repositorios_validados_DSpace)\n","\n","df_resultado = pd.DataFrame(resultados)\n","\n","df_resultado.to_csv(\"/content/drive/MyDrive/Repositorios-e-ODS/verifica_OAI-RESULTADO.csv\", index=False)\n","print(\"Arquivo 'verifica_OAI-RESULTADO.csv' salvo com sucesso!\")"],"metadata":{"id":"4pVZ8PCT2i3G"},"execution_count":null,"outputs":[]}]}