#!/usr/bin/env bash # Busca con ddgs y escribe los resultados en JSON por la salida estándar. # # scripts/buscar-ddgs.sh "" [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 \"\" [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