Система розыгрышей среди бустеров вашего канала или группы

В данной статье мы разберём создание системы розыгрышей за голоса (бусты) на ваши ресурсы через мини-приложение на PuzzleBot. Рассмотрим оформление дизайна, техническая реализация и настройка баз данных для запуска системы.

Система розыгрышей среди бустеров вашего канала или группы

В качестве среды разработки мы используем сервис PuzzleBot, а в качестве базы данных – NocoDB. При желании можно выбрать другую базу данных.

Демонстрация визуальной части

Опробовать функционал можно тут - t.me/StructurePuzzleBot/contest

Разработка

NocoDB

Для начала создадим базу данных NocoDB (назовём её "Розыгрыш") с двумя таблицами:

1. Создадим таблицу "Участники". Она будет содержать следующие столбцы:

  • user_id — число — данный столбец будет содержать ID участника розыгрыша.
  • user_name — текст — данный столбец будет содержать имя участника.
  • number — число — данный столбец будет содержать порядковый номер участника, что будет необходимо для определения победителя случайным образом.
Система розыгрышей среди бустеров вашего канала или группы

2. Создадим таблицу "Победители" со столбцами:

  • user_id — число — данный столбец будет содержать ID победителя.
  • user_name — текст — данный столбец будет содержать имя победителя.
Система розыгрышей среди бустеров вашего канала или группы

Переменные

Создадим следующие переменные:

Глобальные:

  • members_num – числовая – значение по умолчанию "0" – эта переменная позволит задавать порядковый номер участникам.
Система розыгрышей среди бустеров вашего канала или группы

Персональные:

  • winners_list – интегрированная: NocoDB – значение по умолчанию "none" (кавычки писать не надо):

Выберите базу данных "Розыгрыш"
Выберите таблицу "Победители"
Откройте дополнительные настройки и переключите параметр "Вариант поиска" на "Все"
В поле "Значение" выберите тип "Строка"
В качестве разделителя укажите "\n" (без кавычек)
В поле "Шаблон" введите:

[[user_name]] – Название приза
Система розыгрышей среди бустеров вашего канала или группы
  • contest_decription – формула:
if({{winners_list}} != "none" , {{winners_list}}, "Произвольный текст описания конкурса.")

Я же использовал формулу:

if({{winners_list}} != "none" , {{winners_list}}, "1 мая в 15:00 бот определит одного победителя среди отдавших голос каналу <a href=\"https://t.me/RDGlessons?boost\">RDG :// Lessons</a> пользователей, который получит <a href=\"tg://premium_offer\" target=\"_blank\">Telegram Premium на 6 месяцев</a>.")
  • member_num – текстовая
  • random_member – формула:
random({{members_num}})
Система розыгрышей среди бустеров вашего канала или группы
  • get_random_member_id – интегрированная: NocoDB:

Выберите базу данных "Розыгрыш"
Выберите таблицу "Участники"
Добавьте фильтр соответствия столбца number и переменной {{member_num}}
В поле "Название столбца" выберите "user_id"

Система розыгрышей среди бустеров вашего канала или группы
  • get_random_member_name – интегрированная: NocoDB:

Выберите базу данных "Розыгрыш"
Выберите таблицу "Участники"
Добавьте фильтр соответствия столбца number и переменной {{member_num}}
В поле "Название столбца" выберите "user_name"

Система розыгрышей среди бустеров вашего канала или группы

Конструктор

Для разработки достаточно 5 команд.
Для разработки достаточно 5 команд.

1. Создадим мини-приложение "Вступление в розыгрыш"
Данное мини-приложение будет нести ознакомительный характер, поэтому его можно заполнить любой информацией. Я же заполнил следующими несколькими HTML блоками:

<head> <script src="https://unpkg.com/@lottiefiles/lottie-player@1.7.0/dist/lottie-player.js"></script> <style> .container { width: 100%; height: 250px; background: radial-gradient(circle, #96D9FF, #34A2FA); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; position: absolute; left: 0; right: 0; top: 0; overflow: hidden; } .lottie-animation { width: 160px; height: auto; z-index: 2; } .text { color: #FFFFFF; font-weight: 500; letter-spacing: -0.5px; margin-top: 12px; z-index: 2; } .title { font-size: 15px; } .date { font-size: 13px; color: rgba(255, 255, 255, 0.6); } .particle, .star { position: absolute; top: 50%; left: 50%; width: 6px; height: 6px; background: rgba(255, 255, 255, 0.5); border-radius: 50%; pointer-events: none; animation: float 3s linear forwards; z-index: 1; } .star { width: 8px; height: 8px; background: rgba(255, 255, 255, 0.7); transform: rotate(45deg); border-radius: 2px; } @keyframes float { 0% { transform: translate(0, 0) scale(1); opacity: 1; } 100% { transform: translate(var(--x), var(--y)) scale(0.5); opacity: 0; } } </style> </head> <body> <div class="container"> <lottie-player class="lottie-animation" src="https://s3.pxsto.re/static/bluegift.json" background="transparent" speed="1" autoplay></lottie-player> <div class="text title">Розыгрыш Telegram Premium</div> <div class="text date">1 мая 2025 в 15:00</div> </div> <script> const container = document.querySelector('.container'); function createParticle(isStar = false) { const particle = document.createElement('div'); particle.className = isStar ? 'star' : 'particle'; const angle = Math.random() * 2 * Math.PI; const radius = 100 + Math.random() * 50; const x = Math.cos(angle) * radius + 'px'; const y = Math.sin(angle) * radius + 'px'; particle.style.setProperty('--x', x); particle.style.setProperty('--y', y); particle.style.animationDuration = (2 + Math.random() * 2) + 's'; container.appendChild(particle); setTimeout(() => { particle.remove(); }, 4000); } setInterval(() => { createParticle(Math.random() < 0.3); }, 200); </script> </body>

Этот HTML-блок создаёт красивое вступление с Lottie-анимацией, градиентным фоном и частицами на заднем плане. Также в text title и text date можно указать заголовок и дату окончания розыгрыша соответственно.

<head> <style> .winner-title { font-size: 14px; font-weight: bold; color: rgba(0, 0, 0, 0.5); margin-bottom: 10px; } .winner-description { font-size: 15px; color: #000000; line-height: 22px; } .winner-description a { color: #007AFF; font-weight: inherit; } </style> </head> <body> <div style="margin-top: 230px;"> <div class="winner-title">1 ПОБЕДИТЕЛЬ</div> <div class="winner-description">{{contest_decription}}</div> </div> </body>

Этот HTML-блок будет отображать дополнительную информацию о розыгрыше. Если розыгрыш завершён в этом блоке будет отображаться список победителей. Заголовок winner-title можно изменить, а описание советую менять в формуле переменной contest_decription.

Добавьте фиксированную клавиатуру с двумя кнопками:

  • "Отдать голос" – ссылка (браузер по умолчанию). Укажите ссылку на ресурс формата https://t.me/username?boost. Нажатие на эту кнопку откроет окно "Голосов" ресурса.
  • "Участвовать" — кнопка-условие. Введите название кнопки-условия: "Участвовать в конкурсе". Ниже мы разберём её настройку.
Система розыгрышей среди бустеров вашего канала или группы

2. Создадим кнопку-условие "Участвовать в конкурсе" со следующими правилами:

Правило 1:

Создайте условие проверки значения переменной.
Укажите следующее выражение: winners_list – полное совпадение – "-none" (кавычки писать не надо).
В "Название кнопки" введите "Розыгрыш завершён"
В действиях выберите: "Без действия"

Правило 2:

Создайте условие проверки строки NocoDB.
Выберите базу данных "Розыгрыш"
Выберите таблицу "Участники"
Добавьте фильтр с выражением, проверяющим соответствие поля user_id с переменной {{USER_ID_TEXT}}
В "Название кнопки" введите "Вы уже участвуете"
В действиях выберите: "Без действия"

Исключающее правило:

В "Название кнопки" введите "Участвовать"
В действиях добавьте "Отправить команду или условие" и введите условие "Проверка голоса". Создание и настройку этого условия мы разберём ниже.

Система розыгрышей среди бустеров вашего канала или группы
Система розыгрышей среди бустеров вашего канала или группы

3. Создадим условие "Проверка голоса"

В правиле добавим проверку "Голос для ресурсов (Boost)"
Выберите ресурсы, которым необходимо будет дать голос
Дополнительно можно указать количество голосов на каждый ресурс или в сумме.

В действиях:
Добавим действие изменение переменной members_num по выражению +1

Добавим действие "Создать строку (NocoDB)"

Выберем базу "Розыгрыш"
Выберем таблицу "Участники"
Заполним поля следующим образом:

  • user_id: {{USER_ID_TEXT}}
  • user_name: {{FIRST_AND_LAST_NAME}}
  • number: {{members_num}}

Добавим действие "Переход к мини-приложению" и укажите мини-приложение "Теперь в розыгрыше". Позже мы разберём её создание.

Исключающее правило:
Добавим действие "Переход к мини-приложению" и укажите мини-приложение "Условия не выполнены". Ниже мы разберём её создание.

Система розыгрышей среди бустеров вашего канала или группы

4. Создадим два мини-приложения: "Теперь в розыгрыше" и "Условия не выполнены". Технически эти мини-приложения очень похожи – единственное, что в них будет отличаться, это текст попапа.

Создайте в обоих мини-приложениях HTML блок с кодом:

<head> <style> .popup { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; z-index: 9999; visibility: visible; opacity: 1; transition: opacity 0.3s ease, visibility 0.3s ease; } /* Стиль содержимого попапа */ .popup-content { background-color: rgba(242, 242, 242, 1); border-radius: 14px; padding: 16px 0; text-align: center; width: 300px; /* Можно настроить ширину по желанию */ } .popup-info h2 { font-size: 17px; font-weight: bold; margin-bottom: 8px; } .popup-info p { font-size: 13px; font-weight: regular; margin-bottom: 16px; } .popup-divider { border: none; border-top: 1px solid rgba(0, 0, 0, 0.1); margin: 16px 0; } .popup-button { font-size: 17px; color: rgba(0, 122, 255, 1); text-decoration: none; display: block; cursor: pointer; font-weight: inherit; } .popup-button:hover { text-decoration: underline; } </style> </head> <body> <div id="popup" class="popup"> <div class="popup-content"> <div class="popup-info" style="padding: 0 16px;"> <h2>Успешно!</h2> <p>Теперь вы участвуете в розыгрыше. О результатах сообщим в день окончания розыгрыша.</p> </div> <hr class="popup-divider"> <a goto_web_page="miniAppId" class="popup-button">Закрыть</a> </div> </div> <script> window.onload = function() { const popup = document.getElementById('popup'); setTimeout(() => { popup.style.visibility = 'visible'; popup.style.opacity = 1; }, 0); }; </script> </body>

Замените в этом коде miniAppId на ID мини-приложения "Вступление в розыгрыш". Чтобы получить данный ID, необходимо опубликовать изменения, открыть мини-приложение "Вступление в розыгрыш" и скопировать значение после startapp= в ссылке для его открытия. Оно выглядит примерно так: c3a4efad48231cd3.

Затем измените тексты попапа в полях h2 и p в мини-приложении "Условия не выполнены" на тексты, подобные: "Условия не выполнены. Повторите попытку, выполнив условия."

Добавьте в обоих мини-приложениях блок "Подставновка" и в поле "Название Мини-приложения" введите "Вступление в розыгрыш". Это позволит сделать эффект всплывающего попапа над основным мини-приложением.

Система розыгрышей среди бустеров вашего канала или группы

5. Создадим команду "Определить победителя". Эту команду следует выполнить в момент окончания розыгрыша, так как она выберет случайного участника из таблицы и добавит его в список победителей. Команду необходимо выполнить столько раз, сколько победителей должно быть. Команду необходимо выполнять только относительно себя. Рекомендуется включить опцию "Выполнение только из клавиатуры" в дополнительных настройках.

Действия:
Добавьте действие "Изменить переменную" и введите выражение member_num = {{random_member}}
Добавьте действие "Создать строку (NocoDB)":

Выберите базу данных "Розыгрыш"
Выберите таблицу "Победители"
Введите следующие значения для столбцов:

  • user_id: {{get_random_member_id}}
  • user_name: {{get_random_member_name}}

По желанию можно добавить действие отправки команды с поздравлением с включенной опцией "Выполнить другому пользователю", в поле получателя введите {{get_random_member_id}}. Таким образом победитель получит уведомление.

Система розыгрышей среди бустеров вашего канала или группы

Всё готово 🎉

Больше уроков, кейсов и познавательных материалов:

Мой личный телеграм:

4
1
1
Начать дискуссию
\n \n\n\n\n
\n \n
Розыгрыш Telegram Premium
\n
1 мая 2025 в 15:00
\n
\n\n \n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Этот HTML-блок создаёт красивое вступление с Lottie-анимацией, градиентным фоном и частицами на заднем плане. Также в text title и text date можно указать заголовок и дату окончания розыгрыша соответственно.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n\n\n
\n
1 ПОБЕДИТЕЛЬ
\n
{{contest_decription}}
\n
\n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Этот HTML-блок будет отображать дополнительную информацию о розыгрыше. Если розыгрыш завершён в этом блоке будет отображаться список победителей. Заголовок winner-title можно изменить, а описание советую менять в формуле переменной contest_decription.

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

Добавьте фиксированную клавиатуру с двумя кнопками:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["\"Отдать голос\" – ссылка (браузер по умолчанию). Укажите ссылку на ресурс формата https://t.me/username?boost. Нажатие на эту кнопку откроет окно \"Голосов\" ресурса.","\"Участвовать\" — кнопка-условие. Введите название кнопки-условия: \"Участвовать в конкурсе\". Ниже мы разберём её настройку.
"],"type":"UL"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"44c675d4-0c30-5713-ae32-63d7cf976db1","width":2400,"height":1350,"size":191146,"type":"png","color":"32a9f5","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAACAf/xAAiEAACAQMEAgMAAAAAAAAAAAABAgMABAUGByExEiIRFGH/xAAVAQEBAAAAAAAAAAAAAAAAAAAGB//EACIRAAEDAwQDAQAAAAAAAAAAAAECAwQABREGQVGxEjFhIf/aAAwDAQACEQMRAD8AcO0EOFye3eIur/CCczwsxk+v5Bvduz8c9Uo1KtUa6vNZP4ds8Ch+lA1ItMcqQCSPZH070W8jqxY8hcxq4AWZwB+eRqyxrUVMoPwdVDJVx8X1pzue6o+2Goc/a6Dw8FtnMhDFHC4RI7l1VfdugDxRPUcKM5dHlLbSTkewOBTrTUuQi0spSsgY5PJo3X8srX1wzSMSZXJJPfJqxx0pDKABsOqjMhRLyyTue6//2Q=="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

2. Создадим кнопку-условие \"Участвовать в конкурсе\" со следующими правилами:

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

Правило 1:

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

Создайте условие проверки значения переменной.
Укажите следующее выражение: winners_list – полное совпадение – \"-none\" (кавычки писать не надо).
В \"Название кнопки\" введите \"Розыгрыш завершён\"
В действиях выберите: \"Без действия\"

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

Правило 2:

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

Создайте условие проверки строки NocoDB.
Выберите базу данных \"Розыгрыш\"
Выберите таблицу \"Участники\"
Добавьте фильтр с выражением, проверяющим соответствие поля user_id с переменной {{USER_ID_TEXT}}
В \"Название кнопки\" введите \"Вы уже участвуете\"
В действиях выберите: \"Без действия\"

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

Исключающее правило:

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

В \"Название кнопки\" введите \"Участвовать\"
В действиях добавьте \"Отправить команду или условие\" и введите условие \"Проверка голоса\". Создание и настройку этого условия мы разберём ниже.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"8a238463-65bb-50cb-8d33-6af22d0c5dc5","width":2400,"height":1350,"size":309091,"type":"png","color":"f1eef2","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAUG/8QAJRAAAQMDAwMFAAAAAAAAAAAAAQIDEQQFBgASIRMUJDFBRFFx/8QAFgEBAQEAAAAAAAAAAAAAAAAABQcG/8QAJhEAAQMCBQMFAAAAAAAAAAAAAQIDBAASERMhQVIjMdEiUWKRkv/aAAwDAQACEQMRAD8Ad1VQNUNpzRJt9K8qlceBdSygbR2zahACYAE+0afaU7nRU3H1Yb/Mis+4hgR5hsGmOw4JrV0qMX7Vnc3bgemmZo0T6aJW+8FEXn7NKtxWCgdMdvYUbXskyJNpyptN/uIQ8p3qJFU5C/HQORPPHGqqmHHz4xy06YbDmalLs2TkyhmK1x3PAVZYyfJQy2BkNzjaPlufX7oxyDFuPTT+R4pRufKsHVV25HzX/9k="}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"7db6f63f-2b73-5967-8136-f220e841d792","width":2400,"height":1350,"size":274125,"type":"png","color":"f4eff4","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAYH/8QAJhAAAQMEAAQHAAAAAAAAAAAAAQIDBgAEBREHEkHRFiYxVGGBwf/EABYBAQEBAAAAAAAAAAAAAAAAAAYHBf/EACcRAAECAwcEAwAAAAAAAAAAAAECBAADBRESFCFBkdEiUVJTExWS/9oADAMBAAIRAxEAPwBtyxq2f4jQjGXWFbtWbsXm0FKAHAlsHp+0qpxmTaS8mknpua9zBSrIkorLGVcACvk0GdiY0DwdG+kdtz87PajuImeZ3MJ8I18BsOIJckkchfmUauH87kXHWDdBpa7pZU3tsb5STsfVWCntG4pbtIQLDc0HeIxUnjlVWZqMxVov2ZnLpimTLZVoeZst6e9c71gYFr607DiEP2Dv2q/R5j//2Q=="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3. Создадим условие \"Проверка голоса\"

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

В правиле добавим проверку \"Голос для ресурсов (Boost)\"
Выберите ресурсы, которым необходимо будет дать голос
Дополнительно можно указать количество голосов на каждый ресурс или в сумме.

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

В действиях:
Добавим действие изменение переменной members_num по выражению +1

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

Добавим действие \"Создать строку (NocoDB)\"

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

Выберем базу \"Розыгрыш\"
Выберем таблицу \"Участники\"
Заполним поля следующим образом:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["user_id: {{USER_ID_TEXT}}","user_name: {{FIRST_AND_LAST_NAME}}
","number: {{members_num}}
"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Добавим действие \"Переход к мини-приложению\" и укажите мини-приложение \"Теперь в розыгрыше\". Позже мы разберём её создание.

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

Исключающее правило:
Добавим действие \"Переход к мини-приложению\" и укажите мини-приложение \"Условия не выполнены\". Ниже мы разберём её создание.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"506aafbf-d5be-5ea7-9d32-0d0c7c9ef427","width":2400,"height":1350,"size":316639,"type":"png","color":"2098e8","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAgJ/8QAJxAAAQIFAwIHAAAAAAAAAAAAAQIDAAQFBhESITEUFRYyRFFxkdH/xAAVAQEBAAAAAAAAAAAAAAAAAAAFB//EACYRAAEDAgUDBQAAAAAAAAAAAAECAwQAERMhI0FSEpHRBSIzYpL/2gAMAwEAAhEDEQA/ANAO007sF6OvyNOW9Kl5Ta25dOAOlbUNOOOfuG23HcWOnqOdt/uaDdaYwZRCBlfYcBT2pVRaQfDNM8o50+3xBqpD1z7j3NLJiMdI0x2FTjOXLcaKZcqE1+pBLi1hYE24ArLKAc777bRUm4cbEj6acrbDkalLk2SWpOorO+54CkIuy6QhIFy1XGB6xz9g5UGLc6aew8Uin1CXb5Vfo+a//9k="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

4. Создадим два мини-приложения: \"Теперь в розыгрыше\" и \"Условия не выполнены\". Технически эти мини-приложения очень похожи – единственное, что в них будет отличаться, это текст попапа.

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

Создайте в обоих мини-приложениях HTML блок с кодом:

"}},{"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 \n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Замените в этом коде miniAppId на ID мини-приложения \"Вступление в розыгрыш\". Чтобы получить данный ID, необходимо опубликовать изменения, открыть мини-приложение \"Вступление в розыгрыш\" и скопировать значение после startapp= в ссылке для его открытия. Оно выглядит примерно так: c3a4efad48231cd3.

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

Затем измените тексты попапа в полях h2 и p в мини-приложении \"Условия не выполнены\" на тексты, подобные: \"Условия не выполнены. Повторите попытку, выполнив условия.\"

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

Добавьте в обоих мини-приложениях блок \"Подставновка\" и в поле \"Название Мини-приложения\" введите \"Вступление в розыгрыш\". Это позволит сделать эффект всплывающего попапа над основным мини-приложением.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"fee8959c-eaca-5955-9629-1440cad673f4","width":2400,"height":1350,"size":215270,"type":"png","color":"33a9f4","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAYH/8QAIxAAAgEDAwQDAAAAAAAAAAAAAQIEAAMRBQYHISMxQRMiUf/EABUBAQEAAAAAAAAAAAAAAAAAAAYH/8QAIBEAAgAFBQEAAAAAAAAAAAAAAQIAAwQFIQYRIkFRMf/aAAwDAQACEQMRAD8AaPDETb+ucUpP1LIvMsghlYAnDsAPGfQpjqpJtPemkqSBx7PggRo0yp1iScygnl9APZ9gxtu7DEfL7qxLacDEQ1rlk5i04p3Br0Lj5I0PW59iz3+3akui9WbPQHFGtT0siZeGZ0BPHoeCGmlquol2VVRyBywCfTGBtcfJ+7ef2q0FG3yJASd4/9k="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

5. Создадим команду \"Определить победителя\". Эту команду следует выполнить в момент окончания розыгрыша, так как она выберет случайного участника из таблицы и добавит его в список победителей. Команду необходимо выполнить столько раз, сколько победителей должно быть. Команду необходимо выполнять только относительно себя. Рекомендуется включить опцию \"Выполнение только из клавиатуры\" в дополнительных настройках.

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

Действия:
Добавьте действие \"Изменить переменную\" и введите выражение member_num = {{random_member}}
Добавьте действие \"Создать строку (NocoDB)\":

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

Выберите базу данных \"Розыгрыш\"
Выберите таблицу \"Победители\"
Введите следующие значения для столбцов:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["user_id: {{get_random_member_id}}","user_name: {{get_random_member_name}}
"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

По желанию можно добавить действие отправки команды с поздравлением с включенной опцией \"Выполнить другому пользователю\", в поле получателя введите {{get_random_member_id}}. Таким образом победитель получит уведомление.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"d9038b71-8f88-59f7-aa57-a1a46d4d33fe","width":2400,"height":1350,"size":206232,"type":"png","color":"31a9f6","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIADgAOAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAYH/8QAIxAAAQMEAQQDAAAAAAAAAAAAAgEDBAAFBxESBhYhQVJjkf/EABYBAQEBAAAAAAAAAAAAAAAAAAcFBv/EACMRAAEDAwMFAQAAAAAAAAAAAAEAAgMGESEEBRIVIjFRYaH/2gAMAwEAAhEDEQA/AGHhkbfd8H9Q3eRAYfdZGaouk0JEPFpFTyqeqQamjfp9+igaSAeH6Ua0k6LUU3NM5oJHPNs4COHd320p9J+If6n9VNjC+XqJi27Q4l3msx3Bl8mm5BiBbbTexRdLupFR6aF++RvcwE9mbC/laamtTPHsMrGPIHfi5t4WI8z+ZftJnEekX3K//9k="}}}]}},{"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=http%3A%2F%2Ft.me%2Frdglessons&postId=1956273","title":"RDG :// Уроки","description":"⚡ Лайфхаки, уроки по PuzzleBot Бустим https://t.me/RDGlessons?boost 🤖 Заказать бота https://t.me/infoazizbot/order По вопросам @I_feel_O_O","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":"link","cover":false,"hidden":false,"anchor":"","data":{"link":{"type":"link","data":{"url":"https://api.vc.ru/v2.8/redirect?to=http%3A%2F%2Ft.me%2FI_feel_O_O&postId=1956273","title":"αzιz :// chat-bots | RDG","description":"CEO & TON / Автор @RDGlessons / Чат-боты и воронки / Обо мне t.me/InfoAzizBot/aziz / Сайт https://pxsto.re","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"}}}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":1,"reposts":0,"views":34,"hits":170,"reads":null,"online":0},"dateFavorite":0,"hitsCount":170,"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":"Система розыгрышей за голоса, создание базы данных NocoDB, оформление дизайна, настройка мини-приложения на PuzzleBot, Telegram Premium, победители.","url":"https://vc.ru/telegram/1956273-sozdanie-sistemy-rozygryshov-na-puzzlebot","author":{"id":1241553,"name":"Aziz","nickname":"azizbots","description":"Разработчик Телеграм ботов, портфолио: https://t.me/infoazizbot/aziz","uri":"/azizbots","avatar":{"type":"image","data":{"uuid":"6f0dfae0-ef60-5e8d-81ba-4a3278232c11","width":2400,"height":2400,"size":1131847,"type":"png","color":"351059","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAABAUHCP/EACUQAAEDBAECBwAAAAAAAAAAAAECAwQABQcREgYTCBQhMVFhcf/EABgBAAIDAAAAAAAAAAAAAAAAAAUHAwQG/8QAIxEAAQMDAgcAAAAAAAAAAAAAAQACAwQFERIhMUFRYXGh0f/aAAwDAQACEQMRAD8AB8MuGMVysETbWW4F6vV6gSBKuIe2mA5s9tCkg7BSCPT3P4aZlU2almbBE8OAIJA5jv4TAss0UVM+Iv09cDOQfixXc8fdLxrlLjG8cy0+4gqDZAOlEbq86ipySShL7ZTBxAl9J1habMidF33ykt5nnHUVdtwp2fvVQ2LaOVw44KMWQAW95UlfffL7hLyySs7PI/NBHSPydysu47lf/9k="}},"cover":{"cover":{"type":"image","data":{"uuid":"ca390117-828f-5bd2-acc1-406b81f2ff93","width":1800,"height":800,"size":366873,"type":"png","color":"f6c28d","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQII/8QAHhABAAEEAgMAAAAAAAAAAAAAAQIAAwQREjEiQaH/xAAYAQACAwAAAAAAAAAAAAAAAAADBwQFBv/EAB4RAAICAgIDAAAAAAAAAAAAAAABAxECBAUSMUFR/9oADAMBAAIRAxEAPwDb+ZM2yEGXyl7zUbkboZcXig+eTa5y8nt9FZPLStt0GWLovKVhdVdi6ph7qTVgo/QGrvtqp6r4Tj//2Q=="}},"cover_y":20},"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":4204936,"userId":1241553,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4204936"},{"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":581402,"userId":1241553,"count":0,"shareImage":"https://api.vc.ru/achievements/share/581402"}],"lastModificationDate":1765002742,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":"1e859157-d7e3-6c7e-a2c7-02421fa799ff","isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":true,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":"plus","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":4},{"id":22,"count":1},{"id":15,"count":1}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":[],"media":{"type":"image","data":{"uuid":"d5117063-7b89-538a-adcc-4ffad17cb053","width":1280,"height":720,"size":245306,"type":"png","color":"52adf5","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAABAUGB//EACQQAAECBQMFAQAAAAAAAAAAAAECAwAEBREhEjFBEyIjgZGS/8QAGQEAAgMBAAAAAAAAAAAAAAAABQYBAwQH/8QAKhEAAgEBBQUJAAAAAAAAAAAAAQIDAAQFEiFBBhETMbEiMlFSYZGSodH/2gAMAwEAAhEDEQA/ANfo1Ifm3pjrSDStKTYrWzcDbHcc2H3aH+fauxgKqWh8z5ZuuAVzeG5XjxPJAoAHjEfoMaLMnTgbGQmwRwKSsge+Yxz7SXnFKyRQ4lBIDcY5jfke7rzqI7JYZEDtJhJGY4Yy9OelUjTjjjD6XHFKGtw2JvnWcw3BVVwQNF6UNjYshBOrdaVF94E+Zf6MBBd1jA3CJfiPyrXnlLHtH3Nf/9k="}},"customCover":null,"robotsTag":"noindex","categories":[10],"isAnonymized":true}};