Skip to content

SHULKERPLAY/Zapretyan

Repository files navigation

Запретян <3

Readme is only available in russian

Обновления репозитория перестанут выходить вплоть до 2027 года, подробности в патче 1.3

Теперь можно пользоваться поиском блокировок интернет ресурсов в РФ из Discord с помощью нашего бота Запретян! (Оригинальная: Zapretyan#2802) Посмотрите подробности или установите бота на любой свой сервер или к себе на аккаунт из магазина приложений! Бота также можно установить на сервер напрямую

Запретян / Zapretyan

CodeFactor GitHub Release GitHub code size in bytes Discord YouTube Channel Views Website Bot Uptime (30 days)

Вывод новых блокировок ресурсов в Российской Федерации каждый день!

Запретян - это набор скриптов работающий на Debian/Ubuntu, который собирает данные о блокировках интернет ресурсов в РФ и каждый день подробно (или кратко в цифрах) сообщает о изменениях в реестре блокировок за день в Discord с помощью Discord бота!

Запретян создана для работы с Discord ботом. Существует упрощенная версия, посылающаяя сообщения через вебхуки.

Функции

  • Сбор аналитики: Дата и количество блокировок/разбанов
  • Вывод полного списка банов и разбанов из реестра блокировок в разные чаты с разными оповещениями, а также краткий вывод в цифрах с помощью собственного бота. Всё зависит от вашей конфигурации
  • Рассчитан на запуск раз в сутки с помощью systemd или Cron.

Демонстрация и скриншоты

Зависимости

  • Debian 12 или Ubuntu 22 (Может заработать и на чуть более старых)
  • wget
  • node.js >= 18.0.0
  • npm >= 9.0.0
    • Discord.js 14.25.1 (проверен) или новее
  • git

Обновление

Для обновления вручную можно перезаписать все файлы скрипта которые у вас есть. Вам придётся сохранить и вручную вставить старую конфигурацию shell/config.cfg чтобы переместить её в новую версию

Чтобы автоматически обновиться (Работает только если вы не переименовали папки shell и sender)

В терминале исполняем

wget -O- 'https://raw.githubusercontent.com/SHULKERPLAY/Zapretyan/refs/heads/main/zapretyan_update.sh' | bash

Вводим путь до папки Запретян (В которой папки shell и sender). Скрипт сам сохранит токен бота и часть старой конфигурации. После обновления проверьте файл конфигурации, для сравнения будет сохранён ваш старый файл под названием config.old

Вручную

Перемещаемся в папку запретян с помощью cd и сохраняем старую конфигурацию. Если вы давали другие названия папкам внутри, замените их в команде.

mv sender/config.json sender/config.json.old
mv shell/config.cfg shell/config.old

Качаем и распаковываем с заменой последний релиз

wget -t 5 -O Zapretyan.tar.gz 'https://github.com/SHULKERPLAY/Zapretyan/releases/latest/download/zapretyan.tar.gz' && tar -xf Zapretyan.tar.gz && rm Zapretyan.tar.gz

Возвращаем старый токен бота

rm sender/config.json && mv sender/config.json.old sender/config.json

Готово. Однако вам нужно вручную переместить всё что нужно из файла config.old в config.cfg.

Установка

Супербыстрая установка

Вам понадобится Debian 12 или Ubuntu с установленным wget. Если в ходе установки не вышло установить node (Может произойти если вы не под root и используете sudo) - Посмотрите немного ниже строку "Устанавливаем node.js (Зависимость)"

wget -O- 'https://raw.githubusercontent.com/SHULKERPLAY/Zapretyan/refs/heads/main/service_install.sh' | bash

Загрузка вручную

Скачайте архив из последнего релиза

wget -O zapretyan.tar.gz 'https://github.com/SHULKERPLAY/Zapretyan/releases/latest/download/zapretyan.tar.gz'

Или скачайте архив репозитория

wget -O zapretyan.zip 'https://github.com/SHULKERPLAY/Zapretyan/archive/refs/heads/main.zip'

Распакуйте его

tar -xf zapretyan.tar или unzip zapretyan.zip

Для полностью ручной установки читаем пункт "Или устанавливаем сервис вручную"

Для автоматической настройки системного юнита и зависимостей запустите с повышенными привилегиями service_install.sh и следуйте инструкциям

sudo ./service_install.sh

Добавляем токен своего Discord бота через которого будет идти общение с Discord. Редактируем sender/config.json в папке установки и вставляем в него свой токен

{
	"token": "L4WvKZD9fechFW825IbfA0R4iycOASe6xPDwXB9OFv715T179vMlMl2D3WjrUVBF"
}  
// Это не настоящий токен. Не пытайтесь =)

И не забудьте поменять конфигурацию в shell/config.cfg. А именно настройте опции bancid, unbancid, banipcid, unbanipcid и errorping по своему усмотрению

Или устанавливаем сервис вручную

Устанавливаем зависимости

apt update && apt install npm git wget curl unzip -y

Устанавливаем node.js (Зависимость)

Ставим fnm

curl -fsSL https://fnm.vercel.app/install | bash

Обновляем переменные оболочки (или перезаходим в SSH сессию) source ~/.bashrc (или папка вашего пользователя вместо ~)

После этого для установки node 25.x.x вводим

fnm install 25

Создаём директорию в которой будет работать запретян. И ложим туда папки shell и sender
Например

mkdir /root/zapretyan
mv sender /root/zapretyan/sender 
mv shell /root/zapretyan/shell 

Далее редактируем конфигурацию. Она лежит в shell/config.cfg

nano /root/zapretyan/shell/config.cfg

В переменную shdir пишем полный путь до папки shell

shdir=/root/zapretyan/shell 

В переменную jsdir пишем полный путь до папки sender

jsdir=/root/zapretyan/sender  

Далее вписываем ID нужных каналов и сохраняем файл. Подробная инструкция по конфигу есть ниже.

Добавляем токен своего Discord бота через которого будет идти общение с Discord. Редактируем sender/config.json и вставляем в него свой токен

{
	"token": "L4WvKZD9fechFW825IbfA0R4iycOASe6xPDwXB9OFv715T179vMlMl2D3WjrUVBF"
}  
// Это не настоящий токен. Не пытайтесь =)

Устанавливаем модуль Discord.js, совместимый со скриптом

В папке sender есть файл с зависимостями

Заходим в папку sender cd sender

Если есть файл package.json npm i

Если нет, то: npm i discord.js

И можно переходить далее

Репозиторий работал в связке с Discord.js 14.16.3 или 14.25.1

Не забудьте поменять конфигурацию в shell/config.cfg. А именно настройте опции bancid, unbancid, banipcid, unbanipcid и errorping по своему усмотрению

Теперь делаем так, чтобы наш бот включался каждый день. Главный исполнительный скрипт - shell/discordrkn.sh, который нужно исполнять автоматически каждый день.

  • Это можно сделать с помощью Cron (С чем я вам определённо не помогу и вам нужно будет искать гайды по крону в интернете...)

  • Или с помощью системного таймера. Рассмотрим этот вариант

Создаём системную службу

touch /etc/systemd/system/zapretyan.service  
nano /etc/systemd/system/zapretyan.service  

И записываем в неё строки ниже:

[Unit]
Description=Zapretyan - Russia internet bans notifier

[Service]
ExecStart=/bin/bash /root/zapretyan/shell/discordrkn.sh

Где вместо /root/zapretyan/shell/discordrkn.sh вы должны вписать путь к вашему расположению скрипта

Нам не нужно устанавливать это как службу, поэтому просто сохраняем файл.

Создаём системный таймер. Именно он будет запускаться с системой и триггерить каждый день сервис написанный нами выше

touch /etc/systemd/system/zapretyan.timer  
nano /etc/systemd/system/zapretyan.timer  

И вписываем эти строки

[Unit]
Description=Trigger for Zapretyan - Russia internet bans notifier

[Timer]
Persistent=true
OnCalendar=Mon..Sun *-*-* 08:00:00

[Install]
WantedBy=timers.target

Где время меняем на собственное или оставляем это. По стандарту наша служба запускается раз в день в 08:00:00

Устанавливаем таймер

systemctl enable zapretyan.timer  
systemctl start zapretyan.timer  

Поздравляем! У вас есть рабочая служба

Остановить её можно с помощью systemctl disable zapretyan.timer
Если вы захотите редактировать время в которое запускается скрипт, поменяйте значение в таймере и напишите:

systemctl daemon-reload  

Аналогичным способом можно создавать и другие системные сервисы, просто меняя имя службы и путь к скрипту

Дополнительные функции

В файлах sender вложены дополнительные функции

  • online.js - поддерживает состояние бота всегда в сети с нужным статусом, который вы сами можете настроить в файле.

    Запускается c помощью exec.sh online

  • sendprivate.js - Отсылает ЛИЧНЫЕ сообщения (Не на сервера). Для использования в файл sender/var/cid пишется ID пользователя, а в sender/sendprivate.txt наполнение сообщения

    Запускается из exec.sh sendprivate

  • send.js - Стандартная функция отправки сообщений ботом. В файл sender/var/cid пишется ID канала в который отправляется сообщение, а в sender/send.txt наполнение сообщения

    Самостоятельно можно запустить из exec.sh send

  • sendembed.js - Вторая стандартная функция отправки сообщений ботом. В файл sender/var/cid пишется ID канала в который отправляется сообщение, в файл sender/var/name пишется наименование поля встроенного сообщения, а в sender/send.txt наполнение embed сообщения

    Самостоятельно можно запустить из exec.sh sendembed

  • multiembed.js - Новая функция для быстрой отправки встроенных сообщений-списков пачкой, не повторяя логин бота каждый раз когда нужно отослать одно сообщение. В файл sender/var/cid пишется ID канала в который отправляется сообщение, в файл sender/var/name пишется наименование поля встроенного сообщения, а в директорию sender/send перемещаются файлы, каждый из которых содержит отдельное сообщение. Скрипт создаёт один логин и заканчивается только когда отправит каждое сообщение из директории по заданым параметрам.

    Самостоятельно можно запустить из exec.sh multiembed, но не рекомендуется.

  • index.js, botstats.js - Код ядра Запретян на котором работает наш Discord бот/Приложение, он публичный и установлен на нашем сервером Discord. Корректно работает только с sources=antifilter, istotal=true!

Конфигурация

Описание shell/config.cfg

shdir=/example/shell - Путь к папке shell этого скрипта. Скрипт исполняет все команды по распаковке и сравнению с полными путями. При автоматической установки эта строчка перезаписывается значением в конце файла

jsdir=/example/sender - Путь к папке sender этого скрипта. Скрипт исполняет все команды по отправке сообщений через node при помощи полных путей. При автоматической установки эта строчка перезаписывается значением в конце файла

bancid=("000000000000000000")
unbancid=("00000000000000000")
banipcid=("00000000000000000")
unbanipcid=("00000000000000000")
totalcid=("00000000000000000")

bancid - id чатов Discord в которые будут выводиться все новые блокировки с прошлого сравнения

unbancid - id чатов Discord в которые будут выводиться все снятые блокировки с прошлого сравнения

banipcid - id чатов Discord в которые будут выводиться случайные новые ip адреса, заблокированные с прошлого сравнения

unbanipcid - id чатов Discord в которые будут выводиться случайные ip адреса, разблокированные с прошлого сравнения

totalcid - id чатов Discord в которые будет выводиться сообщение со статистикой сколько доменов и ip адресов было заблокировано/разблокировано всего/сегодня.

Для рассылки в несколько чатов на одном или нескольких серверах, бот должен присутствовать на серверах и иметь доступ к чатом. Файл конфигурации будет выглядеть так:

bancid=("000000000000000000" "111111111111111111")
unbancid=("00000000000000000" "111111111111111111")
banipcid=("00000000000000000" "111111111111111111")
unbanipcid=("00000000000000000" "111111111111111111")
totalcid=("00000000000000000" "111111111111111111")

При этом вы можете указать таким образом несколько чатов, и их количество может быть разное для каждой категории

bancid=("00000" "11111" "22222" "33333")
unbancid=("00000" "11111" "22222")
banipcid=("00000" "11111")
unbanipcid=("00000")
totalcid=("00000" "11111" "22222" "44444")

Само собой все числа в кавычках это ID чатов на серверах. В них будет дублироваться весь сгенерированный вывод по очереди, поэтому в зависимости от количества блокировок и чатов, вывод во все чаты будет длиться дольше.

isban=true
isunban=true
isbanip=true
isunbanip=true
istotal=true

isban - отключает любые отправки в чат bancid

isunban - отключает любые отправки в чат unbancid

isbanip - отключает любые отправки в чат banipcid

isunbanip - отключает любые отправки в чат unbanipcid

istotal - отключает любые отправки в чат totalcid

errorsend=true - Переключатель вывода сервисных сообщений, например, когда с прошлого дня не произошло никаких изменений

📙 В сегодняшнем списке нет новых заблокированых ресурсов! $errorping

banclr - Устанавливает цвет полосы встроенного сообщения для чата bancid

unbanclr - Устанавливает цвет полосы встроенного сообщения для чата unbancid

unbanipclr - Устанавливает цвет полосы встроенного сообщения для чата banipcid

unbanipclr - Устанавливает цвет полосы встроенного сообщения для чата unbanipcid

totalclr - Устанавливает цвет полосы встроенного сообщения для чата totalcid

Указывается в форме banclr=ff5e5e - это 6 символов HEX значения нужного цвета.

Так если мы хотим поставить чистый красный #ff0000 значение будет banclr=ff0000

analytics=true - Переключатель сбора аналитики. Она НЕ выгружается в сеть, собирает в таблицу данные: Дата, кол-во блокировок, кол-во разбанов, всего заблокировано. Сохраняется в shell/analytics.csv

sources=antifilter - Возможные значения: antifilter, github При antifilter значения берутся с сервиса antifilter.download и сравниваются чистые текстовые данные. Не требует ничего и менять его стоит только если он перестал работать.

При github применяется старая система сравнения. Данные берутся из Nidelon/ru-block-v2ray-rules. Надежда была на то, что если antifilter прекратит свою работу, а я не смогу поддерживать этот репозиторий, то с малой долей вероятности этот репозиторий перейдёт на экспорт данных из другого места и скрипт сможет работать без переработки. Это устаревший метод, но я решил его оставить. Во избежании ошибок, при переключении на github удалите в папке shell файлы newip.txt и oldip.txt Для его использования используется скомпилированный бинарный файл распаковщика dat файлов urlesistiana/v2dat. Поэтому для того чтобы использовать метод github вам нужен файл v2dat в папке shell.

cd shell
wget -t 5 -O v2dat 'https://github.com/SHULKERPLAY/Zapretyan/raw/refs/heads/main/bin/v2dat'

errorping='<@&000000000000000>' - Содержит пинг участника или роли при выводе сервисных сообщений. Оставьте errorping=' ' чтобы отключить упоминания. У Discord пинги имеют форму:

Для пользователей - <@idПользователя>

Для ролей - <@&idРоли>

Также вы можете оставить несколько пингов в это значение errorping='<@459657842895486977> <@&683823927851614242>'

📙 В сегодняшнем списке нет новых заблокированых ресурсов! @Шалкер~<3 @Разработчик

qdate=$(date +%d/%m/%y) - Системная команда Linux собирающая дату в форме 08/08/25 Отображается в шапке первого встроенного сообщения со списком. Не вижу сценариев в которых это нужно было бы менять.

В СПИСОК ОГРАНИЧЕННЫХ РЕСУРСОВ СЕГОДНЯ ПОПАЛИ: 08/08/25

csvdate=$(date +%d.%m.%Y) - Системная команда Linux собирающая дату в форме 28.06.2025 Выводится в первом столбце таблицы shell/analytics.csv. Не вижу сценариев в которых это нужно было бы менять.

date;banned;unbanned;total
21.05.2025 ; 1667 ; 118 ; 831954
22.05.2025 ; 1772 ; 95 ; 833631
23.05.2025 ; 1573 ; 47 ; 835157

botmode=false - Если true: Принудительно устанавливает sources=antifilter, а также каждый день собирает общий комьюнити-лист блокировок в файле community.txt. Комьюнити-лист это комбинация списков от сообщества Antifilter и 1andrevich/Re-filter-lists. Используется только для поиска доменов через нашего бота. Также включает экспорт данных totalcid в json sender/var/stats

Пример упрощённой конфигурации

Так, если, например, вы не хотите подробный список, а хотите одно сообщение со статистикой, ваши настройки будут выглядеть так:

isban=false
isunban=false
isbanip=false
isunbanip=false
istotal=true

bancid=("000000000000000000")
unbancid=("00000000000000000")
banipcid=("00000000000000000")
unbanipcid=("00000000000000000")
totalcid=("1322571237284778066")

istotal=true

Известные недочёты

  • Скрипт не рассчитан на мультисерверную конфигурацию, не уверен что стану менять это в будущем. Поэтому чтобы отсылать одно содержание в несколько чатов сразу, придётся завести дополнительную службу

🎉 С версии 1.3 произойдёт смена конфигурации которая позволит рассылать сообщения в несколько чатов на любом сервере на котором состоит Запретян!

  • Скрипт не будет отправлять сообщения в Discord на территории РФ. Тут тоже ничего не сделать, РКН блокирует запросы к API Discord, вы просто будете ловить тайм-аут. Поэтому машина должна быть вне РФ

  • Заблокированные IP адреса выводятся случайным списком, который подстраивается под максимальный размер сообщения, одним сообщением каждый день, и не собираются в аналитике. Проблема в том, что каждый день происходят огромные ротации бан/разбан для адресов, и выводить каждый день огромную кучу сообщений которые технически не дают нам никакой полезной информации будет нелогично. Для своего интереса полный список заблокированных IP адресов вы можете посмотреть в shell/banip.txt

Настройка постоянного онлайна бота

Если вы хотите чтобы ваш бот поддерживал постоянный статус пока ваш сервер работает.

Создаём системную службу

touch /etc/systemd/system/zapretyanbot.service  
nano /etc/systemd/system/zapretyanbot.service  

И записываем в неё строки ниже:

[Unit]
Description=Discord bot status daemon
After=network-online.target
StartLimitIntervalSec=1000
StartLimitBurst=10

[Service]
KillSignal=SIGINT
Restart=on-failure
RestartSec=60s
ExecStart=/bin/bash /root/zapretyan/sender/exec.sh online

[Install]
WantedBy=multi-user.target

Где вместо /root/zapretyan/sender/exec.sh вы должны вписать путь к вашему расположению скрипта. Если бот крашнется по какой-то причине, то перезапустится через 60 секунд автоматически (Для версии не ниже 1.4.1). Если бот крашнется StartLimitBurst раз за StartLimitIntervalSec секунд, то попытки перезапустить скрипт прекратятся. Ждёт запуска сети network-online.target

Устанавливаем службу

systemctl enable zapretyanbot.service  
systemctl start zapretyanbot.service

Поздравляю! С запуском службы и системы бот будет получать настроенный вами статус!

Чтобы перезапустить службу (Например если бот упал в оффлайн)

systemctl restart zapretyanbot.service

Чтобы полностью отключить этот юнит

systemctl disable zapretyanbot.service

Настроить сам вывод статуса можно только отредактировав sender/online.js Меняются параметры под client.user.setPresence({

Активность меняется в строчке

activities: [{ name: `обходе блокировок`, type: ActivityType.Competing }],

Тут вы сможете найти возможные значения

Статусы меняются в следующей строке status: 'online',

О статусах в DiscordJS

Прочее

Буду рад любой поддержке, связаться со мной можно на нашем сервере Discord

About

Набор скриптов для Linux, автоматически отправляющий информацию о блокировках Роскомнадзора в Discord

Topics

Resources

License

Stars

Watchers

Forks

Contributors