Как я спамер telethon писал…

344f23cd4baa75abfe7f57f8451f0140.png

Перед началом хочу уточнить. Я не использовал эту программу в целях распространения запрещенного контента и какого-либо злого умысла. Все, что я написал является лишь шуткой и не имеет НИКАКОГО подтекста. Весь код был опубликован исключительно в ознакомительных целях.

И так. Здравствуй, Хабр! Сегодня я хочу поделиться тем, как я писал спамер telethon, чтобы подпортить ему досуг. Понятное дело, это было лишь шуткой и некой традицией в наших с ним дружеских отношениях. Мы регулярно проводим различные «розыгрыши», которые потом со смеху вспоминаем за кружечкой чая.

Задумка заключалась в создании спам бота с «байтом» на 18+ контент в его канале. Он будет писать в комментарии различных telegram каналов сообщения, по типу «Солнце, не желаешь заглянуть ко мне в канал и немного поиграть?». После перехода по ссылке в канале с призывом к отправке сообщения «Покажи, что обещала», мы попадаем на личку моего друга. Чисто теоретически, его личку должно было разорвать от большого количества сообщений неизвестных ему людей. Посмотрим как выйдет практически.

Подготовка

Для начала я раздобыл аккаунт. Все каналы, аккаунты и прочее я вам не покажу, ибо это может не просто нарушить правила форума, но и раскрыть чужие личности.
В аккаунте мы создаем отдельный канал, и естественно, оформляем все по красоте: красивая ава, лого, фоточка к сообщению, и, конечно же, гипер-ссылка с удивительным содержанием.

Далее нам необходимо найти каналы. Я зашел на основной канал, просто поскидывал на «твинк» ссылки и id каналов. Подписываемся на все каналы, а id записываем, чтобы в будущем собрать из этого массив данных.

Какие каналы — выбирать вам. Есть разные варианты призвать аудиторию

Жизнь сладкая штука. Поэтому и каналы там сладкие… для пубертатных «язв». Думаю вы поняли о чем я.

Python-часть

Приступим к самому интересному. Код будет написан на ЯП Python, а главной библиотекой в этом деле выступит telethon.

Код
from telethon.tl.functions.channels import JoinChannelRequest
from telethon import TelegramClient, events
import asyncio
import json
import os
import socks
import random
import tracemalloc

tracemalloc.start()

proxy_list = []
with open(r"./proxy/proxy.txt") as f:
    for i in f.readlines():  
        str_i = i.strip().split(":")
        proxy_list.append([str_i[0], str_i[1], str_i[2], str_i[3]])

files = os.listdir(r"./acc/")
i = files[0]
with open(fr"./acc/{i}", "r") as jsf: 
    data = json.load(jsf)
proxy_use = proxy_list[random.randint(0, len(proxy_list)-1)]
print(fr"./acc/{i.replace('.json', '')}"," ", data["app_id"]," ", data["app_hash"], proxy_use[0]," ", int(proxy_use[1])," ", proxy_use[2]," ", proxy_use[3])
client = TelegramClient(fr"./acc/{i.replace('.json', '')}", data["app_id"], data["app_hash"], proxy=(socks.SOCKS5, proxy_use[0], int(proxy_use[1]), proxy_use[2], proxy_use[3]))
phrases = [
    "Солнышко, как насчет зайти ко мне в канал и поиграть?",
    "Привет, Солнце! Не хочешь присоединиться ко мне в канале для игры?",
    "Эй, Солнце, как насчет того, чтобы зайти в мой канал и развлечься?",
    "Солнце, не желаешь заглянуть ко мне в канал и немного поиграть?",
    "Солнышко, не хочешь провести время в моем канале и поиграть?",
    "Привет, Солнце! Заходи ко мне в канал поиграть, если хочешь.",
    "Солнце, как насчет того, чтобы зайти в мой канал и повеселиться?",
    "Эй, Солнце! Не хочешь поиграть со мной в моем канале?",
    "Солнышко, зайди ко мне в канал, будем играть вместе!",
    "Солнце, как насчет того, чтобы провести время в моем канале и развлечься?"
]
@client.on(events.NewMessage([12345]))
async def monitoring_add_to_list(event):
    print(f"Сообщение")  
    message = event.message
    if message.replies.channel_id:
            print(message.replies)
            entity = await client.get_entity(message.replies.channel_id)
            #print(entity)
            result = await client(JoinChannelRequest(channel=entity))
            #print(result)
            #discussion_chat = message.replies.peer_id
            #await client.send_message(discussion_chat, "fuck")
            await event.respond(phrases[random.randint(0, len(phrases))], comment_to=event.id)
            entity1 = await client.get_entity(968218637)
            await client.send_message(entity = entity1, message=f"Сообщение отправлено каналу '{entity.title}'")  # 968218637
client.start()
print("Start.")
client.run_until_disconnected()

Разберем, что здесь происходит.

proxy_list = []
with open(r"./proxy/proxy.txt") as f:
    for i in f.readlines():  
        str_i = i.strip().split(":")
        proxy_list.append([str_i[0], str_i[1], str_i[2], str_i[3]])

Здесь мы записываем прокси. У меня они хранятся в обычном .txt, думаю ничего страшного.

files = os.listdir(r"./acc/")
i = files[0]
with open(fr"./acc/{i}", "r") as jsf: 
    data = json.load(jsf)
proxy_use = proxy_list[random.randint(0, len(proxy_list)-1)]
print(fr"./acc/{i.replace('.json', '')}"," ", data["app_id"]," ", data["app_hash"], proxy_use[0]," ", int(proxy_use[1])," ", proxy_use[2]," ", proxy_use[3])
client = TelegramClient(fr"./acc/{i.replace('.json', '')}", data["app_id"], data["app_hash"], proxy=(socks.SOCKS5, proxy_use[0], int(proxy_use[1]), proxy_use[2], proxy_use[3]))

Сам аккаунт у меня хранится в формате js+ses, здесь мы берем необходимые данные из этих двух файлов и инициализируем клиент.

phrases = [
    "Солнышко, как насчет зайти ко мне в канал и поиграть?",
    "Привет, Солнце! Не хочешь присоединиться ко мне в канале для игры?",
    "Эй, Солнце, как насчет того, чтобы зайти в мой канал и развлечься?",
    "Солнце, не желаешь заглянуть ко мне в канал и немного поиграть?",
    "Солнышко, не хочешь провести время в моем канале и поиграть?",
    "Привет, Солнце! Заходи ко мне в канал поиграть, если хочешь.",
    "Солнце, как насчет того, чтобы зайти в мой канал и повеселиться?",
    "Эй, Солнце! Не хочешь поиграть со мной в моем канале?",
    "Солнышко, зайди ко мне в канал, будем играть вместе!",
    "Солнце, как насчет того, чтобы провести время в моем канале и развлечься?"
]
@client.on(events.NewMessage([12345]))
async def monitoring_add_to_list(event):
    print(f"Сообщение")  
    message = event.message
    if message.replies.channel_id:
            print(message.replies)
            entity = await client.get_entity(message.replies.channel_id)
            #print(entity)
            result = await client(JoinChannelRequest(channel=entity))
            #print(result)
            #discussion_chat = message.replies.peer_id
            #await client.send_message(discussion_chat, "fuck")
            await event.respond(phrases[random.randint(0, len(phrases))], comment_to=event.id)
            entity1 = await client.get_entity(my_id)
            await client.send_message(entity = entity1, message=f"Сообщение отправлено каналу '{entity.title}'")  
client.start()
print("Start.")
client.run_until_disconnected()

Ну здесь все просто. Во-первых, создали массив из фраз, которые будет писать наш бот. Во-вторых, мы создали обработчик новых сообщений. Массив с id каналов был заменен на [12345]. После идет различная обработка, а именно получение группы, которая привязана к комментариям, а после отправка туда сообщения. Также я решил сделать отправку сообщения с отчетом о только что выполненной работе мне. Мой id был заменен на my_id.

В прочем не сложно.

Результат

Я оставил этого бота на ночь и несколько дневных часов, по итогу, что мы имеем: поражение друга в долгой войне, много злых 15-ти летних подростков, и, конечно же, отличное настроение.

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

© Habrahabr.ru