diff options
Diffstat (limited to 'scripts/buscar-ddgs.sh')
| -rwxr-xr-x | scripts/buscar-ddgs.sh | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/scripts/buscar-ddgs.sh b/scripts/buscar-ddgs.sh new file mode 100755 index 0000000..a366123 --- /dev/null +++ b/scripts/buscar-ddgs.sh @@ -0,0 +1,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 |