Приветствую. В данной "статье" решил поделиться опытом решения одного интересного кейса.
У меня есть постоянный заказчик, который заказывает удаление подписчиков с достаточно больших каналов. Речь идет о десятках и сотнях тысяч подписчиков, т.к. удалить большие каналы, на которых много подписчиков - нельзя.
Задача кажется тривиальной, и ее решение - простое. Написание небольшого скрипта на Python, который реализует юзер бота. Но тут мы сталкиваемся с ограничением телеграма.
По логике - нужно получить список userId всех участников канала и удалять их поочереди. Но телеграм устанавливает ограничение в 200 запросов, что увеличивает время на выполнение задания.
Я не мастер писать статьи и уроки, потому - сразу к решению.
А оно, как оказалось, не такое и сложное.
Что нам нужно: Получить userId по которому будут удаляться подписчики канала. Для этого мы пишем юзербота на Python с использованием telethon
Логика тут проста: нам нужно получить список первых 200 userId, записать их в файл и сохранить его в проект с telegram bot, после чего отправить ему команду /start, при которой срабатывает deleteHandler. Он, в свою очередь, не имеет ограничения на удаление подписчиков с канала.
Telegram bot (не путать с User bot) выполняет функцию удаления подписчиков с канала. Он, в свою очередь, не может получить id подписчиков, потому мы и заморачивались с user bot и сохраняли id подписчиков.
Сам код deleteHandler'a выглядит следующим образом:
Данный метод срабатывает на команду /start, которая прилетает от нашего user bot каждые 4 минуты 20 секунд (именно такое время требуется боту на удаление 200 подписчиков на моем железе), и удаляет поочередно всех пользователей, не затрагивая самого себя.
После процесса выплевывает сообщение, что все юзеры из subscribers.csv удалены.
Надеюсь данная статейка будет кому-то полезна.
Хочу заметить, что данный способ удаления не является истинной, но отлично справляется с возложенными на него задачами.
Советы и исправления касательно кода очень даже приветствуются. Интересно, как бы данный кейс решили вы.
У меня есть постоянный заказчик, который заказывает удаление подписчиков с достаточно больших каналов. Речь идет о десятках и сотнях тысяч подписчиков, т.к. удалить большие каналы, на которых много подписчиков - нельзя.
Задача кажется тривиальной, и ее решение - простое. Написание небольшого скрипта на 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);
}
После процесса выплевывает сообщение, что все юзеры из subscribers.csv удалены.
Надеюсь данная статейка будет кому-то полезна.
Хочу заметить, что данный способ удаления не является истинной, но отлично справляется с возложенными на него задачами.
Советы и исправления касательно кода очень даже приветствуются. Интересно, как бы данный кейс решили вы.