Обновлённый виджет рефералов (версия от 22 марта) Реализовано на PuzzleBot 💙

«Простой код — лучший союзник хорошего дизайна.»
«Простой код — лучший союзник хорошего дизайна.»

🆕 Что нового в этой версии

Это обновлённая версия кода от 22 марта. Я улучшил интерфейс и добавили полезный функционал:
• Отображение аватарки 
• Вывод username (с @) 
• Каждая карточка стала кликабельной — ведёт на профиль пользователя 
• Минималистичный, но приятный дизайн 
• Поддержка фильтрации по status (поиск по {{USERNAME_TEXT}})

🔧 Что делает этот код

1. Получает данные из таблицы NocoDB через API. 
2. Отбирает только нужные записи (где поле status содержит {{USERNAME_TEXT}}). 
3. Показывает список рефералов: аватар, имя, username, ссылка на профиль. 
4. Если записей нет — пишет: «Нет приглашённых рефералов».

🗂 Таблица в NocoDB — нужные поля

Создайте таблицу с такими полями:

Обновлённый виджет рефералов (версия от 22 марта) Реализовано на PuzzleBot 💙
⚠ Обязательно вписывайте в status нужный маркер (например: {{USERNAME_TEXT}}), чтобы фильтрация работала.

🧩 Обновлённый код (HTML + JS)

<div class="views-list" id="viewsList"></div> <script> const api = 'https://nocodb.puzzlebot.top/api/v2/tables/mowc********5sx60/records'; const token = 'L5cLH1****************UTiweBbe-COJXh'; fetch(api, { headers: { 'accept': 'application/json', 'xc-token': token } }) .then(res => res.json()) .then(data => { const list = (data.list []).filter(r => (r.status '').includes('{{USERNAME_TEXT}}')); const container = document.getElementById('viewsList'); if (!list.length) { container.innerHTML = '<p>Нет приглашённых рефералов</p>'; return; } container.innerHTML = list.map(r => ` <a href="${r.linkprofil || '#'}" target="_blank" class="view-row"> <img src="${r.avatar || 'https://via.placeholder.com/50'}" class="avatar"> <div class="text-block"> <div class="name">${r.name || 'Без имени'}</div> <div class="username">@${r.username || ''}</div> </div> </a> `).join(''); }); </script>

Немного стилей (CSS)

.view-row { display: flex; gap: 12px; background: #f9f9f9; border-radius: 16px; padding: 10px 14px; text-decoration: none; color: #000; align-items: center; transition: background 0.2s; } .view-row:hover { background: #eef3ff; } .avatar { width: 50px; height: 50px; border-radius: 50%; object-fit: cover; } .text-block .name { font-weight: bold; font-size: 16px; } .text-block .username { font-size: 14px; color: #59baf1; }

Результат 
• Список рефералов в красивом формате 
• С аватарками 
• С юзернеймами 
• С кликабельными ссылками на профиль «Такой код легко вставить в любой сайт или лендинг. Всё работает сразу и не требует фреймворков.»

Замените на свои токены и все заработает!

Если возникнут вопросы пишите в предложку канала.

Готовый код!

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Список Рефералов </title> <style> body { font-family: sans-serif; background: #f2f2f2; margin: 0; padding: 0px 0; display: flex; justify-content: center; } h2 { margin-top: 0; margin-bottom: 20px; font-size: 20px; text-align: center; color: #333; } .views-list { display: flex; flex-direction: column; gap: 12px; } .view-row { display: flex; align-items: center; gap: 12px; background: #f9f9f9; border-radius: 16px; padding: 10px 14px; text-decoration: none; color: inherit; transition: background 0.2s; } .view-row:hover { background: #eef3ff; } .view-row .avatar { width: 50px; height: 50px; border-radius: 50%; object-fit: cover; background: #ddd; flex-shrink: 0; } .view-row .text-block { display: flex; flex-direction: column; width: 100%; } .view-row .name-line { display: flex; justify-content: space-between; align-items: center; } .view-row .name { font-size: 16px; font-weight: 500; color: #333; } .view-row .extra { font-size: 14px; color: #999; white-space: nowrap; margin-left: 10px; } .view-row .username { font-size: 14px; color: #59baf1; margin-top: 2px; } </style> </head> <body> <div class="wrapper"> <div class="views-list" id="viewsList"></div> </div> <script> const token = 'ВАШ ТОКЕН NOCODB; const tableUrl = 'https://nocodb.puzzlebot.top/api/v2/tables/ВАШ ТОКЕН ID ТАБЛИЦЫ /records'; async function fetchData() { try { const res = await fetch(tableUrl, { headers: { 'accept': 'application/json', 'xc-token': token } }); const data = await res.json(); const records = data.list || []; renderViews(records); } catch (error) { console.error('Ошибка при получении данных:', error); } } function renderViews(items) { const container = document.getElementById('viewsList'); container.innerHTML = ''; // ФИЛЬТРУЕМ: оставляем только записи, где поле 'status' содержит '{{USERNAME_TEXT}}' const filteredItems = items.filter(item => { const status = item.status || ''; // замени 'status' на своё поле return status.includes('{{USERNAME_TEXT}}'); }); filteredItems.forEach(item => { const avatar = item.avatar || 'https://via.placeholder.com/60'; const name = item.name || 'Без имени'; const username = item.username || ''; const link = item.linkprofil || '#'; const extra = item.null|| ''; // замени 'null' если нужно const row = document.createElement('a'); row.className = 'view-row'; row.href = link; row.target = '_blank'; row.innerHTML = ` <img src="${avatar}" alt="${name}" class="avatar"> <div class="text-block"> <div class="name-line"> <div class="name">${name}</div> <br> </div> <div class="username">${username}</div> </div> `; container.appendChild(row); }); // Если нет подходящих - сообщение: if (filteredItems.length === 0) { container.innerHTML = '<p>Нет приглашенных рефералов</p>'; } } fetchData(); </script> </body> </html>

ПОДПИШИСЬ!

2
Начать дискуссию
","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Немного стилей (CSS)"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":".view-row {\n display: flex;\n gap: 12px;\n background: #f9f9f9;\n border-radius: 16px;\n padding: 10px 14px;\n text-decoration: none;\n color: #000;\n align-items: center;\n transition: background 0.2s;\n}\n.view-row:hover {\n background: #eef3ff;\n}\n.avatar {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n object-fit: cover;\n}\n.text-block .name {\n font-weight: bold;\n font-size: 16px;\n}\n.text-block .username {\n font-size: 14px;\n color: #59baf1;\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Результат 
• Список рефералов в красивом формате 
• С аватарками 
• С юзернеймами 
• С кликабельными ссылками на профиль «Такой код легко вставить в любой сайт или лендинг. Всё работает сразу и не требует фреймворков.»

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Замените на свои токены и все заработает!

"}},{"type":"link","cover":false,"hidden":false,"anchor":"","data":{"link":{"type":"link","data":{"url":"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Ft.me%2FPuzzleHTML&postId=2097026","title":"Puzzle Html • Шаблоны","description":"@PuzzleHtmlBot: Мы предлагаем широкий спектр готовых шаблонов, которые помогут пригодиться в Mini-App","image":{"type":"image","data":{"uuid":"0c5ec522-6456-5837-a7a9-efa6a12645d2","width":180,"height":180,"size":4016,"type":"png","color":"26a5e4","hash":"","external_service":[]}},"v":1,"hostname":"t.me"}}}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Если возникнут вопросы пишите в предложку канала.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Готовый код!"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n\n\n \n Список Рефералов \n \n\n\n\n
\n
\n
\n\n \n\n\n","lang":""}},{"type":"link","cover":false,"hidden":false,"anchor":"","data":{"link":{"type":"link","data":{"url":"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Ft.me%2FPuzzleHTML&postId=2097026","title":"Puzzle Html • Шаблоны","description":"@PuzzleHtmlBot: Мы предлагаем широкий спектр готовых шаблонов, которые помогут пригодиться в Mini-App","image":{"type":"image","data":{"uuid":"0c5ec522-6456-5837-a7a9-efa6a12645d2","width":180,"height":180,"size":4016,"type":"png","color":"26a5e4","hash":"","external_service":[]}},"v":1,"hostname":"t.me"}}}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

ПОДПИШИСЬ!

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":0,"reposts":0,"views":529,"hits":221,"reads":null,"online":0},"dateFavorite":0,"hitsCount":221,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":"Обновлённый виджет рефералов, улучшенный интерфейс, отображение аватарок, кликабельные ссылки на профиль, поддержка фильтрации по статусу.","url":"https://vc.ru/telegram/2097026-obnovlennyj-vidzhet-referalov-22-marta","author":{"id":755936,"name":"Hacker Verifure","nickname":null,"description":"Шаблоны HTML виджетов: Мы предлагаем широкий спектр готовых шаблонов, которые помогут пригодиться в Mini-App","uri":"","avatar":{"type":"image","data":{"uuid":"f536a51a-90ad-53e6-9996-52506cd70148","width":828,"height":828,"size":59583,"type":"jpg","color":"e7d4c5","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5Ojf/2wBDAQoKCg0MDRoPDxo3JR8lNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzf/wAARCAAKAAoDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIFB//EACYQAAECBAMJAAAAAAAAAAAAAAECAwAEESEFBjESExUiMkFRYXH/xAAUAQEAAAAAAAAAAAAAAAAAAAAF/8QAHREAAQQCAwAAAAAAAAAAAAAAAQACBBEDMVFhof/aAAwDAQACEQMRAD8AotzRmcTCEzZC0sgol20jmNb1tXT55hjO3NiPR7QZHSnj2KKoNre60v1LjQCw0TUtIJOpKRCEebT322we9IyTBvGwB1EDjfq//9k="}},"cover":{"cover":{"type":"image","data":{"uuid":"03bffb95-befa-548d-9188-a0dff1180e28","width":800,"height":800,"size":44565,"type":"jpg","color":"32a9f6","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAQDAwQDAwQEAwQFBAQFBgoHBgYGBg0JCggKDw0QEA8NDw4RExgUERIXEg4PFRwVFxkZGxsbEBQdHx0aHxgaGxr/2wBDAQQFBQYFBgwHBwwaEQ8RGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhr/wAARCAAKAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABgAD/8QAIhABAAEDAwQDAAAAAAAAAAAAAQIAAxIFE1EEETGRQVKh/8QAFQEBAQAAAAAAAAAAAAAAAAAABwj/xAAcEQEAAQQDAAAAAAAAAAAAAAABAgADBREhcaH/2gAMAwEAAhEDEQA/AF17X4FvpdgtXBlhed1jKPzl2RH6/tZT12MZyI3BBQR80HyeX3Vk8vunyGMtwXau/KneeQnIAA13zX//2Q=="}},"cover_y":50},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4680765,"userId":755936,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4680765"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1056678,"userId":755936,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1056678"}],"lastModificationDate":1764979830,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":3680492,"name":"Телеграм","description":"Все о мессенджере Телеграм: новые фичи, каналы, новости, Павел Дуров, TON","uri":"/telegram","avatar":{"type":"image","data":{"uuid":"a6bd3ea3-1a25-5402-8c27-d063a43ad500","width":500,"height":500,"size":6665,"type":"jpg","color":"28a7e8","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAKAAoDASEAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABgME/8QAIRAAAQIGAgMAAAAAAAAAAAAAAQMEAAIFERIxBiETFEH/xAAVAQEBAAAAAAAAAAAAAAAAAAAEB//EABkRAAIDAQAAAAAAAAAAAAAAAAIDAAERYf/aAAwDAQACEQMRAD8AZcWpFGqLJ24fVgJKt2yi3ryjGY4g2F5tkn4AeoNBQ21FOS5hsMSHKrM7I69C1qAgLbLd5yTVA8uo0AdQmoSf/9k="}},"cover":{"type":"image","data":{"uuid":"ebe1c612-381b-52c8-897c-ac8a8002770f","width":1920,"height":1080,"size":636123,"type":"jpg","color":"def2f4","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAKAAoDASEAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAwEI/8QAHxAAAQMEAwEAAAAAAAAAAAAAAQACERIiQVEhMTKS/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAEDBP/EABURAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIRAxEAPwDSQjeNKtIgXD5V2EVToNx8jKRrnUjk9bQUf//Z"}},"lastModificationDate":1721721308,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"telegram","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":2}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":[],"media":{"type":"image","data":{"uuid":"1e82411d-7486-5609-ac85-348cd51be936","width":1600,"height":724,"size":50695,"type":"jpg","color":"5ea5f8","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAKAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABwAD/8QAJBAAAAUCBQUAAAAAAAAAAAAAAAECAwQR0QUSFVSTFCFVorL/xAAVAQEBAAAAAAAAAAAAAAAAAAAEBf/EABwRAAEDBQAAAAAAAAAAAAAAAAABsdECExRRUv/aAAwDAQACEQMRAD8AZmIbSqmWHsrp2PMSSL5G/RN+Ki+tgeajO3kjlVcWozt7I5VXFLHq6eQN5NNB/9k="}},"customCover":null,"robotsTag":"noindex","categories":[3],"isAnonymized":true}};