Cortecía de Claude AI
#!/bin/bash
# img-search - Buscador simple de imágenes que SIEMPRE funciona
# Soporta múltiples motores sin JavaScript
set -e
# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
# Configuración
CACHE_DIR="$HOME/.cache/img-search"
mkdir -p "$CACHE_DIR"
W3M="w3m -o display_image=1 -o auto_image=1"
# Ayuda
show_help() {
cat << EOF
${CYAN}img-search - Buscador universal de imágenes para consola${NC}
${GREEN}USO:${NC}
img-search MOTOR "búsqueda" [opciones]
${GREEN}MOTORES:${NC}
searx - SearXNG local (localhost:8888)
ddg - DuckDuckGo Images (sin JS)
ecosia - Ecosia Images (sin JS)
bing - Bing Images (sin JS)
qwant - Qwant Images (sin JS)
${GREEN}OPCIONES:${NC}
--list|-l Listar URLs encontradas
--download|-d Descargar imágenes
--urls|-u Solo mostrar URLs (para pipes)
--open|-o Abrir en navegador (default)
${GREEN}EJEMPLOS:${NC}
img-search ddg "gatos"
img-search searx "wallpapers" --list
img-search bing "linux logos" --download
img-search ecosia "nature" --urls > urls.txt
${YELLOW}DEPENDENCIAS:${NC}
w3m curl wget (opcional: jq para SearXNG)
EOF
}
# Función para extraer URLs de HTML
extract_urls_from_html() {
local html="$1"
# Múltiples patrones para capturar diferentes formatos
grep -oE '(src|data-src|href)="https?://[^"]+\.(jpg|jpeg|png|gif|webp|svg)(\?[^"]*)?[^"]*"' "$html" | \
sed 's/.*="\(.*\)"/\1/' | \
grep -v '^//' | \
grep -v 'data:image' | \
sort -u || true
# También buscar URLs sin comillas
grep -oE 'https?://[^\s"<>()]+\.(jpg|jpeg|png|gif|webp)(\?[^\s"<>()]+)?' "$html" | \
grep -v 'data:image' | \
sort -u || true
}
# Validar argumentos
if [ $# -lt 2 ]; then
show_help
exit 1
fi
MOTOR="$1"
QUERY="$2"
MODE="${3:-open}"
# Validar motor
case "$MOTOR" in
searx|ddg|ecosia|bing|qwant) ;;
-h|--help|help)
show_help
exit 0
;;
*)
echo -e "${RED}Motor desconocido: $MOTOR${NC}"
echo -e "${YELLOW}Usa: searx, ddg, ecosia, bing o qwant${NC}"
exit 1
;;
esac
# Encode query
ENCODED=$(echo "$QUERY" | sed 's/ /%20/g' | sed 's/+/%2B/g')
# Construir URL según motor
case "$MOTOR" in
searx)
URL="http://localhost:8888/search?q=${ENCODED}&categories=images&format=json"
USE_JSON=true
;;
ddg)
URL="https://duckduckgo.com/?q=${ENCODED}&iax=images&ia=images"
USE_JSON=false
;;
ecosia)
URL="https://www.ecosia.org/images?q=${ENCODED}"
USE_JSON=false
;;
bing)
URL="https://www.bing.com/images/search?q=${ENCODED}"
USE_JSON=false
;;
qwant)
URL="https://www.qwant.com/?q=${ENCODED}&t=images"
USE_JSON=false
;;
esac
# Banner
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${CYAN} Buscador de Imágenes - ${MOTOR^^}${NC}"
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}Búsqueda:${NC} $QUERY"
echo -e "${GREEN}Motor:${NC} $MOTOR"
echo -e ""
# Descargar resultados
CACHE_FILE="${CACHE_DIR}/${MOTOR}_$(echo $QUERY | tr ' ' '_').cache"
echo -e "${YELLOW}Descargando resultados...${NC}"
if $USE_JSON; then
curl -s "$URL" > "$CACHE_FILE"
else
curl -s -A "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0" "$URL" > "$CACHE_FILE"
fi
if [ ! -s "$CACHE_FILE" ]; then
echo -e "${RED}Error: No se pudo descargar resultados${NC}"
exit 1
fi
# Extraer URLs según el tipo
echo -e "${YELLOW}Extrayendo URLs...${NC}"
if $USE_JSON; then
# SearXNG JSON
if command -v jq &> /dev/null; then
URLS=$(jq -r '.results[]? | select(.img_src != null) | .img_src' "$CACHE_FILE" 2>/dev/null | head -30)
[ -z "$URLS" ] && URLS=$(jq -r '.results[]? | select(.thumbnail != null) | .thumbnail' "$CACHE_FILE" 2>/dev/null | head -30)
else
echo -e "${RED}Error: jq no está instalado (necesario para SearXNG)${NC}"
echo -e "${YELLOW}Instala con: sudo pacman -S jq${NC}"
exit 1
fi
else
# HTML parsing
URLS=$(extract_urls_from_html "$CACHE_FILE")
fi
# Verificar si hay URLs
if [ -z "$URLS" ]; then
echo -e "${RED}No se encontraron URLs de imágenes${NC}"
echo -e "${YELLOW}Tip: Prueba con otro motor${NC}"
echo -e "${YELLOW}Debug: cat $CACHE_FILE${NC}"
exit 1
fi
NUM_URLS=$(echo "$URLS" | wc -l)
echo -e "${GREEN}✓ Encontradas $NUM_URLS URLs${NC}\n"
# Procesar según modo
case "$MODE" in
--list|-l)
echo -e "${CYAN}URLs encontradas:${NC}\n"
echo "$URLS" | nl -w2 -s'. '
;;
--urls|-u)
echo "$URLS"
;;
--download|-d)
DOWNLOAD_DIR="${CACHE_DIR}/downloads/$(date +%Y%m%d_%H%M%S)_${QUERY// /_}"
mkdir -p "$DOWNLOAD_DIR"
echo -e "${CYAN}Descargando a: $DOWNLOAD_DIR${NC}\n"
counter=1
echo "$URLS" | while read url; do
[ -z "$url" ] && continue
ext="${url##*.}"
ext="${ext%%\?*}"
ext="${ext%%&*}"
case "$ext" in
jpg|jpeg|png|gif|webp|svg) ;;
*) ext="jpg" ;;
esac
filename="${counter}.${ext}"
echo -n "[$counter/$NUM_URLS] $filename ... "
if timeout 10 wget -q --max-redirect=3 -U "Mozilla/5.0" \
-O "${DOWNLOAD_DIR}/${filename}" "$url" 2>/dev/null; then
# Verificar que sea imagen
if file "${DOWNLOAD_DIR}/${filename}" 2>/dev/null | grep -qE "image|JPEG|PNG|GIF|WebP|SVG"; then
echo -e "${GREEN}✓${NC}"
else
rm -f "${DOWNLOAD_DIR}/${filename}"
echo -e "${YELLOW}✗${NC}"
fi
else
echo -e "${RED}✗${NC}"
fi
((counter++))
done
DOWNLOADED=$(find "$DOWNLOAD_DIR" -type f 2>/dev/null | wc -l)
echo -e "\n${GREEN}Descargadas: $DOWNLOADED imágenes${NC}"
echo -e "${GREEN}Ubicación: $DOWNLOAD_DIR${NC}"
if [ "$DOWNLOADED" -gt 0 ]; then
echo -e "${YELLOW}Ver con: feh $DOWNLOAD_DIR/${NC}"
else
rmdir "$DOWNLOAD_DIR" 2>/dev/null
fi
;;
--open|-o|*)
echo -e "${YELLOW}Abriendo en w3m... (Presiona 'q' para salir)${NC}\n"
sleep 1
$W3M "$URL"
;;
esac