Статья Удаление подписчиков из "больших" каналов телеграм

Se1dhe

The Last Sith
Участник
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Сообщения
155
Розыгрыши
0
Решения
1
Репутация
66
Реакции
71
Баллы
1 608
Приветствую. В данной "статье" решил поделиться опытом решения одного интересного кейса.
У меня есть постоянный заказчик, который заказывает удаление подписчиков с достаточно больших каналов. Речь идет о десятках и сотнях тысяч подписчиков, т.к. удалить большие каналы, на которых много подписчиков - нельзя.

Задача кажется тривиальной, и ее решение - простое. Написание небольшого скрипта на Python, который реализует юзер бота. Но тут мы сталкиваемся с ограничением телеграма.
По логике - нужно получить список userId всех участников канала и удалять их поочереди. Но телеграм устанавливает ограничение в 200 запросов, что увеличивает время на выполнение задания.
Я не мастер писать статьи и уроки, потому - сразу к решению.
А оно, как оказалось, не такое и сложное.
Что нам нужно: Получить userId по которому будут удаляться подписчики канала. Для этого мы пишем юзербота на Python с использованием telethon

Python:
import asyncio
import csv
from telethon import TelegramClient

# Ваши учетные данные API, полученные при регистрации приложения
api_id =
api_hash = ''
session_name = ''

# Подключение к Telegram API
client = TelegramClient(session_name, api_id, api_hash)

# Ссылка на канал, из которого необходимо получить список пользователей
channel_link = ''

# Путь к файлу, в который будет сохранен список пользователей
csv_file_path = 'D:\projects\delete_bot\config\subscribers.csv'

# ID контакта, которому будет отправляться сообщение
contact_id =

# Функция для получения списка пользователей в канале и сохранения его в CSV-файл
async def save_subscribers():
    async with client:
        # Получение объекта канала по ссылке
        channel = await client.get_entity(channel_link)
        # Получение списка пользователей в канале
        users = await client.get_participants(channel)
        # Запись списка пользователей в CSV-файл
        with open(csv_file_path, 'w', newline='') as csvfile:
            fieldnames = ['id']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            for user in users:
                if user.id != 5951537041: # проверка на ID
                    writer.writerow({
                        'id': user.id
                    })
        # Отправка сообщения контакту с ID contact_id
        await client.send_message(contact_id, '/start')

async def update_subscribers_loop():
    while True:
        await save_subscribers()
        # Задержка выполнения на 4 минуты и 20 секунд
        await asyncio.sleep(260)

# Запуск скрипта
if __name__ == '__main__':
    # Запуск бесконечного цикла
    client.loop.run_until_complete(update_subscribers_loop())

Логика тут проста: нам нужно получить список первых 200 userId, записать их в файл и сохранить его в проект с telegram bot, после чего отправить ему команду /start, при которой срабатывает deleteHandler. Он, в свою очередь, не имеет ограничения на удаление подписчиков с канала.

Telegram bot (не путать с User bot) выполняет функцию удаления подписчиков с канала. Он, в свою очередь, не может получить id подписчиков, потому мы и заморачивались с user bot и сохраняли id подписчиков.


Сам код deleteHandler'a выглядит следующим образом:

Java:
 @Override
    public void onCommandMessage(AbstractTelegramBot bot, Update update, Message message, List<String> list) throws TelegramApiException {
        List<String[]> data = readCSV("config/subscribers.csv", ",");
        for (String[] record : data) {
            UnbanChatMember kickChatMember = new UnbanChatMember();
            try {
                String userIdString = Arrays.toString(record).replaceAll("]", "").replaceAll("\\[", "");
                if (!userIdString.equalsIgnoreCase("id") && !userIdString.equals("5951537041")) {
                    Long userId = Long.valueOf(userIdString);
                    kickChatMember.setChatId("-1001198037047");
                    kickChatMember.setUserId(userId);
                    bot.execute(kickChatMember);
                    System.out.println("User with ID " + userId + " has been kicked from the channel.");
                }
            } catch (NumberFormatException e) {
                System.out.println("Invalid user ID: " + Arrays.toString(record));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        BotUtil.sendMessage(bot, message, "Все удалено", false, false, null);
    }
Данный метод срабатывает на команду /start, которая прилетает от нашего user bot каждые 4 минуты 20 секунд (именно такое время требуется боту на удаление 200 подписчиков на моем железе), и удаляет поочередно всех пользователей, не затрагивая самого себя.

После процесса выплевывает сообщение, что все юзеры из subscribers.csv удалены.

Надеюсь данная статейка будет кому-то полезна.

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

Сори за нубский вопрос, но гугл ничего разумного не ответил на него. Зачем удалять подписчиков с больших каналов? все же наоборот, стараются их набрать
 
Сори за нубский вопрос, но гугл ничего разумного не ответил на него. Зачем удалять подписчиков с больших каналов? все же наоборот, стараются их набрать
Потому что бывает такое, что напишешь не то, и тебя заставляют удалить не только пост, а и сам канал) и никого не ебет, что это невозможно)
 
  • Мне нравится
Реакции: BladeRunner

    BladeRunner

    Баллов: 1
    какой странный нынче мир ))
Назад
Сверху Снизу