Стоит сразу обозначить, что речь в статье пойдет именно о сборе участников чата и рассылке им сообщений — то есть о работе с пользователями, а не с контентом переписки. Если ваша задача — выгрузить историю сообщений из канала или чата (например, для анализа активности, мониторинга упоминаний или сбора статистики), то это отдельная задача, которая решается через метод get_messages того же клиента Telethon, и в рамках данного материала она не рассматривается. Здесь же фокус именно на построении связки «подключение к аккаунту — парсинг юзернеймов — автоматическая отправка сообщений».
Привет всем!
Это моя первая статья, буду рад за конструктивную критику. В приниципе, любая критика приветствуется)
UPDATE.
Меня правильно поправили - спам в РФ
запрещен. Но есть возможность проводить автоматизированный сбор данных. Поэтому перед использованием данного метода следует получить согласие «каждого субъекта на такие действия».
То же самое с рекламной рассылкой - стоит также получить согласие «каждого субъекта на такие действия».
Федеральный закон о персональных данных
Обычно в этом месте все пишут предысторию, но у меня она достаточно заурядная: недавно возникла необходимость сделать рассылку по телеграм(никакой чёрнухи :Р).
Сначала посмотрел готовые решения. Их действительно очень много, но либо не нравилось, либо не подходило по нуждам, либо я совсем терялся в коде.
Вот решил, наконец, проверить свои навыки после курса «
Python для Пентестера» и написать все сам.
Ссылка на готовый код с гитхаб в конце статьи.
У нас будет три основные части программы: коннектор клиента(
как это назвать по-русски??), сбор участников чата и рассылка по пользователям.
Будем использовать библиотеку telethon. Документация по библиотеке -
Telethon’s Documentation — Telethon 1.24.0 documentation
Устанавливаем библиотеку telethon
Импортируем необходимые модули:
Python:
import time
import random
from telethon.sync import TelegramClient
from telethon.errors.rpcerrorlist import PeerFloodError, SessionPasswordNeededError
Далее необходимо получить App api_id и App api_hash. Для это заходим на my.telegram.org в раздел
API development tools.
Создаем app, копируем необходимое и создаем переменные:
Код:
phone = 'строка'
api_id = число
api_hash = 'строка'
С помощью следующих двух строчек мы подключаемся к Телеграм
Python:
client = TelegramClient(phone, api_id, api_hash)
client.connect()
Но при первом подключении надо будет ввести одноразовый код, а если включена двухфакторная авторизация, то и дополнительный пароль.
Поэтому пишем такую конструцию, которая учитывает эти вопросы.
Python:
if not сlient.is_user_authorized():
#запрашиваем однаразовый код
client.send_code_request(phone)
try:
client.sign_in(phone, input('Enter verification code: '))
#дополнительный пароль двухфакторной авторизации если необходимо
except SessionPasswordNeededError:
client.sign_in(password=input("Enter password: "))
В текущей директории создается файл *.session. Был момент, когда я долго разбирался как работает подключение и коннектился огромное количество раз, и Телеграм забанил меня на несколько суток. Если такое случится, нужно удалить это файл сессии и приконнектиться заново.
Получаем список чатов:
Python:
chats = [dialog for dialog in client.get_dialogs() if dialog.is_group and dialog.is_channel]
print('From which chat you want to parse members:')
#выводим список чатов для выбора
[print(str(chats.index(i) + 1) + ' - ' + i.title) for i in chats]
.get_dialogs – получить все диалоги
.is_group - проверка является ли диалог групповым чатом/megagroup-чатом
.is_channel – то же самое для каналов.
То есть вместе два этих условия дают спарсить групповые чаты от каналов(пабликов). Отдельно .is_channel можно спарсить участников канала, только если имеются админские права.
Дальше берем в переменную выбор пользователя.
Python:
your_choice = input(‘Your choice is: ‘)
Собираем пользователей если у них имеется юзернейм
!Можно спарсить только тех, у кого юзернейм не закрыт!
Python:
users = [user.username for user in self.client.get_participants(your_choice ) if user.username]
Можно также спарсить такие параметры как:
id,
bot(False or True),
scam(False or True),
fake(False or True),
access_hash,
first_name,
last_name,
phone, и
status(когда в последний раз был онлайн)
Далее можно добавить опцию выбора: сохранить или спамить по списку. А можно и не добавлять. Взрослые люди все-таки, сами можете выбрать есть мороженное на завтрак или в обед.
Итак, спам.
Python:
delay = random.randint(15, 40)
- время задержки между собщениями. Лимиты часто меняются и стоит гуглить, чтобы не словить бан.
Лимиты в телеграме на данный момент:
- Оптимальная пауза при рассылке от 10 сек.
- На рассылку без ссылки - 40 сообщений.
- На рассылку со ссылкой - 10 сообщений.
Варианты сообщения можно положить в список message. И мы будем выбирать рандомное сообщение для каждого юзера.
Python:
message = ['Hello!', 'Ola!', 'Ni Hao!']
#сделаю рассылку на первые 40 юзеров из списка
for user in users[:39]:
print("Sending Message to: ", user)
try:
#отправляем сообщение
client.send_message(user, random.choice(message))
#Возможно словить Flood Error, поэтому лучше сразу прекратить спам и разорвать связь
except PeerFloodError:
print("[!] Got Flood Error from telegram. \n[!] Try later.")
self.client.disconnect()
break
except Exception as e:
print("[!] Error:", e, "\n Trying to continue...")
continue
else:
if user != users[:39]:
print(f"Waiting {delay} seconds")
time.sleep(delay)
print('\nEnd of the program')
Вот и все!
В программу можно добавить красивую заставку, менюшку, colorama, а также обработчики исключений и больше выбора(сохранить, не сохранить, продолжить, сменить аккаунт и тд).
Это уже по Вашему усмотрению.
Ссылка на GitHub:
Chat member parser and spammer for Telegram. Contribute to StripedBear/TeleSpam development by creating an account on GitHub.
github.com
Комментарии
27