Список пользователей

1
Админ
Постов: 101
2
Элита
Постов: 34
3
Элита
Постов: 28
4
VIP
Постов: 26
5
Дизайнер
Постов: 25
6
Пользователи
Постов: 25
7
Пользователи
Постов: 24
8
Проверенные
Постов: 21

  • Страница 1 из 1
  • 1
Последние темы RSS канал на UCOZ
Дата: Четверг, 09.10.2025, 07:25 | Сообщение # 1 | | Написал: Начинающий
Автор темы
Мурчанн не в сети
        Сообщений:101
         Регистрация:20.10.2016

Это сам виджет RSS. Логика его работы следующая: он ищет автора темы, подтягивает его аватарку, текст сообщений и название темы. Виджет обновляется самостоятельно, но структура системы uCoz не позволяет делать обновления слишком часто. Однако страницу можно обновить вручную, чтобы получить актуальные данные. 12

Код


<!-- ::: Мини-виджет последних тем ::: -->
<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 = {
    "НАСТЯ": "#",
    "Юля": "#"
  };


Если аватарки скрипт не поймает, можно подставить в ручную "ник и ссылку" на аватар .
Но в целом работает все исправно , не глючил. 12

Код
// 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
         Регистрация:21.08.2023
За любовь народа

Можно добавить ещё некоторые параметры 2

Почему RSS-виджет обновляется раз в сутки
Многие браузеры сохраняют запросы к RSS или JSON, чтобы не перегружать сервер.
По умолчанию иногда ставят тайм-аут 24 часа (86400 секунд).
Как это исправить / ускорить обновление
Принудительное обновление

Ctrl+F5 очищает кэш браузера → виджет заново загружается.

Кот

Сообщение отредактировал Кот - Пятница, 10.10.2025, 07:58
Сначала определитесь со своим идеалом: поставьте цель. Потом запаситесь необходимыми средствами для её достижения: мудростью, деньгами, методами и материалами. И, наконец, используйте все свои средства для достижения цели.
Дата: Пятница, 10.10.2025, 08:00 | Сообщение # 3 | | Написал: Новичок
Кот не в сети
        Сообщений:7
         Регистрация:21.08.2023
За любовь народа

То, что RSS-виджет обновляется раз в сутки это не ошибка, а особенность кэша uCoz + браузера.

Чтобы обновление было чаще:
Добавь “антикэш” к URL (метка времени).
Используй JS для автообновления виджета.

Вставь к себе 12

Код
setInterval(() => {
    updateRssWidget(); // функция, которая перезаполняет блок RSS
}, 5 * 60 * 1000); // каждые 5 минут

Кот

Сначала определитесь со своим идеалом: поставьте цель. Потом запаситесь необходимыми средствами для её достижения: мудростью, деньгами, методами и материалами. И, наконец, используйте все свои средства для достижения цели.
  • Страница 1 из 1
  • 1
Поиск: