Skip to content

Commit e71fab4

Browse files
committed
feat: async concurrent API calls, connection pooling and caching, bump to v2.5.3
- Phone APIs (Abstract/NumVerify/IPQualityScore) and geocoders (OpenCage/Geoapify) now run concurrently via asyncio + aiohttp; Nominatim stays final fallback - Connection pooling: aiohttp.ClientSession (async) + shared requests.Session (sync) - lru_cache on city normalization and locality filters; Nominatim geocode cache - Lazy output-dir creation; shallow copies in dummy mode; precompiled regexes - New dependency: aiohttp>=3.9.0
1 parent f0a1f1e commit e71fab4

11 files changed

Lines changed: 552 additions & 231 deletions

File tree

README.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ La herramienta puede validar números, analizar formatos mexicanos, consultar fu
4343
- Series no geográficas 200/300/500/800/900 con alerta de números premium (900)
4444
- Gestión de API keys desde la CLI (`--set-key`, `--list-keys`, `--config-path`)
4545
- Configuración local de API keys
46+
- **Rendimiento concurrente (v2.5.3)**: llamadas a APIs en paralelo (asyncio + aiohttp), pooling de conexiones HTTPS y memoización de normalización y geocodificación
4647
- Soporte para reportes o salidas generadas según la versión
4748
- Modo telefónico únicamente: sin proveedores IP ni escaneo IP
4849

@@ -57,23 +58,32 @@ MeXiCOSINT/
5758
├── docs/
5859
│ ├── INSTALL.md
5960
│ ├── USAGE.md
60-
│ └── CONFIG.md
61+
│ ├── CONFIG.md
62+
│ ├── ENGLISH.md
63+
│ └── index.html
6164
├── src/
6265
│ └── mexicosint/
6366
│ ├── __init__.py
6467
│ ├── __main__.py
6568
│ ├── cli.py
69+
│ ├── config.py
70+
│ ├── evidence.py
6671
│ ├── main.py
72+
│ ├── numbering.py
6773
│ ├── data/
6874
│ ├── modules/
6975
│ │ ├── ift_blocks.py
7076
│ │ ├── ift_sns.py
7177
│ │ ├── local_parser.py
7278
│ │ └── quienhabla.py
79+
│ ├── providers/
80+
│ │ ├── geoapify.py
81+
│ │ ├── ipqualityscore.py
82+
│ │ ├── models.py
83+
│ │ └── opencage.py
7384
│ ├── services/
7485
│ │ └── scanner.py
7586
│ └── utils/
76-
│ └── validation.py
7787
├── tools/
7888
│ └── update_ift_blocks.py
7989
├── pyproject.toml

docs/USAGE.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,20 @@ La localidad mexicana se resuelve en este orden:
217217

218218
AbstractAPI, NumVerify e IPQualityScore pueden aportar evidencia o conflicto, pero no reemplazan una localidad concreta de IFT/LADA. Valores vagos como `Mexico`, `NorthWest`, regiones genéricas, tipo de línea o país sin ciudad no se envían a geocodificadores.
219219

220-
OpenCage se usa como geocodificador primario si tiene key. Geoapify se usa como fallback con key. Nominatim queda como fallback final sin key.
220+
OpenCage y Geoapify se consultan **en paralelo** (con key); OpenCage sigue siendo el resultado primario. Nominatim queda como fallback final sin key.
221+
222+
---
223+
224+
## Rendimiento (v2.5.3)
225+
226+
Desde la versión 2.5.3 las llamadas de red son concurrentes:
227+
228+
* Las APIs telefónicas (AbstractAPI, NumVerify, IPQualityScore) se consultan **en paralelo** con asyncio + aiohttp.
229+
* OpenCage y Geoapify geocodifican en paralelo; Nominatim sigue como respaldo final.
230+
* Las conexiones HTTPS se reutilizan (pooling de sesiones).
231+
* La normalización de localidades y la geocodificación Nominatim usan caché (menos trabajo repetido entre escaneos).
232+
233+
No requiere configuración adicional: instala o actualiza normalmente (`pipx upgrade mexicosint`).
221234

222235
---
223236

docs/index.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133

134134
<nav>
135135
<div class="wrap">
136-
<div class="logo">MeXi<span>COSINT</span><span class="badge-ver">v2.5.2</span></div>
136+
<div class="logo">MeXi<span>COSINT</span><span class="badge-ver">v2.5.3</span></div>
137137
<div class="links">
138138
<a href="#que-hace">Qué hace</a>
139139
<a href="#ift">Base IFT</a>
@@ -213,6 +213,11 @@ <h3>Enlaces de investigación</h3>
213213
<h3>Reportes exportables</h3>
214214
<p>Reporte JSON con hash SHA-256 y mapa HTML de la localidad canónica IFT/LADA. Listo para documentar investigaciones.</p>
215215
</div>
216+
<div class="card">
217+
<div class="ico"></div>
218+
<h3>Rápida y concurrente</h3>
219+
<p>Desde v2.5.3: llamadas a APIs en paralelo con asyncio + aiohttp, reutilización de conexiones HTTPS y caché de geocodificación. Escaneos mucho más rápidos con varias llaves activas.</p>
220+
</div>
216221
</div>
217222
</div>
218223
</section>

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "mexicosint"
7-
version = "2.5.2"
7+
version = "2.5.3"
88
description = "OSINT CLI for Mexican phone-number validation, IFT/PNN lookup, enrichment, and reports."
99
readme = "README.md"
1010
requires-python = ">=3.8"
@@ -41,6 +41,7 @@ classifiers = [
4141
]
4242
dependencies = [
4343
"requests>=2.28.0",
44+
"aiohttp>=3.9.0",
4445
"urllib3<2",
4546
"beautifulsoup4>=4.11.0",
4647
"python-dotenv>=0.19.0",

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
requests>=2.28.0
2+
aiohttp>=3.9.0
23
urllib3<2
34
beautifulsoup4>=4.11.0
45
python-dotenv>=0.19.0

src/mexicosint/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
__all__ = ["__version__"]
44

5-
__version__ = "2.5.2"
5+
__version__ = "2.5.3"

src/mexicosint/evidence.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import re
66
import unicodedata
77
from dataclasses import dataclass, field
8+
from functools import lru_cache
89

910

1011
@dataclass
@@ -48,6 +49,7 @@ class EvidenceDecision:
4849
}
4950

5051

52+
@lru_cache(maxsize=1024)
5153
def normalize_city(city: str) -> str:
5254
if not city:
5355
return ""

0 commit comments

Comments
 (0)