Дата: Четверг, 09.10.2025, 07:25 | Сообщение # 1 |
|
Написал: Начинающий
Автор темы
Мурчанн
не в сети
Сообщений: 101
Это сам виджет RSS. Логика его работы следующая: он ищет автора темы, подтягивает его аватарку, текст сообщений и название темы. Виджет обновляется самостоятельно, но структура системы uCoz не позволяет делать обновления слишком часто. Однако страницу можно обновить вручную, чтобы получить актуальные данные. Код
<!-- ::: Мини-виджет последних тем ::: --> <script src="https://jordan.moy.su/js/last_avatar_widget.js"></script> <div id="forum-comments-widget"> <div class="fcw-header">💬 Последние темы RSS</div> <div id="fcw-loading">Загрузка...</div> <div id="fcw-list"></div> </div> <style> /* Скролл для виджета */ #fcw-list::-webkit-scrollbar { width: 8px; } #fcw-list::-webkit-scrollbar-track { background: #1a001f; border-radius: 6px; } #fcw-list::-webkit-scrollbar-thumb { background-color: #ff33ff; border-radius: 6px; border: 2px solid #1a001f; } #fcw-list::-webkit-scrollbar-thumb:hover { background-color: #ff66ff; } /* Контейнер */ #forum-comments-widget { background: #1a001f; color: #fff; padding: 8px; border-radius: 10px; font-family: Arial, sans-serif; font-size: 10px; max-width: 100%; width: auto; box-shadow: 0 0 12px rgba(255,0,255,0.5); transition: box-shadow 0.3s; } #forum-comments-widget:hover { box-shadow: 0 0 20px rgba(255,0,255,0.8); } /* Заголовок */ #forum-comments-widget .fcw-header { font-size: 12px; font-weight: bold; text-align: left; margin-bottom: 6px; color: #ff33ff; text-shadow: 0 0 5px #ff66ff, 0 0 10px #ff00ff; } /* Список сообщений */ #fcw-list { max-height: 650px; overflow-y: auto; padding-right: 4px; } /* Сообщение */ .fcw-item { display: flex; align-items: flex-start; background: rgba(255,0,255,0.05); padding: 5px; border-radius: 5px; margin-bottom: 4px; cursor: pointer; transition: background 0.3s, transform 0.2s, box-shadow 0.3s; opacity: 0; animation: fadeIn 0.5s forwards; } .fcw-item:hover { background: rgba(255,0,255,0.15); transform: translateX(3px); box-shadow: 0 0 6px rgba(255,0,255,0.5); } /* Аватар */ .fcw-avatar { width: 22px; height: 22px; border-radius: 50%; margin-right: 6px; flex-shrink: 0; overflow: hidden; border: 1px solid #ff33ff; box-shadow: 0 0 3px rgba(255,0,255,0.5); transition: transform 0.3s, box-shadow 0.3s; } .fcw-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; } /* Контент */ .fcw-content { flex: 1; min-width: 0; } .fcw-author { color:#ff33ff; font-weight:bold; display:block; font-size:9px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .fcw-text { color: #e0b0ff; font-size:9px; line-height:1.2; overflow:hidden; text-overflow:ellipsis; word-break:break-word; } /* Анимация появления */ @keyframes fadeIn { to { opacity: 1; } } </style>
Это JS ... Логику скрипта можно посмотреть тут. Там есть опция Код
userMap = { "НАСТЯ": "#", "Юля": "#" };
Если аватарки скрипт не поймает, можно подставить в ручную "ник и ссылку" на аватар . Но в целом работает все исправно , не глючил. Код
// auto_rss_avatar_simple.js (function(){ 'use strict'; const widgetId = "forum-comments-widget"; const rssProxy = "https://api.rss2json.com/v1/api.json?rss_url=https://jordan.moy.su/forum/rss"; const maxItems = 13; const defaultAvatar = "/template/amg/images/img/noava.png"; const checkDelay = 150; const cacheKey = 'autoAvatarRSSCache_simple'; const cache = JSON.parse(localStorage.getItem(cacheKey) || '{}'); const userMap = { "НАСТЯ": "#", "Юля": "#" }; function saveCache() { localStorage.setItem(cacheKey, JSON.stringify(cache)); } async function fetchAndFindAvatar(url){ try{ const res = await fetch(url, { cache: 'no-cache' }); if(!res.ok) return null; const txt = await res.text(); const parser = new DOMParser(); const doc = parser.parseFromString(txt, 'text/html'); const el = doc.querySelector('img[src*="/avatar/"], img[src*="/ava/"], .user_avatar img'); return el ? new URL(el.src, location.href).href : null; }catch(e){ return null; } } function buildProfileCandidates(username){ if(!username) return []; const safe = encodeURIComponent(username.replace(/\s+/g,'-')); return [ location.origin + '/index/8-0-' + safe, location.origin + '/index/8-0-' + username ]; } async function getAvatar(username){ if(!username) return defaultAvatar; if(cache[username]) return cache[username]; if(userMap[username] && userMap[username]!=="#"){ cache[username] = userMap[username]; saveCache(); return userMap[username]; } const candidates = buildProfileCandidates(username); for(const c of candidates){ const found = await fetchAndFindAvatar(c); if(found){ cache[username] = found; saveCache(); return found; } await new Promise(r => setTimeout(r, checkDelay)); } cache[username] = defaultAvatar; saveCache(); return defaultAvatar; } function createWidgetContainer(){ if(document.getElementById(widgetId)) return; const container = document.createElement("div"); container.id = widgetId; container.innerHTML = ` <div class="fcw-header">💬 Последние сообщения</div> <div id="fcw-loading">Загрузка...</div> <div id="fcw-list"></div> `; document.body.appendChild(container); const style = document.createElement("style"); style.innerHTML = ` #${widgetId} { width: 90%; max-height: 700px; background: #111; color: #fff; padding:6px; border-radius:6px; font-family:Arial,sans-serif; box-sizing:border-box; } .fcw-header { font-size:12px; font-weight:bold; margin-bottom:6px; text-align:center; color:#4ec9b0; } #fcw-list { max-height:650px; overflow-y:auto; padding-right:4px; box-sizing:border-box; } .fcw-item { display:flex; align-items:flex-start; padding:4px; margin-bottom:4px; background:rgba(255,255,255,0.03); border-radius:4px; cursor:pointer; } .fcw-avatar { width:24px; height:24px; flex-shrink:0; border-radius:50%; margin-right:6px; overflow:hidden; } .fcw-avatar img { width:24px; height:24px; border-radius:50%; object-fit:cover; display:block; } .fcw-content { flex:1 1 auto; min-width:0; overflow:hidden; word-break:break-word; } .fcw-author { font-size:10px; font-weight:bold; color:#4ec9b0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:block; margin-bottom:1px; } .fcw-title { font-size:11px; font-weight:bold; color:#fff; text-decoration:underline; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:block; margin-bottom:1px; } .fcw-text { font-size:10px; color:#ccc; line-height:1.2; overflow:hidden; text-overflow:ellipsis; word-break:break-word; }`; document.head.appendChild(style); } function extractSnippet(html, length = 100){ const div = document.createElement('div'); div.innerHTML = html; const text = div.textContent || div.innerText || ''; return text.trim().substring(0, length) + (text.length > length ? '…' : ''); } async function loadRSS(){ const list = document.querySelector("#fcw-list"); const loading = document.querySelector("#fcw-loading"); if(!list || !loading) return; try{ const res = await fetch(rssProxy); const data = await res.json(); if(!data.items || data.items.length===0){ loading.textContent = "Нет сообщений для отображения."; return; } let html = ""; for(let i=0; i<Math.min(maxItems, data.items.length); i++){ const item = data.items[i]; const authorMatch = item.description.match(/Автор темы:\s*([^<]+)/i); const author = authorMatch ? authorMatch[1].trim() : "Неизвестен"; const avatarSrc = await getAvatar(author); const snippet = extractSnippet(item.content || item.description || '', 100); html += `<div class="fcw-item" onclick="window.open('${item.link}','_blank')"> <div class="fcw-avatar"><img src="${avatarSrc}" alt="avatar"></div> <div class="fcw-content"> <span class="fcw-author">${author}</span> <span class="fcw-title">${item.title || "Без названия"}</span> <span class="fcw-text">${snippet}</span> </div> </div>`; } loading.style.display = "none"; list.innerHTML = html; }catch(e){ console.error(e); loading.textContent = "Ошибка при загрузке сообщений."; } } function init(){ createWidgetContainer(); loadRSS(); } if(document.readyState==="loading"){ document.addEventListener("DOMContentLoaded", init); } else { init(); } })();
Просто замените ссылку на свой RSS-канал, и виджет будет подгружать последние темы форума. Теоретически можно было бы создать виджет с последними комментариями на форуме, но движок форума не рассчитан на это. Возможно, в платных опциях Юкоза такая функция есть , точно не знаю, я использую бесплатный хостинг.
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Пятница, 10.10.2025, 07:56 | Сообщение # 2 |
|
Написал: Новичок
Кот
не в сети
Сообщений: 7
Можно добавить ещё некоторые параметры Почему RSS-виджет обновляется раз в сутки Многие браузеры сохраняют запросы к RSS или JSON, чтобы не перегружать сервер. По умолчанию иногда ставят тайм-аут 24 часа (86400 секунд).Как это исправить / ускорить обновление Принудительное обновление Ctrl+F5 очищает кэш браузера → виджет заново загружается.
Сообщение отредактировал Кот - Пятница, 10.10.2025, 07:58
Сначала определитесь со своим идеалом: поставьте цель. Потом запаситесь необходимыми средствами для её достижения: мудростью, деньгами, методами и материалами. И, наконец, используйте все свои средства для достижения цели.
Дата: Пятница, 10.10.2025, 08:00 | Сообщение # 3 |
|
Написал: Новичок
Кот
не в сети
Сообщений: 7
То, что RSS-виджет обновляется раз в сутки это не ошибка, а особенность кэша uCoz + браузера. Чтобы обновление было чаще: Добавь “антикэш” к URL (метка времени). Используй JS для автообновления виджета. Вставь к себе Код
setInterval(() => { updateRssWidget(); // функция, которая перезаполняет блок RSS }, 5 * 60 * 1000); // каждые 5 минут
Сначала определитесь со своим идеалом: поставьте цель. Потом запаситесь необходимыми средствами для её достижения: мудростью, деньгами, методами и материалами. И, наконец, используйте все свои средства для достижения цели.