aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/buscar-ddgs.sh
blob: a366123771fda717698255863a435c17ca4c3fea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env bash
# Busca con ddgs y escribe los resultados en JSON por la salida estándar.
#
#   scripts/buscar-ddgs.sh "<consulta>" [nº de resultados]
#
# ddgs consulta varios buscadores (DuckDuckGo, Brave, Mojeek, Startpage…) sin
# necesitar ninguna clave. Este guion existe para que la configuración del
# asistente no tenga que saber nada de uv ni de entornos de Python: aquí se
# busca un ddgs utilizable y se normaliza la salida.
#
# Ojo con dos cosas que parecen equivalentes y no lo son:
#   · `curl` contra html.duckduckgo.com devuelve HTTP 202 con una página
#     anti-bot, sin resultados. Medido, no supuesto.
#   · La API sin clave api.duckduckgo.com (Instant Answer) devuelve vacío para
#     casi todo lo que no sea una entidad de enciclopedia.
# La librería ddgs sí funciona porque rota buscadores y cabeceras.
set -euo pipefail

CONSULTA="${1:?uso: buscar-ddgs.sh \"<consulta>\" [nº]}"
MAXIMO="${2:-5}"

PROGRAMA=$(cat <<'PY'
import json, sys
from ddgs import DDGS
consulta, maximo = sys.argv[1], int(sys.argv[2])
try:
    filas = DDGS().text(consulta, max_results=maximo)
except Exception as e:                       # noqa: BLE001
    print(json.dumps({"error": f"{type(e).__name__}: {e}"}), file=sys.stderr)
    raise SystemExit(1)
print(json.dumps(filas, ensure_ascii=False))
PY
)

# 1) El entorno de `uv tool install ddgs`: es el camino rápido, porque no hay
#    que resolver el paquete en cada búsqueda.
TOOL_PY="$HOME/.local/share/uv/tools/ddgs/bin/python"
if [ -x "$TOOL_PY" ]; then
  exec "$TOOL_PY" -c "$PROGRAMA" "$CONSULTA" "$MAXIMO"
fi

# 2) Un Python del sistema que ya tenga ddgs instalado.
if python3 -c "import ddgs" >/dev/null 2>&1; then
  exec python3 -c "$PROGRAMA" "$CONSULTA" "$MAXIMO"
fi

# 3) uvx, que lo descarga al vuelo. Funciona sin instalar nada, pero añade
#    varios segundos a cada búsqueda: mejor `uv tool install ddgs`.
if command -v uvx >/dev/null 2>&1; then
  exec uvx --quiet --from ddgs python -c "$PROGRAMA" "$CONSULTA" "$MAXIMO"
fi

echo '{"error":"no hay ddgs disponible. Instálalo con: uv tool install ddgs"}' >&2
exit 1