corregido un error que no permitia ver el resumen, agregado mas agentes en el informe e iconitos bonitos

This commit is contained in:
2026-01-13 11:23:47 -05:00
parent 4dcd97b726
commit dc2c8a4371
2 changed files with 51 additions and 37 deletions

4
.gitignore vendored
View File

@@ -1 +1,3 @@
config.conf *.conf
*.html
*.json

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Cargar configuración # 1. Cargar configuración
if [ ! -f config.conf ]; then echo "Error: config.conf no encontrado"; exit 1; fi if [ ! -f config.conf ]; then echo "Error: config.conf no encontrado"; exit 1; fi
source ./config.conf source ./config.conf
@@ -9,76 +9,88 @@ if [ ! -f "$OUTPUT_FILE" ]; then
echo '{"datos": [], "resumen": {}}' > "$OUTPUT_FILE" echo '{"datos": [], "resumen": {}}' > "$OUTPUT_FILE"
fi fi
echo "Procesando logs..." echo "Procesando logs de $LOG_FILE..."
# Extraer: IP | Fecha | Hora | Agente (IP + Agente definen al único)
# 2. Extracción rápida con AWK
awk -v url="$URL_A_MONITORIZAR" ' awk -v url="$URL_A_MONITORIZAR" '
$7 == url || $7 ~ url { $7 == url || $7 ~ url {
split($4, t, /[:/]/); split($4, t, /[:/]/);
fecha=t[1]"/"t[2]"/"t[3]; fecha=t[1]"/"t[2]"/"t[3];
hora=t[4]":"t[5]; hora=t[4]":"t[5];
# Extraer User Agent
ua=""; for(i=12; i<=NF; i++) ua=(ua=="" ? $i : ua" "$i); ua=""; for(i=12; i<=NF; i++) ua=(ua=="" ? $i : ua" "$i);
gsub(/"/, "", ua); gsub(/"/, "", ua);
print $1 "|" fecha "|" hora "|" ua print $1 "|" fecha "|" hora "|" ua
}' "$LOG_FILE" | sort -u > temp_data.txt }' "$LOG_FILE" | sort -u > temp_data.txt
echo "Actualizando base de datos JSON..." # 3. Actualización Incremental del JSON
# Usamos un archivo temporal para construir la nueva lista de datos echo "Actualizando base de datos (evitando duplicados)..."
TMP_JSON="tmp_db.json"
while IFS="|" read -r ip fecha hora ua; do 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) ID_UNICO=$(echo "${ip}${ua}" | md5sum | cut -d' ' -f1)
# Determinar si es RSS # Clasificación de Agentes
IS_RSS=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator|TinyPRSS) ]] && echo "true" || echo "false") 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 # 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" \ 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 . 'if .datos | any(.[]; .uid == $id) then .
else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua, "es_rss": ($rss=="true")}] end' \ else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua,
"$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" "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 done < temp_data.txt
echo "Recalculando resumen y gráficas..." # 4. Cálculo del Resumen (Corregido error de sintaxis)
# Actualizar el bloque de resumen dentro del JSON AHORA=$(date +"%Y-%m-%d %H:%M:%S")
jq '.resumen = { jq --arg fecha_act "$AHORA" '.resumen = {
"total_visitantes_unicos": (.datos | length), "total_visitantes_unicos": (.datos | length),
"usuarios_rss": ([.datos[] | select(.es_rss == true)] | length), "usuarios_rss": ([.datos[] | select(.es_rss == true)] | length),
"usuarios_estandar": ([.datos[] | select(.es_rss == false)] | length), "usuarios_fediverso": ([.datos[] | select(.es_fedi == true)] | length),
"ultima_actualizacion": "'$(date +%Y-%m-%d\ %H:%M:%S)'" "bots_crawlers": ([.datos[] | select(.es_bot == true)] | length),
}' "$OUTPUT_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$OUTPUT_FILE" "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 jq -r '.datos[].fecha' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > freq.dat
gnuplot <<EOF gnuplot <<EOF
set terminal pngcairo size 800,400 set terminal pngcairo size 800,400
set output 'grafica_semanal.png' set output 'grafica_semanal.png'
set title "Frecuencia de Visitas Únicas" set title "Evolución de Visitantes Únicos"
set xtics rotate by -45 set xtics rotate by -45
set style fill solid set style fill solid
plot 'freq.dat' using 2:xtic(1) with boxes title "Visitas" plot 'freq.dat' using 2:xtic(1) with boxes title "Visitas"
EOF EOF
# 4. Generar Informe HTML # 6. Generar Informe HTML
RSS_PERC=$(jq '.resumen.usuarios_rss * 100 / .resumen.total_visitantes_unicos' "$OUTPUT_FILE")
cat <<HTML > informe.html cat <<HTML > informe.html
<!DOCTYPE html> <!DOCTYPE html>
<html lang="es"> <html>
<head><meta charset="UTF-8"><title>Reporte de Audiencia</title></head> <head>
<meta charset="UTF-8">
<title>Análisis de Audiencia 2026</title>
<style>body{font-family:sans-serif; margin:40px; background:#f4f4f9;} .card{background:white; padding:20px; border-radius:8px; box-shadow:0 2px 5px rgba(0,0,0,0.1);}</style>
</head>
<body> <body>
<h1>Informe para $URL_A_MONITORIZAR</h1> <div class="card">
<h1>Informe: $URL_A_MONITORIZAR</h1>
<p><b>Actualizado:</b> $(jq -r '.resumen.ultima_actualizacion' "$OUTPUT_FILE")</p>
<hr>
<ul> <ul>
<li><b>Total Visitantes Únicos:</b> $(jq '.resumen.total_visitantes_unicos' "$OUTPUT_FILE")</li> <li>👤 <b>Visitantes Únicos:</b> $(jq '.resumen.total_visitantes_unicos' "$OUTPUT_FILE")</li>
<li><b>Lectores RSS:</b> $(jq '.resumen.usuarios_rss' "$OUTPUT_FILE") ($RSS_PERC%)</li> <li>rss <b>Lectores RSS:</b> $(jq '.resumen.usuarios_rss' "$OUTPUT_FILE")</li>
<li><b>Última ejecución:</b> $(jq -r '.resumen.ultima_actualizacion' "$OUTPUT_FILE")</li> <li>🌐 <b>Fediverso (Mastodon/Etc):</b> $(jq '.resumen.usuarios_fediverso' "$OUTPUT_FILE")</li>
<li>🤖 <b>Bots y Crawlers:</b> $(jq '.resumen.bots_crawlers' "$OUTPUT_FILE")</li>
<li>🖥️ <b>Navegadores Estándar:</b> $(jq '.resumen.usuarios_estandar' "$OUTPUT_FILE")</li>
</ul> </ul>
<img src="grafica_semanal.png"> <img src="grafica_semanal.png" style="max-width:100%;">
</div>
</body> </body>
</html> </html>
HTML HTML
rm temp_data.txt freq.dat rm temp_data.txt freq.dat
echo "Proceso terminado exitosamente." echo "Proceso completado. Revisa informe.html y $OUTPUT_FILE"