Привет всем!
Это моя первая статья, буду рад за конструктивную критику. В приниципе, любая критика приветствуется)
UPDATE.
Меня правильно поправили - спам в РФ запрещен. Но есть возможность проводить автоматизированный сбор данных. Поэтому перед использованием данного метода следует получить согласие «каждого субъекта на такие действия».
То же самое с рекламной рассылкой - стоит также получить согласие «каждого субъекта на такие действия».
Федеральный закон о персональных данных
Сначала посмотрел готовые решения. Их действительно очень много, но либо не нравилось, либо не подходило по нуждам, либо я совсем терялся в коде.
Вот решил, наконец, проверить свои навыки после курса «Python для Пентестера» и написать все сам.
Ссылка на готовый код с гитхаб в конце статьи.
У нас будет три основные части программы: коннектор клиента(как это назвать по-русски??), сбор участников чата и рассылка по пользователям.
Будем использовать библиотеку telethon. Документация по библиотеке - Telethon’s Documentation — Telethon 1.24.0 documentation
Устанавливаем библиотеку telethon
Код:
pip3 install 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:
GitHub - StripedBear/TeleSpam: Chat member parser and spammer for Telegram
Chat member parser and spammer for Telegram. Contribute to StripedBear/TeleSpam development by creating an account on GitHub.
Последнее редактирование модератором: