aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/buscar-ddgs.sh54
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