Аналитический инструмент «Золотой час контента»

Материал из Поле цифровой дидактики

📊 Аналитика «Золотого часа контента»

Автор: Федышина София

Группа: АДЭУ-221

Дисциплина: Работа с API социальных сетей и визуализация данных

Статус проекта: Выполнен

📘 Введение

Цель проекта — разработать инструмент для анализа публикаций в VK и определения оптимального времени для постинга, чтобы максимизировать вовлеченность аудитории. Проект использует API VK для получения статистики по последним постам сообщества и визуализирует пики активности аудитории через графики.

🎯 Цели проекта

  • Определение «золотого часа» публикаций в VK для максимальной вовлеченности.
  • Сбор данных о лайках, комментариях и репостах последних постов.
  • Визуализация данных с помощью различных типов графиков для наглядности.
  • Автоматическая генерация рекомендаций по времени публикаций.

🛠 Архитектура и блок-схема проекта

Проект состоит из backend и frontend. Backend обрабатывает данные VK API, а frontend визуализирует графики и рекомендации.

Ввод домена VK пользователем
Запрос к VK API (Backend)
Сбор лайков, комментариев и репостов
Вычисление вовлеченности (Engagement)
Визуализация графиков и рекомендации (Frontend)

🗂 Структура проекта

    Общая структура
    backend/app.py — основной скрипт Python для работы с VK API
    analytics.py — Cбор данных, обработка VK API
    vk_service.py — модуль для работы с VK API
requirements.txt - требования

файл .env - содержит токен

frontend/index.html:

<code>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Аналитика "Золотого часа"</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            background: #0f172a;
            color: white;
            margin: 0;
            padding: 20px;
        }

        h1 {
            text-align: center;
            margin-bottom: 30px;
        }

        .controls {
            text-align: center;
            margin-bottom: 20px;
        }

        input, button {
            padding: 12px;
            border-radius: 10px;
            border: none;
            margin: 5px;
        }

        button {
            background: #2563eb;
            color: white;
            cursor: pointer;
        }

        .ai-box {
            margin: 20px auto;
            padding: 20px;
            background: #1e293b;
            border-radius: 15px;
            text-align: center;
        }

        .charts {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 20px;
            margin-top: 20px;
        }

        canvas {
            background: #1e293b;
            padding: 15px;
            border-radius: 15px;
        }
    </style>
</head>
<body>

<h1>📊 Аналитика "Золотого часа контента"</h1>

<div class="controls">
    <input id="group" placeholder="Введите домен VK (например: kosti_bloggers)">
    <button onclick="loadData()">Анализировать</button>
</div>

<!-- Блок рекомендаций -->
<div class="ai-box">
    <h3>Рекомендации</h3>
    <p id="aiText">Здесь появятся рекомендации...</p>
</div>

<div class="charts">
    <canvas id="engagementChart"></canvas>
    <canvas id="multiChart"></canvas>
    <canvas id="areaChart"></canvas>
    <canvas id="polarChart"></canvas>
</div>

<script>
let charts = [];

function destroyCharts() {
    charts.forEach(c => c.destroy());
    charts = [];
}

function generateAI(bestHour, engagement) {
    const max = Math.max(...engagement);
    const avg = engagement.reduce((a, b) => a + b, 0) / engagement.length;
    const diff = ((max / avg - 1) * 100).toFixed(0);
    return `Рекомендуем публиковать посты примерно в ${bestHour}:00. В этот час вовлеченность выше средней на ${diff}%. Это оптимальное время для максимального охвата аудитории.`;
}

async function loadData() {
    const group = document.getElementById("group").value;
    if (!group) return alert("Введите домен VK!");

    try {
        const res = await fetch(`http://127.0.0.1:8000/analyze?domain=${group}`);
        const data = await res.json();

        const hours = data.data.map(d => d.hour);
        const engagement = data.data.map(d => d.engagement);
        const likes = data.data.map(d => d.likes);
        const comments = data.data.map(d => d.comments);
        const reposts = data.data.map(d => d.reposts);

        destroyCharts();

        const maxVal = Math.max(...engagement);

        // 1. Столбчатая диаграмма (главный график)
        charts.push(new Chart(document.getElementById("engagementChart"), {
            type: 'bar',
            data: {
                labels: hours,
                datasets: [{
                    label: 'Вовлеченность',
                    data: engagement,
                    backgroundColor: engagement.map(v => v === maxVal ? '#FFD700' : '#3b82f6')
                }]
            }
        }));

        // 2. Много-линейный график
        charts.push(new Chart(document.getElementById("multiChart"), {
            type: 'line',
            data: {
                labels: hours,
                datasets: [
                    { label: 'Лайки', data: likes, borderColor: '#3b82f6', tension: 0.4 },
                    { label: 'Комментарии', data: comments, borderColor: '#16a34a', tension: 0.4 },
                    { label: 'Репосты', data: reposts, borderColor: '#f97316', tension: 0.4 }
                ]
            }
        }));

        // 3. Area chart
        charts.push(new Chart(document.getElementById("areaChart"), {
            type: 'line',
            data: {
                labels: hours,
                datasets: [
                    { label: 'Лайки', data: likes, fill: true, backgroundColor: 'rgba(59,130,246,0.3)', borderColor: '#3b82f6' },
                    { label: 'Комментарии', data: comments, fill: true, backgroundColor: 'rgba(22,163,52,0.3)', borderColor: '#16a34a' },
                    { label: 'Репосты', data: reposts, fill: true, backgroundColor: 'rgba(249,115,22,0.3)', borderColor: '#f97316' }
                ]
            }
        }));

        // 4. Polar chart
        charts.push(new Chart(document.getElementById("polarChart"), {
            type: 'polarArea',
            data: {
                labels: hours,
                datasets: [{
                    label: 'Распределение активности',
                    data: engagement,
                    backgroundColor: engagement.map(v => `hsl(${Math.random()*360}, 70%, 50%)`)
                }]
            }
        }));

        document.getElementById("aiText").innerText = generateAI(data.best_hour, engagement);

    } catch (error) {
        alert("Ошибка при загрузке данных. Проверьте сервер и домен.");
        console.error(error);
    }
}
</script>

</body>
</html>
</code>

📊 Описание визуализации

  • Первичная страница
  • Необходимо ввести домен сообщества VK и нажать кнопку "Анализировать"
  • Рекомендации
  • Здесь появляются рекомендации
  • Столбчатая диаграмма (Engagement) — пики вовлеченности по часам публикации, золотым выделен максимальный час.
  • Видим, в какое время в анализируемом сообществе собирает больше активности пользователей
  • Много-линейный график — динамика лайков, комментариев и репостов.
  • Видим, в какое время какой вид взаимодействия с публикациями на пике

📌 Выводы

  1. Проект позволяет определить «золотой час» публикаций в VK.
  2. Вовлеченность оценивается комплексно: лайки, комментарии и репосты.
  3. Визуализация нескольких графиков делает анализ наглядным и информативным.<
  4. Проект можно расширить heatmap и AI-моделями для прогнозирования оптимального времени публикаций.