Статья Автоматизированный сбор данных в чатах и рассылка для Telegram на Python

Plane-Network-Application-Social-Internet-Telegram-5952446.jpg


Привет всем!
Это моя первая статья, буду рад за конструктивную критику. В приниципе, любая критика приветствуется)​

UPDATE.
Меня правильно поправили - спам в РФ запрещен. Но есть возможность проводить автоматизированный сбор данных. Поэтому перед использованием данного метода следует получить согласие «каждого субъекта на такие действия».
То же самое с рекламной рассылкой - стоит также получить согласие «каждого субъекта на такие действия».


Обычно в этом месте все пишут предысторию, но у меня она достаточно заурядная: недавно возникла необходимость сделать рассылку по телеграм(никакой чёрнухи :Р).
Сначала посмотрел готовые решения. Их действительно очень много, но либо не нравилось, либо не подходило по нуждам, либо я совсем терялся в коде.
Вот решил, наконец, проверить свои навыки после курса «Python для Пентестера» и написать все сам.

Ссылка на готовый код с гитхаб в конце статьи.
У нас будет три основные части программы: коннектор клиента(как это назвать по-русски??), сбор участников чата и рассылка по пользователям.

Будем использовать библиотеку telethon. Документация по библиотеке -

Устанавливаем библиотеку 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 в раздел .

2022-04-29_17-10.png


Создаем 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, а также обработчики исключений и больше выбора(сохранить, не сохранить, продолжить, сменить аккаунт и тд).
Это уже по Вашему усмотрению.
PJHoqNgRTyBbULPlDHpbw_thumb_462.jpg

Ссылка на GitHub:
 
Последнее редактирование модератором:
как поймать ответы пользователей после рассылки ?
При отправке 30-40 сообщений в день с аккаунта его рано или поздно блокируют. Если получателя сообщения попросить прореагировать как-то "Если интересно, отправь +" или еще что-либо, как это ответы собрать ? Цель не сам ответ, а id пользователя записать в какую-то базу данных.

Если с 5 аккаунтов запустить, то будет 5 баз с ответами. Может, как-то можно ответы в 1 базу собрать автоматом? как ?
 
как поймать ответы пользователей после рассылки ?
При отправке 30-40 сообщений в день с аккаунта его рано или поздно блокируют. Если получателя сообщения попросить прореагировать как-то "Если интересно, отправь +" или еще что-либо, как это ответы собрать ? Цель не сам ответ, а id пользователя записать в какую-то базу данных.

Если с 5 аккаунтов запустить, то будет 5 баз с ответами. Может, как-то можно ответы в 1 базу собрать автоматом? как ?
Столько вопросов)

Подключите бд, самое простое mysql
И записывайте в неё асинхронно, при получении ответа

Получать сообщение, если не ошибаюсь, можно так:
@client.on(events.NewMessage(incoming=True)
async def handler(event):
# some action after reciving a message

В оф.документации все есть.
Сообщение состоит из ID отправителя, самого сообщения и ещё всякой информации.
 
Последнее редактирование:
День добрый
Спасибо за статью
Такой вопрос, вы используете прокси?
Потому я почему то ловлю сразу блок аккаунта при подключении сессии либо спам блок.
Аккаунты не новореги
 
День добрый
Спасибо за статью
Такой вопрос, вы используете прокси?
Потому я почему то ловлю сразу блок аккаунта при подключении сессии либо спам блок.
Аккаунты не новореги
Я не использовал прокси, но должно работать так:

from telethon import TelegramClient
import socks
client = TelegramClient('session_id', api_id='12123123', api_hash='0123456789abcdef0123456789abcdef', proxy=(socks.SOCKS5, 'ip-proxy', port-proxy, 'логин', 'пароль'))
 
Я не использовал прокси, но должно работать так:

from telethon import TelegramClient
import socks
client = TelegramClient('session_id', api_id='12123123', api_hash='0123456789abcdef0123456789abcdef', proxy=(socks.SOCKS5, 'ip-proxy', port-proxy, 'логин', 'пароль'))
Нужно ли создавать приложение в для каждого акка Телеги с которым я хочу взаимодействовать?

Нужно ли создавать приложение в для каждого акка Телеги с которым я хочу взаимодействовать?
При попытке залогиниться в новый акк и отправить кому-то сообщение, пишет Too many requests (caused by SendMessageRequest) и кидает блок на отправку (без даты окончания)
 
Посмотреть вложение 59293

Привет всем!
Это моя первая статья, буду рад за конструктивную критику. В приниципе, любая критика приветствуется)​

UPDATE.
Меня правильно поправили - спам в РФ запрещен. Но есть возможность проводить автоматизированный сбор данных. Поэтому перед использованием данного метода следует получить согласие «каждого субъекта на такие действия».
То же самое с рекламной рассылкой - стоит также получить согласие «каждого субъекта на такие действия».


Обычно в этом месте все пишут предысторию, но у меня она достаточно заурядная: недавно возникла необходимость сделать рассылку по телеграм(никакой чёрнухи :Р).
Сначала посмотрел готовые решения. Их действительно очень много, но либо не нравилось, либо не подходило по нуждам, либо я совсем терялся в коде.
Вот решил, наконец, проверить свои навыки после курса «Python для Пентестера» и написать все сам.

Ссылка на готовый код с гитхаб в конце статьи.
У нас будет три основные части программы: коннектор клиента(как это назвать по-русски??), сбор участников чата и рассылка по пользователям.

Будем использовать библиотеку telethon. Документация по библиотеке -

Устанавливаем библиотеку 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 в раздел .

Посмотреть вложение 59182

Создаем 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:
привет бот очень не плох но такой вопрос куда сохраняются данные собранные о пользователи
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!