Как временно заблокировать человека в Телеграмме

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Romuald Shmidtelson

Об авторе

Web Developer. I have expirience in FrontEnd, Backend, Devops. PHP, Python, Javascript (Vue.js, React.js)

Поделиться постом:

Вам также может понравится

Как получить первый заказ на фрилансе

Кто такой вебмастер?

Какой язык программирования выбрать в 2021?

Мои посты

Обзор онлайн конструкторов карт

Следющий пост

Npm-Check-Updates обновление ваших JS пакетов

Предыдущий пост

Последние комментарии

ArtL1n написал
04 января, в 14:27
к статье Ошибка 2503 и 2502 при установке или удалении программ на Windows Мне помог способ №4

Как Заблокировать человека в Телеграмм

Elena написал
24 сентября, в 13:05
к статье 11 онлайн сервисов SEO анализа сайта Позволю себе дополнение к статье. Для проверки позиций сайта в…

Elena написал
15 сентября, в 10:11
к статье Wow book, jquery слайдер в стиле листания книги (1.0.1) Не получается добавить ссылку .чтоб выйти из этой галлереи…

Гость написал
12 июня, в 00:41
к статье Ошибка 2503 и 2502 при установке или удалении программ на Windows Совет Дмитрия о запуске от имени Админа помог! Спасибо!

AL Tor написал
07 апреля, в 11:13
к статье Ошибка 2503 и 2502 при установке или удалении программ на Windows при установке не помог ни один способ, в итоге методом…

Источник: web7.pro

Как реализовать игнор заблокированных пользователей в группах Telegram?

image alt

UPD: благодаря помощи Tkachov эта статья всё-таки превратилась из просьбы о помощи в работающую инструкцию. В комментариях он дал работающий код для создания игнора в десктопном клиенте Телеграм. Я на всякий случай расположу объяснение в конце статьи. Далее статья продолжается в том же виде, в каком была написана.
UPD: Сделал «сайт» для распространения готового приложения sites.google.com/view/ignoram

Я хотел бы попросить помощи у сообщества, потому что все собственные возможности я полностью исчерпал.

Можно было бы задать вопрос на сервисе Q кроме того серый цвет на тёмных темах отлично читается.

В чат к разработчику, где я сидел какое-то время, регулярно приходят люди и просят сделать «настоящий игнор». Раньше он просто отказывался; в последние же полгода и вовсе забросил свой проект, потому что у него «нет времени». Что ж, это обычное дело для бесплатных открытых проектов.

Я упоминаю об этом проекте по двум причинам.

  • Во-первых, он рекламируется именно как «клиент с функцией игнора» и его советуют люди, которые читают только описание, не зная, как на самом деле там этот «игнор» реализован. Как было сказано выше, функция эта не работает.
  • Во-вторых, он является живым подтверждением того, что в клиенте Телеграма можно определить сообщение заблокированного пользователя и изменить его. То есть на самом деле игнор на стороне клиента возможен.

Лучше всего передаёт мои чувства комментарий в похожей теме на Реддите четырёхлетней давности:

If I just don’t want to read anything some user writes I should be able to do so… it’s like, one of the very basic features of every communication protocols EVER!

Еще по теме:  Обмен ключами шифрования в Телеграмме что это значит

You could do it in the 90s with emails and newsgroups!

Причём всюду, где идёт речь о причинах отсутствия игнора, повторяются одни и те же вещи:
— Вы будете видеть не все сообщения и из-за этого не будете понимать что происходит в чате.
— Вы будете дублировать сообщения.
— Нарушится функциональность системы «ответов»

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

Вот просто пример из жизни, касающийся дублирования — я сижу в нескольких телеграм-чатах и в течение дня обязательно несколько пользователей бросают в чат одну и ту же новость / смешной скриншот / свежий популярный мем. Несмотря на то, что до них это уже было. Несмотря на то, что никакого игнора не существует — они всё равно просто не читают историю чата и дублируют сообщения.

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

Так почему же на самом деле эта функция не существует?

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

Версия маркетинговая немного проще.

Когда в 1995 году Халед Мардам-Бей создал mIRC — он написал программу для людей. В смысле, для самостоятельных людей, которые знают, что они хотят, выбирают то, что считают правильным, и несут ответственность за последствия своих действий. С одной стороны это вызывало проблемы, например, со скриптовыми уязвимостями — запускаешь строку с командами и всё, ты взломан. С другой стороны — это был мессенджер, которым пользовались взрослые и ответственные люди. И они знали, как существовать в чате с игнором, где часть сообщений просто не видна.

Когда в 2013 году Паша Дуров сделал Telegram — он сделал программу «для домохозяек». Для тупого массового пользователя, которому нужен добрый опекун. Отсюда вся эта регистрация по номеру телефона, рассылка сообщений всем по телефонной книге, флажки и запреты со всех сторон. Ведь они «нажмут что-нибудь и всё исчезнет!». А потом будут писать жалобы в поддержку!

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

Тут появляется коронный аргумент, который всегда приводят в конце: «не нравится — так не пользуйся». Я не буду объяснять, что с ним не так, это этический вопрос формата «почему нельзя есть людей» — кто его задаёт, тому бессмысленно объяснять.

Еще по теме:  Можно ли в Телеграмме поставить пароль на архив

Но в случае с Телеграмом этот аргумент немножко видоизменяют: «не нравится — так сделай как тебе нравится, это же open source».

Попытка решения

Устав от многолетних поисков, я решил действительно попытаться что-то изменить самостоятельно. Мне показалось хорошей идеей сделать собственную сборку Телеграма. Не в смысле общедоступную сборку, с сайтом и размещением в магазине приложений, а просто собрать приложение для себя и самому им пользоваться.

В этом смысле меня бы не беспокоили ни возможные «тормоза» от скрытия сообщений, ни «проблема потери контекста в беседе», ни проблема «как же админить чат если не видишь части сообщений». Это всё меня не интересовало.

Мне казалось очевидным, что достаточно добавить строку вида:

if message.author.isBlocked == true then message.value= ‘The message from blocked user’

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

Но с чего начать?

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

Я пообщался с создателем этого мессенджера, и он дал мне два полезных совета.
Во-первых, он сказал, что сообщения в нативном клиенте выводятся обычным способом, а не генерируются (я, впрочем, и так это подозревал на примере Telegreat) — поэтому можно в качестве исходника использовать родной клиент.
Во-вторых, он рассказал, где искать сам вывод сообщений — в блоке history_message.

К сожалению, у него, как и у создателя Telegreat, тоже не было свободного времени, чтобы самостоятельно добавлять функцию игнора, что в свой клиент, что для меня.

Как я действовал дальше? Инструкция по сборке существует на Гитхабе, но она не отражает всех этапов работы. Я их тут опишу, на случай, если в статью придёт кто-то ещё, с программированием не особенно знакомый, но желающий сделать для себя такой же клиент с игнором:

  1. Я решил всё делать на виртуальной машине. Для этого я установил себе Oracle VM Virtual Box и скачал с официального сайта Microsoft их официальную виртуальную машину с предустановленными Windows 10 и Visual Studio 2019
  2. На втором этапе нужно расширить предустановленный Visual Studio. Как оказалось, по умолчанию в него не входит C++, поэтому нужно запустить Visual Studio Installer из главного меню. Нажать там кнопочку Modify и выбрать секцию с C++, он её докачает и установит. Ну и на всякий случай я ещё скачал и установил QT отсюда.
  3. Кроме того нужно установить Git c git-scm.com
  4. Теперь можно начать выполнять инструкцию с Гитхаба. Но будьте внимательны!
Еще по теме:  Как изменить опрос в Телеграмме

Первая остановка происходит после строки:

gyp —no-circular-check breakpad_client.gyp —format=ninja

Вторая — после четвёртой строки с конца, длинной инструкции конфигурирования QT:

configure -prefix «%LibrariesPath%Qt-5.12.5» .

Как мне подсказали знакомые, это связано с тем, что в ходе выполнения этих команд запускаются другие bat-файлы, в которых уже прописан прямой выход из процесса. В результате дальше нужно либо просто копировать и вставлять команды, либо разбить инструкцию на 3 bat файла (но в этом случае нужно не забыть, что команды следует продолжать выполнять из той же директории, в которой процесс остановился!).

Получение собственных api_id тоже описано на Гитхабе.

В конечном счёте я скомпилировал вполне рабочий exe-файл Телеграма. Всего сборка занимает около трёх часов (не считая предварительных скачиваний и установок), возможно это время зависит от мощности компьютера.

Помощь зала (и найденное решение)

И вот здесь наконец-то появляется моя просьба к хабрасообществу. Как читатели уже догадались, я не знаю, что и как менять. Мне кажется, что я нашёл место, где выводится сообщение, но я не уверен, потому что я же не знаю C++. Не говоря уж о том, что (возможно) правильно было бы что-то менять не в history_message, а где-нибудь в history_item.

«Что-то на эльфийском, не могу прочесть»

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

Я предполагаю, что сам механизм вывода у Телеграма не будет внезапно изменяться. Так что при обновлении клиента я буду просто скачивать с гитхаба обновлённый вариант и снова добавлять эту строку с блокировкой перед компиляцией.

UPD: Как я упомянул в начале статьи, в комментариях появился работающий вариант кода. Привожу его и прямо в статье.

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

В файле History_Message.cpp мы находим функцию как раз в том самом месте, что на скриншоте выше:

HistoryMessage::HistoryMessage( not_null history, const MTPDmessage setMedia(*media); >setText(< TextUtilities::Clean(qs(data.vmessage())), Api::EntitiesFromMTP(data.ventities().value_or_empty()) >);
//UserId from = data.vfrom_id().value_or_empty(); // Это почему-то перестало работать, поэтому пришлось добавить другую строку UserId from = data.vfrom_id() ? peerFromMTP(*data.vfrom_id()) : PeerId(0); PeerData* pd = from ? history->owner().user(from) : history->peer; if (pd->isUser() pd->asUser()->isBlocked()) < setText(< TextUtilities::Clean(qs(«The message from blocked user»)), Api::EntitiesFromMTP(data.ventities().value_or_empty()) >); > else < // оригинальные строки 442-448: if (const auto media = data.vmedia()) < setMedia(*media); >setText(< TextUtilities::Clean(qs(data.vmessage())), Api::EntitiesFromMTP(data.ventities().value_or_empty()) >); >

Если использовать только этот код — старые сообщения заблокированных пользователей будут видны, но новые уже нет.

Поэтому вторая часть решения, упомянутая в этом комментарии

В файл history_view_message.cpp добавляется следующий код:

PeerData* pd = item->from(); if (pd->isUser() pd->asUser()->isBlocked()) return;

UPD: в новой версии компилятор ругается на пустой return, поэтому я добавил вывод QSize(0,0) В другом случае можно наоборот убрать его.

PeerData* pd = item->from(); if (pd->isUser() pd->asUser()->isBlocked()) return QSize(0,0);

Сразу после объявления переменной item в функциях
QSize Message::performCountOptimalSize()
и
void Message::draw(
Painter https://habr.com/ru/articles/487512/» target=»_blank»]habr.com[/mask_link]

Рейтинг
( Пока оценок нет )
Загрузка ...