Фильтры

С помощью правил фильтрации можно управлять входящими сообщениями: решать, какие сообщения вы хотите видеть, а какие нет (например, содержащие рекламу).

Можно применять фильтры ко всем источникам сразу или отдельно на канал. Можно использовать и сочетать любое количество правил фильтрации.

Поддерживаемые правила: mustHave, mustNotHave, регулярные выражения, фильтрация по типу вложения, копирование фильтров и многое другое.

Обратите внимение на функцию отладки фильтров, которая потенциально может сэкономить вам много часов.

Команды

/filter - создать фильтр (на 1 источник) ИЛИ удалить фильтр (если ввести команду дважды). Сочетается с: mustHave', 'mustNotHave', 'every', тип вложения. /filterrx - фильтрация с использованием регулярных выражений (см. примеры тут) /filterall, /filterrxall - создать фильтр на все источники /filter канал-источник - увидеть все фильтры, применяемые к источнику

Как обозначить канал-источник в команде? Читайте тут!

Если у вас существует несколько перенаправлений из одного источника в разные направления, вы можете устанавливать разные настройки, фильтры и замены для разных направлений. См. подробнее здесь.

mustHave, mustNotHave

mustHave - вы будете получать сообщение только с определенным текстом
Формат: /filter ссылка_на_источник mustHave текст
Пример: /filter https://t.me/junction_bot_news mustHave торговля биткоинами
Обратите внимание, что текст фильтра применяется целиком, а не отдельными словами. В вышеприведённом примере вы будете получать только те сообщения, в которых содержится полностью фраза "торговля биткоинами", именно в таком падеже и регистре.

mustNotHave - вы не будете получать сообщения, содержащие указанный текст
Формат: /filter ссылка_на_источник mustNotHave текст
Пример: /filter https://t.me/junction_bot_news mustNotHave реклама

Комбинирование фильтров

Несколько mustHave фильтров будут скомбинированы по принципу «или-или».

Несколько mustNotHave фильтров будут скомбинированы по принципу «и то, и другое».

Внимание: фильтры нельзя сочетать в одной команде! Каждый фильтр должен создаваться отдельной командой.

Примеры:
/filter ссылка_на_источник mustHave коты
/filter ссылка_на_источник mustHave котята
Вы будете получать сообщения, в которых либо содержится слово "коты", либо "котята".

/filter ссылка_на_источник mustNotHave собаки
/filter ссылка_на_источник mustNotHave щенки
Вы не будете получать ни сообщения со словами "собаки", ни сообщения со словами "щенки".

Фильтрация по типу вложения

Также можно фильтровать мультимедийные сообщения. Для этого используйте один из следующих текстов для фильтров: <photo>, <document>, <audio>, <video>, <sticker>, <voice>, <location>, <animation>, <videonote>, <poll>.

Примеры:
/filter ссылка_на_источник mustHave <audio> - вы будете получать из канала @junction_bot_news только сообщения, содержащие аудиовложения.
/filter ссылка_на_источник mustNotHave <photo> - вы не будете получать никакие сообщения, содержащие картинки, из канала @junction_bot_news.

Регулярные выражения

Можно устанавливать сложные правила фильтрации с помощью регулярных выражений (regular expressions, regex). Для этого используйте команду /filterrx.

Вот несколько популярных примеров:
1. Не пропускать посты со словом word внутри подписи к картинке
/filterrx ссылка_на_источник mustNotHave .*word.*<photo>.*
2. Два слова - bitcoin и ethereum - в определенном порядке
/filterrx ссылка_на_источник mustNotHave .*bitcoin.*ethereum.*
3. Два слова - litecoin и ethereum - в любом порядке
/filterrx ссылка_на_источник mustNotHave .*(?=.*\blitecoin\b)(?=.*\bethereum\b).*
5. Два слова - bitcoin и ethereum - в определенном порядке, игнорировать регистр
/filterrx ссылка_на_источник mustNotHave (?i:.*BitCoin.*liTeCoin.*)
6. Любое из слов
/filterrx ссылка_на_источник mustNotHave .*bitcoin.*|.*litecoin.*|.*ethereum.*
7. Правила можно сочетать. Например, любое из перечисленных слов, регистр не важен
/filterrx ссылка_на_источник mustNotHave (?i:.*BitCoin.*|.*liTeCoin.*|.*EthereUm.*)
8. Слово на русском языке
/filterrx ссылка_на_источник mustNotHave .*([а-яА-Я]+).*
9. Любая ссылка
/filterrx ссылка_на_источник mustNotHave .*(http:\/\/|https:\/\/).*
10. Любое число
/filterrx ссылка_на_источник mustNotHave .*([0-9]+).*
11. Любой @юзернейм
/filterrx ссылка_на_источник mustNotHave .*@([a-zA-Z0-9=&_\-]+).*
12. Пропускать только картинки с подписями (без подписей не пропускать)
/filterrx ссылка_на_источник mustHave \S+<photo>\s*
13. Пропускать только картинки без подписей
/filterrx ссылка_на_источник mustHave \s*<photo>\s*

Учтите важный нюанс: при фильтрации бот может добавлять пробел и/или код медиа-контента в конце текста. Поэтому советуем всегда ставить .* в конце ваших RegEx фильтров.

Другой важный момент: RegEx для фильтров обычно имеет .* в начале и в конце, потому что вы хотите, чтобы всё сообщение подошло под выражение. Если вы хотите использовать подобное выражение для замен, то, скорее всего, вы хотите убрать эти .* (иначе замена сработает на весть текст сообщения).

Вот здесь есть удобный инструмент для тестирования регулярных выражений: https://regex101.com. Установите Flavor на “Java 8” и флаг “Single line: Dot matches the new line”. Таким образом сервис будет работать идентично механизму @junction_bot.

Помощь по регулярным выражениям

Реглярные выражения — это общирная тема. Помощь в этой области выходит за рамки возможностей администрации бота. Пожалуйста, не пишите админам в личку с просьбой составить вам правило замены или фильтр. Также, администрация бота не предоставляет соответствующую помощь в чате поддержки.

Самый простой способ заполучить интересующее вас регулярное выражение — попросить ChatGPT. Он просто эксперт!

Также можно обратиться на соответствующие форумы. Например StackOverflow, CyberForum или RuBoard.

Фильтр на все источники

Чтобы добавить фильтр на все текущие источники, используйте команду /filterall или /filterrxall (для регулярных выражений).

Учтите, что новые перенаправления всегда создаются с пустым списком фильтров. Вы можете скопировать на них фильтры с существующего источника.

Например:
/filterrxall add mustNotHave .*(http:\/\/|https:\/\/).*

Эта команда добавит на все источники фильтр, который не пропускает сообщения с ссылками. Чтобы удалить тот же самый фильтр со всех каналов, замените add на remove.

Копирование фильтров

Можно скопировать все фильтры из другого канала. Для этого используйте следующий формат команды:

/filter ссылка_куда копировать addAllFrom ссылка_на_источник

Удаление фильтров

Для удаления фильтра с одного источника просто выполните ту же самую команду ещё раз. Например, если вы добавили фильтр командой

/filter ссылка_на_источник mustHave <audio>

То удалить его можно командой

/filter ссылка_на_источник mustHave <audio>

Если фильтр добавлен командой

/filterall add mustHave <audio>

То удалить его только из одного источника можно командой

/filter ссылка_на_источник mustHave <audio>

Чтобы увидеть все фильтры, примененные к каналу, используйте команду

/filter ссылка_на_источник

Чтобы удалить все фильтры со всех каналов, используйте команду

/filterall DELETE ALL

Получение только N-ого сообщения

Можно установить частоту пересылаемых сообщений, то есть пересылать только каждое n-ое сообщение (в примере ниже — каждое второе). Для этого используйте следующий формат команды:

/filter ссылка_на_источник every 2

Фильтрация по времени

Можно установить правила пропуска сообщений в зависимости от времени их прихода:

/filtertime ссылка_на_источник mustHave временной интервал

Временной интервал задаёт:
— Период, когда сообщения должны приходить для mustHave
— Период, когда сообщения не должны приходить для mustNotHave

Временной интервал может содержать день недели, время и временную зону.

День недели. Он всегда начинается в буквы w и затем идут цифры, соответсвующие дням недели.
Например:

w135
Соответсвует 1-му, 3-му и 5-му дням недели (пн, ср, пт)

w67
Соответсвует 6-му, 7-му дням недели — выходным.

Время. Время всегда задаётся в 24-часовом формате, интервалом от — до, включительно, часы:минуты.
Например:
9:30-17:30
0:00-23:59

Временная зона. Смотрите список доступных временных зон здесь. Если временная зона не указана, то используется центральное европейское время (Амстердам/Берлин/Прага/Вена)

Примеры:

/filtertime ссылка_на_источник mustNotHave 0:00-7:00
Сообщения не будут приходить с полуночи до 7 утра по центральному европейскому времени.

/filtertime ссылка_на_источник mustHave w12345 8:00-20:00 Europe/Moscow
Сообщения будут приходить только по будним дням с 8 утра до 20 вечера по московскому времени.

Для добавления фильтра сразу на все ваши источнике используйте команду /filtertimeall. Например:
/filtertimeall add mustNotHave 0:00-7:00
Чтобы удалить:
/filtertimeall remove mustNotHave 0:00-7:00

Фильтрация по теме в группе

Чтобы установить фильтр по теме в группе используйте следующую команду:

/filtertopic ссылка_на_источник mustHave номер

Чтобы узнать номер темы в группе, возьмите ссылку на любое сообщение в теме. Номер в середине ссылки — это и есть номер темы. Например, если ссылка на сообщение https://t.me/publicchat/1723/36753, то номер темы — 1723.

Примеры:

/filtertopic ссылка_на_источник mustHave 1723
Пропускать только сообщения из темы номер 1723.

/filtertopic ссылка_на_источник mustNotHave 7231
Не пропускать сообщения из темы номер 7231.

Важно: если в ссылке указана тема 1, то в фильтре нужно ставить тему 0. То есть для ссылки https://t.me/publicchat/1/36753 команда будет /filtertopic ссылка_на_источник mustHave 0

Чтобы копировать сообщения из разных тем в источнике в разные каналы в назначении, сначала создайте нужные перенаправления из источника в назначения. Затем, для каждого конкретного перенаправления установите нужный фильтр командой /filtertopic по этой инструкции. Например, команда может выглядеть так:
/filtertopic &123456789#151617181->-1001222333444 mustHave 1723

Чтобы копировать сообщения из тем в источнике в такие же темы в назначении, вам необходимо создать эти темы вручную. Затем для каждой темы нужно создать промежуточный канал. Для каждой темы настраиваете сначала копирование в промежуточный канал с фильтром по нужной теме. Затем из промежуточного канала в назначение с нужной настройкой topic. См. пример здесь (вместо filter будет filterchannel, а вместо mybuttons будет topic).

Удаление дубликатов

Иногда одно и то же сообщение может попадать к вам несколько раз (например, если вы подписаны на два канала, которые переслали один и тот же пост). Чтобы отфильтровать одинаковые сообщения, используйте команду /setting duplicate.

/setting duplicate + одна из следующих настроек:

pass - выключено, разрешить дубликаты
Пример: /setting duplicate pass

filter -  отфильтровывать дубликаты
Пример: /setting duplicate filter

Чтобы применить эту настройку только к одному каналу, замените команду /setting на /settingchannel ссылка_на_источник (подробнее).

Фильтр дублей не учитывает кнопки. То есть два сообщения с одинаковым текстом, но разными кнопками, буду считаться одинаковыми.

Фильтр дублей помнит последние 300 сообщений в источнике. То есть, если между одинаковыми сообщениями прошло 300 других сообщений, то бот уже не будет помнить первое из них и, следовательно, не отфильтрует второе. Если в течении 24 часов нет ни одного сообщения, то память фильтра сбрасывается.

Обратите внимание, что фильтр дубликатов сравнивает исходные сообщения. Это означает, что если вы хотите избежать дублирования в канале назначения, появившиеся в результате ваших правил замены (/replace и /replacerx), вам нужно использовать несколько более сложный подход — через промежуточный канал.

Учтите, что фильтр дублей не работает с настройкой delivery forward_client.

Предположим, нам нужно перенаправить сообщения от A к B. Создайте канал C и настройте перенаправление от A (источник) в C (промежуточный). Примените все свои правила замены к каналу A. Вам не нужно устанавливать фильтр дублей на канал A.

Затем настройте перенаправление из C (промежуточный) в B (канал назначения). Установите правило фильтрации для этого перенаправления (с помощью команды /settingchannel C duplicate filter). Оно удалит все дубликаты, даже те, которые появились в результате правил замены.

Готово! Если бы вы установили фильтр дублей для первого перенаправления (с A на C), то он не сработал бы на дубли, появившиеся в результате правил замены.

Фильтрация по автору сообщения

Предположим, @source — это чат-источник. Нам нужно пересылать только сообщения от пользователя @user.
1. Создаем перенаправление командой /new
2. Включаем отображение имён авторов командой
/settingchannel @source author full
3. Настраиваем фильтр на нужное имя командой
/filter @source mustHave @user
Если вам нужно, чтобы сообщение было от определённого пользователя и при этом содержало определённый текст, то нужна немного другая команда:
/filterrx @source mustHave .*@user.*нужный текст.*

При таком подходе результирующие сообщения будут содержать имя автора сообщения. Иногда бывает необходимо, чтобы имени автора не было. Для этого понадобится чуть более сложный процесс — через промежуточный канал.

Предположим, нам нужно перенаправлять сообщения из A в B. Создаём канал С и настраиваем перенаправление с фильтрацией из А (источник) в С (промежуточный). Применяем к нему настройки из пунктов 2 и 3:
/settingchannel A author full
/filter A mustHave @user

Затем, настраиваем перенаправление из С (промежуточный) в В (назначение). На это перенаправление вешаем замену (командой /replace), которая будет удалять имена авторов.
/replace B @user&nbsp;(Имярек)

Готово! Если повесить замену на первое перенаправление (из А в С), то она не будет влиять на имя автора. Имя автора, как и название канала источника, является сервисным текстом, не заменяется командой /replace, и настравивается другими способами.

Иногда бывает нужно пропускать только анонимные сообщения (сообщения от имени группы). Тогда нужно всё равно нудно включить отображение имён авторов. С этой настройкой все сообщения, кроме анонимных, будут начинаться с <a — ссылки на автора. Так что ставьте фильтр, который будет отсеивать все такие сообщения:
/filterrx @source mustNotHave <a.*

Фильтрация пересылаемых сообщений

C помощью Junction Bot можно фильтровать сообщения Telegram, которые были пересланы (forwarded) в канал источника. Допустим, @source — это канал-источник. Чтобы скопировать только оригинальные сообщения @source, но не сообщения, пересланные на @source из других каналов, сделайте следующее:

  1. Создайте новое правило пересылки с помощью команды /new
  2. Включите копирование имен авторов командой
    /settingchannel source_channel_reference header from_only
  3. Это добавит в начало пересылаемого сообщения фрагмент текста: «from » + название канала.
    Настройте фильтр для названия канала, который вы хотите отфильтровать. Например, если пересылаемые сообщения приходят с канала с названием «Источник пересылок»
    /filter source_channel_reference mustNotHave from Источник пересылок
  4. Если вы хотите избавиться от постов, пересылаемых из любого другого канала, то вам понадобится немного другая команда:
    /filter source_channel_reference mustNotHave from

Фильтрация с помощью ИИ

Вы можете описать любые критерии фильтрации в свободной форме и позволить ИИ автоматически фильтровать ваши сообщения. Интересно, что так можно фильтровать не только по тексту сообщения как таковому, но и по его смыслу и сантименту. Например, вы можете попросить ИИ пропускать только позитивные новости ☺️

Как это настроить, смотрите здесь.

Ручная фильтрация

Если вы хотите вручную решать, пропустить пост или отфильтровать, используйте режим ревью.

Как разобраться, почему фильтры не работают как я хочу?

Если не понятно, какой из фильтров сработал, используйте настройку explain:
Меню → Настройки перенаправлений → Выбрать источник и назначение → Explain-отчёт
На каждое новое сообщение она будет присылать отчет, подробно объясняющий, какие фильтры сработали и почему.
Если вы обращаетесь в поддержку с вопросом по фильтрам, пожалуйста, присылайте explain-отчёт и полный список ваших фильтров на источнике, полученный командой
/filter ссылка_на_источник