Гивевей-бот для розыгрышей в сообществе
Розыгрыш в Discord-сообществе — это когда полсотни человек ставят реакцию под сообщением, а потом кто-то из админов «на глаз» выбирает победителя. Проблема в том, что даже честный выбор со стороны выглядит подозрительно, если его не видно математически, а нечестный — рано или поздно всплывёт в чате с криками «схема». Разберём, как поставить гивевей на автоматику: бот сам собирает участников, сам крутит рандом и сам режет накрутку альтами, а вам остаётся только объявить условия и приз.
Содержание
Почему ручной розыгрыш в чате — плохая идея
Ручной розыгрыш обычно выглядит так: админ просит поставить emoji под постом, потом копирует список ников в блокнот, а победителя выбирает через генератор случайных чисел на сайте или банально «на глаз». Здесь минимум три дыры.
Во-первых, нет прозрачности: игроки не видят, как считались голоса, и любой каприз рандома читается как договорняк. Во-вторых, ручной сбор участников — это боль на 200+ реакций: копипаст ников из списка реакций Discord неудобен даже через API, не говоря уже про глазами. В-третьих, никто не проверяет, что за 15 однотипных аккаунтов, зарегистрированных вчера, не стоит один человек с фарм-ботом.
Автоматизация закрывает все три пункта разом: бот логирует список участников в момент завершения розыгрыша, выбирает победителя через криптографически стойкий рандом (а не Math.random() пополам с настроением), и может сразу отсеять аккаунты, которые физически не могли быть живыми игроками сообщества. О более широких принципах честных ивентов уже писали в статье про конкурсы и розыгрыши в сообществе — здесь сфокусируемся конкретно на технической части.
Выбираем инструмент: готовый бот или самопальный скрипт
Есть два рабочих пути, и оба нормальные — выбор зависит от того, сколько у вас времени и насколько кастомные правила участия нужны.
Готовый бот — быстрее в 10 раз, но условия участия ограничены тем, что заложил разработчик. Подходит, если правила простые: «поставь реакцию, будь на сервере N дней».
Свой бот на discord.js — дольше в настройке (час-два, если знаком с Node.js), зато условия любые: проверка привязанного игрового ника, роль по донату, статус в вашей RCON-панели, что угодно. Плюс код целиком у вас, не зависите от аптайма чужого сервиса.
| Вариант | Время на старт | Гибкость условий | Где хранить конфиг |
|---|---|---|---|
| Carl-bot / MEE6 (готовые) | 10-15 минут | Ограниченная (роли, время) | В самом боте |
| discord-giveaways (свой бот) | 1-3 часа | Любая, свой код на JS | JSON/SQLite на вашем сервере |
| Ручной скрипт на реакциях | 30 минут | Средняя, без UI | Отдельный процесс |
Если сообщество маленькое и розыгрыши разовые — берите готовый бот и не мучайтесь. Если розыгрыши регулярные (раз в неделю, под ивенты) и вы уже держите свой Discord-бот для модерации или статистики — как в статье про Discord-бота для модерации чата — логичнее дописать модуль гивевеев туда же, чем плодить ещё одного бота на сервере.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверНастройка гивевея на встроенном боте
Разберём на примере Carl-bot — он бесплатный в базовой версии и достаточно гибкий для 90% случаев. Логика похожая у MEE6 и у большинства ботов этого класса, отличаются только названия команд.
- Добавьте бота на сервер через официальный сайт бота с правами на отправку сообщений и управление реакциями в канале розыгрышей.
- Создайте отдельный канал
#розыгрыши, чтобы гивевеи не терялись в общем чате. - Запустите розыгрыш командой вида:
/giveaway start
duration: 24h
winners: 1
prize: Discord Nitro на месяц
- Бот опубликует эмбед с призом, временем окончания и реакцией 🎉 — участие засчитывается по клику на эту реакцию.
- Дополнительные условия участия задаются через требование роли:
/giveaway start
duration: 24h
winners: 1
prize: VIP-статус на сервере
required_role: @Участник
Роль @Участник в этом примере — это роль, которую бот статистики или модерации выдаёт автоматически после недели активности на сервере, а не сразу при входе. Это уже первый и самый простой барьер против накрутки: свежесозданный альт роль не получит физически, даже если поставит реакцию.
- По завершении бот сам выбирает победителя и публикует результат в тот же канал — никакого ручного вмешательства.
- Если победитель не откликнулся или зафейлил проверку — есть команда реролла:
/giveaway reroll
Она перевыбирает случайного участника из оставшегося пула, не трогая исходный список — это важно, чтобы не пришлось объяснять сообществу, откуда взялся «новый» список голосов.
Свой бот на discord.js и discord-giveaways
Если готовых команд не хватает — например, нужно проверить донат-статус игрока через вашу базу или привязку Steam/игрового ника — пишем модуль сами. Библиотека discord-giveaways на npm закрывает всю рутину (эмбеды, таймер, реролл), вам остаётся только описать условия и приз.
Установка на Node.js 18+:
npm init -y
npm install discord.js discord-giveaways
Базовый скелет бота:
const { Client, GatewayIntentBits } = require('discord.js');
const { GiveawaysManager } = require('discord-giveaways');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildMessageReactions,
GatewayIntentBits.MessageContent,
],
});
client.giveawaysManager = new GiveawaysManager(client, {
storage: './giveaways.json',
updateCountdownEvery: 5000,
default: {
botsCanWin: false,
embedColor: '#FF0000',
reaction: '🎉',
},
});
client.on('ready', () => console.log(`Бот запущен как ${client.user.tag}`));
client.login(process.env.DISCORD_TOKEN);
Запуск розыгрыша с кастомной проверкой участников — например, отсекаем аккаунты младше 30 дней прямо в коде:
client.giveawaysManager.start(channel, {
duration: 24 * 60 * 60 * 1000, // 24 часа в мс
winnerCount: 1,
prize: 'Игровой сервер на месяц',
hostedBy: 'Администрация',
exemptMembers: (member) => {
const accountAgeDays = (Date.now() - member.user.createdTimestamp) / 86400000;
return accountAgeDays < 30; // true = не может участвовать
},
});
Такой бот удобно держать на той же машине, что и админ-панель сервера, или на отдельном лёгком VPS — процессу под Node.js хватает 256-512 МБ памяти, ресурсоёмкость минимальная, конфликтов с игровым сервером не будет даже на одной ноде. Хранить giveaways.json в git не стоит — там id сообщений и служебные данные конкретного розыгрыша, файл живёт локально рядом с ботом.
Честный выбор победителя: как это устроено технически
Ключевой вопрос, который рано или поздно задаст сообщество: «а откуда мы знаем, что выбор реально случайный?» Ответ должен быть не «поверьте нам», а объяснимый механизм.
Библиотека discord-giveaways и большинство встроенных ботов используют генератор случайных чисел из стандартной библиотеки языка (Math.random() в Node.js) поверх собранного массива ID участников — сам массив собирается по списку реакций на момент окончания таймера, без ручного редактирования. Для розыгрышей внутри игрового сообщества этого достаточно: ставки не биржевые, задача — не дать возможность подкрутить результат руками, а не выдержать криптографический аудит.
Если хочется дополнительной прозрачности — публикуйте до розыгрыша число участников (счётчик реакций виден всем в реальном времени), а после — сид или timestamp, по которому был произведён выбор. Это не обязательный шаг, но снимает вопросы у самых недоверчивых.
Отдельно: никогда не выбирайте победителя вручную «для подстраховки», даже если бот выбрал неудобного человека (например, того, кто выиграл уже третий раз подряд). Если это реальная проблема — решайте её правилом «не участвовать 30 дней после победы» на уровне логики бота, а не разовым ручным вмешательством, которое потом невозможно объяснить.
Защита от накрутки альтами: фильтры и ручная проверка
Накрутка через мультиаккаунты — самая частая головная боль гивевеев с ценным призом (VIP-статус, донат-валюта, редкий скин). Один человек создаёт 10-20 свежих аккаунтов, заходит на сервер, ставит реакцию отовсюду — и статистически повышает шанс на выигрыш кратно. Полностью убрать это нельзя, но можно сделать невыгодным.
Работающая связка фильтров:
- Возраст аккаунта Discord. Минимум 14-30 дней с момента регистрации — самый эффективный и самый простой фильтр, отсекает 90% ботоферм с нуля.
- Время на сервере. Требуйте роль, которая выдаётся не раньше чем через неделю после входа (см. пример с Carl-bot выше) — так альт, созданный специально под розыгрыш, физически не успевает.
- Верификация уровня сервера. В настройках Discord-сервера включите Verification Level "Medium" или выше — Discord сам режет часть свежих и непривязанных к телефону аккаунтов ещё до входа.
- Привязка игрового аккаунта. Если у вас есть бот с привязкой Steam ID / никнейма к Discord-профилю через RCON или базу данных сервера — требуйте привязку для участия. Один живой игровой аккаунт физически не размножить так же легко, как Discord-профиль.
- Ручной аудит топ-подозрительных. Перед объявлением победителя (если приз ценный) можно вручную посмотреть на аватар, дату создания и активность выигравшего аккаунта — 30 секунд работы модератора против явного мультиаккаунта.
Учтите нюанс: слишком жёсткие фильтры (например, требование быть на сервере 90 дней) режут и обычных новых игроков, которых как раз хочется затянуть в комьюнити гивевеем. Баланс здесь важнее жёсткости — для большинства серверов достаточно связки «аккаунт старше 30 дней + неделя на сервере», без верификации по телефону и привязки Steam.
Структуру самих каналов под розыгрыши и объявления удобно продумать заранее — если ещё не раскладывали Discord по разделам, посмотрите статью про структуру каналов Discord-сообщества: отдельный канал под гивевеи снижает шум и упрощает модерацию условий.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Можно ли проводить гивевей без бота, просто вручную?
Технически да, но с ростом сообщества это быстро превращается в источник недоверия — ручной подсчёт реакций и рандом «на глаз» невозможно объективно доказать, даже если вы никого не обманывали.
Что делать, если победитель не отвечает на объявление?
Используйте встроенную команду реролла (/giveaway reroll в Carl-bot, аналог есть и в discord-giveaways через client.giveawaysManager.reroll()) — она выбирает нового победителя из того же пула без пересбора участников.
Стоит ли давать призом донат-валюту или лучше физические товары?
С точки зрения гивевей-механики разницы нет, вопрос в легальности и налогах — если приз имеет денежный эквивалент, стоит свериться с нюансами, разобранными в статье про донат-систему на игровом сервере.
Нужен ли отдельный сервер или VPS под бота гивевеев?
Нет, если бот один и лёгкий — Node.js-процесс с discord-giveaways спокойно живёт на той же машине, что и другие ваши боты, ресурсов уходит минимум.
Как быть, если Discord-бот встроенного типа (Carl-bot, MEE6) исчезнет или изменит условия использования?
Это риск любого стороннего сервиса — если розыгрыши для вас регулярный процесс, разумно держать резервный вариант на своём коде, который не зависит от чужого аптайма.