Created
August 29, 2025 15:47
-
-
Save zeandrade/12f9f3fee22f7b3214b6228350d376b5 to your computer and use it in GitHub Desktop.
ferramenta
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "BYMtmPVipQLP" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "! pip install aiohttp[speedups]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import json\n", | |
| "from collections import defaultdict\n", | |
| "from typing import Dict, List, Any\n", | |
| "import time\n", | |
| "import aiohttp\n", | |
| "import asyncio" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# --- Configurações\n", | |
| "# Substitua por seu usuário e senha reais\n", | |
| "USUARIO_PADRAO = \"josejr\"\n", | |
| "SENHA_PADRAO = \"senha\"\n", | |
| "# URLs dos endpoints\n", | |
| "URL_AUTENTICACAO = \"https://api.zeroandrade.com.br/pinata/autenticar\"\n", | |
| "URL_CONSULTA = \"https://api.zeroandrade.com.br/pinata/consultar\"\n", | |
| "\n", | |
| "NUMERO_MAXIMO_CONSULTAS = 30 # Ajuste este valor conforme necessário" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "RslBSO66p-2W", | |
| "outputId": "a164a883-d36e-4b52-bc04-cd2cf40ae521" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "\n", | |
| "async def teste():\n", | |
| "\n", | |
| " async with aiohttp.ClientSession() as session:\n", | |
| " async with session.get('http://api.zeroandrade.com.br') as response:\n", | |
| " print('Massa')\n", | |
| " print(\"Status:\", response.status)\n", | |
| " print(\"Content-type:\", response.headers['content-type'])\n", | |
| "\n", | |
| " html = await response.text()\n", | |
| " print(\"Body:\", html[:50], \"...\")\n", | |
| "\n", | |
| "# Use await main() instead of asyncio.run(main()) in environments like Colab\n", | |
| "await teste()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "\n", | |
| "\n", | |
| "\n", | |
| "# Gera uma lista de parâmetros com o número máximo ajustável\n", | |
| "parametros_consulta = [f\"param_{i:04d}\" for i in range(NUMERO_MAXIMO_CONSULTAS)]\n", | |
| "\n", | |
| "# --- Funções Assíncronas\n", | |
| "\n", | |
| "async def autenticar(session: aiohttp.ClientSession, usuario: str, senha: str) -> str:\n", | |
| " \"\"\"\n", | |
| " Realiza a autenticação e retorna o token de acesso.\n", | |
| " \"\"\"\n", | |
| " payload = {\"usuario\": usuario, \"senha\": senha}\n", | |
| " headers = {\"Content-Type\": \"application/json\"}\n", | |
| " \n", | |
| " print(\"Tentando autenticar...\")\n", | |
| " try:\n", | |
| " async with session.post(URL_AUTENTICACAO, json=payload, headers=headers) as response:\n", | |
| " if response.status == 200:\n", | |
| " data = await response.json()\n", | |
| " print(\"Autenticação bem-sucedida.\")\n", | |
| " return data.get(\"token\")\n", | |
| " elif response.status == 401:\n", | |
| " print(\"Erro de autenticação: Usuário ou senha incorretos.\")\n", | |
| " return None\n", | |
| " else:\n", | |
| " print(f\"Erro inesperado na autenticação: Status {response.status}\")\n", | |
| " return None\n", | |
| " except aiohttp.ClientError as e:\n", | |
| " print(f\"Erro de conexão na autenticação: {e}\")\n", | |
| " return None\n", | |
| "\n", | |
| "async def consultar_item(session: aiohttp.ClientSession, item: str, token: str) -> Dict[str, Any]:\n", | |
| " \"\"\"\n", | |
| " Realiza uma única consulta para um item e retorna a resposta.\n", | |
| " \"\"\"\n", | |
| " headers = {\n", | |
| " \"Content-Type\": \"application/json\",\n", | |
| " \"X-Auth\": token\n", | |
| " }\n", | |
| " payload = {\"parametro\": item}\n", | |
| " \n", | |
| " try:\n", | |
| " async with session.post(URL_CONSULTA, json=payload, headers=headers) as response:\n", | |
| " if response.status == 403:\n", | |
| " print(f\"Consulta bloqueada para o item '{item}'. Interrompendo...\")\n", | |
| " return {\"status\": 403, \"item\": item}\n", | |
| " \n", | |
| " data = await response.json()\n", | |
| " return {\"status\": response.status, \"data\": data, \"item\": item}\n", | |
| " except aiohttp.ClientError as e:\n", | |
| " print(f\"Erro de conexão na consulta para o item '{item}': {e}\")\n", | |
| " return {\"status\": \"error\", \"item\": item}\n", | |
| "\n", | |
| "async def processar_lote(session: aiohttp.ClientSession, lote: List[str], token: str, resultados: defaultdict, nao_encontrados: List) -> bool:\n", | |
| " \"\"\"\n", | |
| " Processa um lote de consultas em paralelo.\n", | |
| " Retorna True se deve continuar, False se uma resposta 403 foi recebida.\n", | |
| " \"\"\"\n", | |
| " tasks = [consultar_item(session, item, token) for item in lote]\n", | |
| " respostas = await asyncio.gather(*tasks)\n", | |
| " \n", | |
| " for resposta in respostas:\n", | |
| " item = resposta[\"item\"]\n", | |
| " status = resposta[\"status\"]\n", | |
| " \n", | |
| " if status == 403:\n", | |
| " print(\"Resposta 403 recebida. Processamento interrompido.\")\n", | |
| " return False # Indica que o loop principal deve parar\n", | |
| " \n", | |
| " if status == 200:\n", | |
| " dados = resposta[\"data\"]\n", | |
| " resultados[item] = dados\n", | |
| " # print(f\"Item '{item}' encontrado. Total de encontrados: {len(resultados)}\")\n", | |
| " elif status == 404 or status == 400:\n", | |
| " nao_encontrados.append(item)\n", | |
| " else:\n", | |
| " print(f\"Status inesperado para o item '{item}': {status}\")\n", | |
| " \n", | |
| " return True # Indica que o loop principal pode continuar\n", | |
| "\n", | |
| "async def main():\n", | |
| " \"\"\"\n", | |
| " Função principal que coordena a autenticação e as consultas em lotes.\n", | |
| " \"\"\"\n", | |
| " resultados = defaultdict(dict)\n", | |
| " nao_encontrados = []\n", | |
| " \n", | |
| " async with aiohttp.ClientSession() as session:\n", | |
| " # Etapa 1: Autenticação\n", | |
| " token = await autenticar(session, USUARIO_PADRAO, SENHA_PADRAO)\n", | |
| " \n", | |
| " if not token:\n", | |
| " print(\"Não foi possível obter o token. Encerrando o programa.\")\n", | |
| " return\n", | |
| "\n", | |
| " # Etapa 2: Processamento dos lotes\n", | |
| " lotes_processados = 0\n", | |
| " total_lotes = len(parametros_consulta) // 100 + (len(parametros_consulta) % 100 > 0)\n", | |
| "\n", | |
| " for i in range(0, len(parametros_consulta), 100):\n", | |
| " if i > 0:\n", | |
| " print(\"Aguardando 2 segundos para o próximo lote...\")\n", | |
| " await asyncio.sleep(2)\n", | |
| " \n", | |
| " lote = parametros_consulta[i:i+100]\n", | |
| " lotes_processados += 1\n", | |
| " print(f\"Processando lote {lotes_processados}/{total_lotes} (itens {i+1} a {min(i+100, len(parametros_consulta))})...\")\n", | |
| " \n", | |
| " deve_continuar = await processar_lote(session, lote, token, resultados, nao_encontrados)\n", | |
| " if not deve_continuar:\n", | |
| " print(\"Processamento interrompido devido à resposta 403.\")\n", | |
| " break\n", | |
| " \n", | |
| " print(\"\\n--- Processo Concluído ---\")\n", | |
| " print(f\"Total de itens encontrados: {len(resultados)}\")\n", | |
| " print(f\"Total de itens não encontrados: {len(nao_encontrados)}\")\n", | |
| " print(f\"Lotes processados: {lotes_processados}\")\n", | |
| "\n", | |
| " # Exibindo os resultados (opcional)\n", | |
| " print(\"\\nResultados encontrados (amostra):\")\n", | |
| " for item, dados in list(resultados.items())[:5]:\n", | |
| " print(f\" - Item '{item}': {dados}\")\n", | |
| "\n", | |
| " print(\"\\nItens não encontrados (amostra):\")\n", | |
| " print(nao_encontrados[:10])\n", | |
| "\n", | |
| " print(\"\\n--- Estruturas de Dados Finais ---\")\n", | |
| " print(\"Variável 'resultados' (defaultdict):\")\n", | |
| " print(len(resultados))\n", | |
| " print(\"Variável 'nao_encontrados' (lista):\")\n", | |
| " print(len(nao_encontrados))\n", | |
| " \n", | |
| "# Inicia a execução da função principal\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Executar o ATAQUE!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "await main()" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "provenance": [] | |
| }, | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.10.12" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment