Аналитический инструмент «Золотой час контента»: различия между версиями
Материал из Поле цифровой дидактики
Нет описания правки |
Patarakin (обсуждение | вклад) Нет описания правки |
||
| (не показано 7 промежуточных версий 1 участника) | |||
| Строка 53: | Строка 53: | ||
<h3 style="color: #2c3e50;">🗂 Структура проекта</h3> | <h3 style="color: #2c3e50;">🗂 Структура проекта</h3> | ||
<ul> | <ul> | ||
[[Файл:All.png|500px|center|thumb|Общая структура]] | |||
[[Файл:App.png|500px|center|thumb|backend/app.py — основной скрипт [[Python]] для работы с VK API]] | |||
[[Файл:Analitics.png|500px|center|thumb|analytics.py — Cбор данных, обработка VK API]] | |||
[[Файл:Service.png|500px|center|thumb|vk_service.py — модуль для работы с VK API]] | |||
</ul> | </ul> | ||
</div> | </div> | ||
[[Файл:R.png|500px|center|thumb|requirements.txt - требования ]] | |||
<p> файл .env - содержит токен</p> | |||
<p>frontend/index.html:</p> | |||
<pre style="background-color:#1e293b; color:#fff; padding:15px; border-radius:10px; overflow-x:auto;"> | |||
<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> | |||
</pre> | |||
<!-- Описание графиков --> | <!-- Описание графиков --> | ||
| Строка 65: | Строка 250: | ||
<h3 style="color: #2c3e50;">📊 Описание визуализации</h3> | <h3 style="color: #2c3e50;">📊 Описание визуализации</h3> | ||
<ul> | <ul> | ||
<li><b>Первичная страница</b></li> | |||
[[Файл:Per.png|500px|center|thumb|Необходимо ввести домен сообщества VK и нажать кнопку "Анализировать"]] | |||
<li><b>Рекомендации</b></li> | |||
[[Файл:Rec.png|500px|center|thumb|Здесь появляются рекомендации]] | |||
<li><b>Столбчатая диаграмма (Engagement)</b> — пики вовлеченности по часам публикации, золотым выделен максимальный час.</li> | <li><b>Столбчатая диаграмма (Engagement)</b> — пики вовлеченности по часам публикации, золотым выделен максимальный час.</li> | ||
[[Файл:Vol.png|500px|center|thumb|Видим, в какое время в анализируемом сообществе собирает больше активности пользователей]] | |||
<li><b>Много-линейный график</b> — динамика лайков, комментариев и репостов.</li> | <li><b>Много-линейный график</b> — динамика лайков, комментариев и репостов.</li> | ||
[[Файл:Dia.png|500px|center|thumb|Видим, в какое время какой вид взаимодействия с публикациями на пике]] | |||
</ul> | </ul> | ||
</div> | </div> | ||
| Строка 74: | Строка 263: | ||
<!-- Рекомендации --> | <!-- Рекомендации --> | ||
<div style="background-color: #e6f2ff; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> | <div style="background-color: #e6f2ff; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> | ||
<!-- Выводы --> | <!-- Выводы --> | ||
<div style="background-color: #e6f2ff; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> | <div style="background-color: #e6f2ff; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> | ||
=== 📌 Выводы === | |||
# Проект позволяет определить «золотой час» публикаций в VK. | |||
# Вовлеченность оценивается комплексно: лайки, комментарии и репосты. | |||
#Визуализация нескольких графиков делает анализ наглядным и информативным.< | |||
# Проект можно расширить heatmap и AI-моделями для прогнозирования оптимального времени публикаций. | |||
</div> | </div> | ||
</div> | </div> | ||
Текущая версия от 09:21, 27 марта 2026
📊 Аналитика «Золотого часа контента»
Автор: Федышина София
Группа: АДЭУ-221
Дисциплина: Работа с API социальных сетей и визуализация данных
Статус проекта: Выполнен
📘 Введение
Цель проекта — разработать инструмент для анализа публикаций в VK и определения оптимального времени для постинга, чтобы максимизировать вовлеченность аудитории. Проект использует API VK для получения статистики по последним постам сообщества и визуализирует пики активности аудитории через графики.
🎯 Цели проекта
- Определение «золотого часа» публикаций в VK для максимальной вовлеченности.
- Сбор данных о лайках, комментариях и репостах последних постов.
- Визуализация данных с помощью различных типов графиков для наглядности.
- Автоматическая генерация рекомендаций по времени публикаций.
🛠 Архитектура и блок-схема проекта
Проект состоит из backend и frontend. Backend обрабатывает данные VK API, а frontend визуализирует графики и рекомендации.
Ввод домена VK пользователем
Запрос к VK API (Backend)
Сбор лайков, комментариев и репостов
Вычисление вовлеченности (Engagement)
Визуализация графиков и рекомендации (Frontend)
🗂 Структура проекта





файл .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>
📊 Описание визуализации
- Первичная страница
- Рекомендации
- Столбчатая диаграмма (Engagement) — пики вовлеченности по часам публикации, золотым выделен максимальный час.
- Много-линейный график — динамика лайков, комментариев и репостов.




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