diff --git a/.gitignore b/.gitignore index ca049fa..a0a8ee0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -config.conf \ No newline at end of file +*.conf +*.html +*.json \ No newline at end of file diff --git a/control-rss.sh b/control-rss.sh index 57eddf5..c9832c9 100644 --- a/control-rss.sh +++ b/control-rss.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Cargar configuración +# 1. Cargar configuración if [ ! -f config.conf ]; then echo "Error: config.conf no encontrado"; exit 1; fi source ./config.conf @@ -9,76 +9,88 @@ if [ ! -f "$OUTPUT_FILE" ]; then echo '{"datos": [], "resumen": {}}' > "$OUTPUT_FILE" fi -echo "Procesando logs..." -# Extraer: IP | Fecha | Hora | Agente (IP + Agente definen al único) +echo "Procesando logs de $LOG_FILE..." + +# 2. Extracción rápida con AWK awk -v url="$URL_A_MONITORIZAR" ' $7 == url || $7 ~ url { split($4, t, /[:/]/); fecha=t[1]"/"t[2]"/"t[3]; hora=t[4]":"t[5]; - # Extraer User Agent ua=""; for(i=12; i<=NF; i++) ua=(ua=="" ? $i : ua" "$i); gsub(/"/, "", ua); print $1 "|" fecha "|" hora "|" ua }' "$LOG_FILE" | sort -u > temp_data.txt -echo "Actualizando base de datos JSON..." -# Usamos un archivo temporal para construir la nueva lista de datos -TMP_JSON="tmp_db.json" +# 3. Actualización Incremental del JSON +echo "Actualizando base de datos (evitando duplicados)..." while IFS="|" read -r ip fecha hora ua; do - # Identificador único para evitar duplicados en el histórico + # ID Único: Asociación IP + Agente ID_UNICO=$(echo "${ip}${ua}" | md5sum | cut -d' ' -f1) - # Determinar si es RSS - IS_RSS=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator|TinyPRSS) ]] && echo "true" || echo "false") + # Clasificación de Agentes + IS_RSS=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator|TinyPRSS|NewsBlur) ]] && echo "true" || echo "false") + IS_FEDIVERSE=$([[ "$ua" =~ (Mastodon|Pleroma|Friendica|PixelFed|Lemmy|ActivityPub) ]] && echo "true" || echo "false") + IS_BOT=$([[ "$ua" =~ (bot|googlebot|bingbot|slurp|duckduckbot|yandexbot|spider|crawl) ]] && echo "true" || echo "false") - # Insertar solo si no existe el ID_UNICO - jq --arg id "$ID_UNICO" --arg ip "$ip" --arg f "$fecha" --arg h "$hora" --arg ua "$ua" --arg rss "$IS_RSS" \ + # Inserción segura con JQ (Solo si el UID no existe) + jq --arg id "$ID_UNICO" --arg ip "$ip" --arg f "$fecha" --arg h "$hora" --arg ua "$ua" \ + --arg rss "$IS_RSS" --arg fedi "$IS_FEDIVERSE" --arg bot "$IS_BOT" \ 'if .datos | any(.[]; .uid == $id) then . - else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua, "es_rss": ($rss=="true")}] end' \ - "$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" + else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua, + "es_rss": ($rss=="true"), "es_fedi": ($fedi=="true"), "es_bot": ($bot=="true")}] end' \ + "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" done < temp_data.txt -echo "Recalculando resumen y gráficas..." -# Actualizar el bloque de resumen dentro del JSON -jq '.resumen = { +# 4. Cálculo del Resumen (Corregido error de sintaxis) +AHORA=$(date +"%Y-%m-%d %H:%M:%S") +jq --arg fecha_act "$AHORA" '.resumen = { "total_visitantes_unicos": (.datos | length), "usuarios_rss": ([.datos[] | select(.es_rss == true)] | length), - "usuarios_estandar": ([.datos[] | select(.es_rss == false)] | length), - "ultima_actualizacion": "'$(date +%Y-%m-%d\ %H:%M:%S)'" -}' "$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" + "usuarios_fediverso": ([.datos[] | select(.es_fedi == true)] | length), + "bots_crawlers": ([.datos[] | select(.es_bot == true)] | length), + "usuarios_estandar": ([.datos[] | select(.es_rss == false and .es_fedi == false and .es_bot == false)] | length), + "ultima_actualizacion": $fecha_act +}' "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE" -# 3. Datos para Gnuplot (Frecuencia semanal) +# 5. Generar Gráfica de Frecuencia jq -r '.datos[].fecha' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > freq.dat - gnuplot < informe.html - -Reporte de Audiencia + + + + Análisis de Audiencia 2026 + + -

Informe para $URL_A_MONITORIZAR

- - +
+

Informe: $URL_A_MONITORIZAR

+

Actualizado: $(jq -r '.resumen.ultima_actualizacion' "$OUTPUT_FILE")

+
+ + +
HTML rm temp_data.txt freq.dat -echo "Proceso terminado exitosamente." +echo "Proceso completado. Revisa informe.html y $OUTPUT_FILE"