• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

Ascor

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

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

StripedBear

Green Team
24.07.2021
33
23
BIT
10
как поймать ответы пользователей после рассылки ?
При отправке 30-40 сообщений в день с аккаунта его рано или поздно блокируют. Если получателя сообщения попросить прореагировать как-то "Если интересно, отправь +" или еще что-либо, как это ответы собрать ? Цель не сам ответ, а id пользователя записать в какую-то базу данных.

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

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

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

В оф.документации все есть.
Сообщение состоит из ID отправителя, самого сообщения и ещё всякой информации.
 
Последнее редактирование:

Trader Jet

New member
09.01.2023
2
0
BIT
0
День добрый
Спасибо за статью
Такой вопрос, вы используете прокси?
Потому я почему то ловлю сразу блок аккаунта при подключении сессии либо спам блок.
Аккаунты не новореги
 

StripedBear

Green Team
24.07.2021
33
23
BIT
10
День добрый
Спасибо за статью
Такой вопрос, вы используете прокси?
Потому я почему то ловлю сразу блок аккаунта при подключении сессии либо спам блок.
Аккаунты не новореги
Я не использовал прокси, но должно работать так:

from telethon import TelegramClient
import socks
client = TelegramClient('session_id', api_id='12123123', api_hash='0123456789abcdef0123456789abcdef', proxy=(socks.SOCKS5, 'ip-proxy', port-proxy, 'логин', 'пароль'))
 

Trader Jet

New member
09.01.2023
2
0
BIT
0
Я не использовал прокси, но должно работать так:

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) и кидает блок на отправку (без даты окончания)
 
23.01.2024
1
0
BIT
4
Посмотреть вложение 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:
привет бот очень не плох но такой вопрос куда сохраняются данные собранные о пользователи
 

StripedBear

Green Team
24.07.2021
33
23
BIT
10
Мы в соцсетях:

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