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
|