LIMB
Вход Регистрация

тема

Доркаем телеграм-каналы

Romanoff · · 3 ответов · 170 просмотров

Люди могут использовать телеграм как бесплатное облако

Алгоритм генерации - приставка + корень + суффикс 
Спойлер: Приставки например
Code:
my
your
our
is
me
us
pe
pri
pub
uni
sha
com
main
job
te
top
best
new
old
past
next
temp
back
copy
save
extra
more
all
any
some
data
docs
work
sys
safe
sec
off
leg
conf
down
up
in
out
sent
send
moe
moi
mo
tvoe
tvo
nash
lichnoe
privat
novoe
rabota
ofis
delo
dela
dom
tut
tyt
tam
po
pre
over
pere
za
co
so
ob
ot
bez
bec
raz
rac
iz
ic
vc
voz
niz
pri
pre

    
Спойлер: Корни например
Code:
doc
docs
document
file
folder
archive
storage
cloud
drive
data
work
office
ofice
paper
record
report
reports
form
note
notes
zametki
text
scan
scans
backup
backups
bac
copy
project
legal
fin
acc
account
in
voice
invoice
contr
agr
let
mail
email
memo
meet
state
app
cert
lic
per
mit
policy
pol
pro
man
gui
info
admin
bis
net
com
ru
per
private
shared
common
imp
temp
old
new
dokument
doki
docy
fail
papka
arhiv
oblako
disk
dick
rezerv
rabota
ofis
dela
mat
dan
zapisi
notatki
bum
spr
spravka
otchet
blanki
blank
dogovor
kontrakt
schet
chek
pis
lic
proekt
zadachi
star
secret
sec
skr
    

Спойлер: Код для генерации
Python:
import os
import random
import string
from datetime import datetime


GEN_DIR = "gen"
KORNI_FILE = os.path.join(GEN_DIR, "korni.txt")
PRISTAVKI_FILE = os.path.join(GEN_DIR, "pristavki.txt")

ALL_FILE = os.path.join(GEN_DIR, "all.txt")

TARGET_COUNT = 1_000_000


# --------------------------------------------------
# Загрузка слов
# --------------------------------------------------

def load_lines(filename):
    with open(filename, "r", encoding="utf-8") as file:
        return [
            line.strip()
            for line in file
            if line.strip()
        ]


# --------------------------------------------------
# Случайный набор букв/цифр
# Только a-z, 0-9
# От 3 до 9 символов
# --------------------------------------------------

def random_keyboard_string():
    chars = string.ascii_lowercase + string.digits
    length = random.randint(3, 9)

    return "".join(
        random.choice(chars)
        for _ in range(length)
    )


# --------------------------------------------------
# Литспик
# Лайтовые замены
# --------------------------------------------------

def leetspeak(text):
    pairs = {
        "a": "4",
        "e": "3",
        "i": "1",
        "o": "0",
        "s": "5",
        "t": "7",
        "g": "9",
    }

    result = []

    for char in text:
        lower = char.lower()

        if lower in pairs and random.random() < 0.5:
            replacement = pairs[lower]

            if char.isupper():
                replacement = replacement.upper()

            result.append(replacement)
        else:
            result.append(char)

    return "".join(result)


# --------------------------------------------------
# Перемещение части букв
#
# Например:
# abcdefghij
# выбираем 30% -> часть символов меняется местами
# --------------------------------------------------

def move_letters(text):
    chars = list(text)

    if len(chars) < 2:
        return text

    # Примерно 30% символов участвуют
    count = max(2, int(len(chars) * 0.3))

    if count > len(chars):
        count = len(chars)

    indexes = random.sample(range(len(chars)), count)

    selected = [chars[i] for i in indexes]
    random.shuffle(selected)

    for index, char in zip(indexes, selected):
        chars[index] = char

    return "".join(chars)


# --------------------------------------------------
# Замена близких букв
# Лайтовые пары
# --------------------------------------------------

def replace_close_letters(text):
    pairs = {
        "s": ["c"],
        "c": ["s"],
        "i": ["j"],
        "j": ["i"],
        "u": ["y"],
        "y": ["u"],
        "m": ["n"],
        "n": ["m"],
        "v": ["b"],
        "b": ["v"],
        "k": ["l"],
        "l": ["k"],
        "o": ["p"],
        "p": ["o"],
        "a": ["s"],
        "d": ["f"],
        "f": ["d"],
        "g": ["h"],
        "h": ["g"],
    }

    result = []

    for char in text:
        lower = char.lower()

        if lower in pairs and random.random() < 0.5:
            replacement = random.choice(pairs[lower])

            if char.isupper():
                replacement = replacement.upper()

            result.append(replacement)
        else:
            result.append(char)

    return "".join(result)


# --------------------------------------------------
# Удвоение букв
#
# my -> myy
# test -> teest
# --------------------------------------------------

def duplicate_letters(text):
    if not text:
        return text

    # Выбираем одну или две буквы
    count = random.randint(1, min(2, len(text)))

    indexes = random.sample(range(len(text)), count)

    result = []

    for i, char in enumerate(text):
        result.append(char)

        if i in indexes:
            result.append(char)

    return "".join(result)


# --------------------------------------------------
# Применение декоратора
#
# 20% вероятность вообще что-то менять
#
# Внутри:
#   95% -> один декоратор
#    5% -> два разных декоратора
# --------------------------------------------------

def decorate(text):
    if random.random() >= 0.20:
        return text

    decorators = [
        leetspeak,
        move_letters,
        replace_close_letters,
        duplicate_letters,
    ]

    # 5% случаев применяем ДВА разных
    if random.random() < 0.05:
        selected = random.sample(decorators, 2)

        for decorator in selected:
            text = decorator(text)

        return text

    # Остальные случаи — один
    decorator = random.choice(decorators)

    return decorator(text)


# --------------------------------------------------
# Генерация одного значения
# --------------------------------------------------

def generate_one(korni, pristavki):
    # Приставка только из pristavki.txt
    prefix = random.choice(pristavki)

    # "_" с вероятностью 1%
    separator = "_" if random.random() < 0.01 else ""

    # Корень
    root = random.choice(korni)

    # Суффикс:
    # либо число 1..10000
    # либо случайный набор a-z0-9
    if random.random() < 0.5:
        suffix = str(random.randint(1, 10000))
    else:
        suffix = random_keyboard_string()

    result = prefix + separator + root + suffix

    # "Декоратор"
    result = decorate(result)

    return result


# --------------------------------------------------
# Загрузка уже существующих значений
# --------------------------------------------------

def load_existing():
    if not os.path.exists(ALL_FILE):
        return set()

    with open(ALL_FILE, "r", encoding="utf-8") as file:
        return {
            line.strip()
            for line in file
            if line.strip()
        }


# --------------------------------------------------
# Основная функция генерации
# --------------------------------------------------

def generate(count=TARGET_COUNT):
    korni = load_lines(KORNI_FILE)
    pristavki = load_lines(PRISTAVKI_FILE)

    if not korni:
        raise ValueError("Файл korni.txt пустой")

    if not pristavki:
        raise ValueError("Файл pristavki.txt пустой")

    print(f"Корней: {len(korni)}")
    print(f"Приставок: {len(pristavki)}")

    # Загружаем уже существующие
    existing = load_existing()

    print(f"Уже есть в all.txt: {len(existing)}")

    # В этот set попадут только новые значения
    generated = set()

    # Имя нового файла
    timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")

    new_file = os.path.join(
        GEN_DIR,
        f"new-{timestamp}.txt"
    )

    print(f"Генерируем: {count:,}")
    print(f"Новый файл: {new_file}")

    attempts = 0

    with open(new_file, "w", encoding="utf-8") as new:
        while len(generated) < count:
            value = generate_one(korni, pristavki)

            attempts += 1

            # Проверяем:
            # 1. Нет ли его в старом all.txt
            # 2. Нет ли его среди текущей генерации
            if value in existing:
                continue

            if value in generated:
                continue

            generated.add(value)
            new.write(value + "\n")

            # Периодически выводим прогресс
            if len(generated) % 100_000 == 0:
                print(
                    f"Готово: {len(generated):,}/{count:,} "
                    f"| попыток: {attempts:,}"
                )

    # Добавляем новые значения в all.txt
    with open(ALL_FILE, "a", encoding="utf-8") as all_file:
        for value in generated:
            all_file.write(value + "\n")

    print()
    print("Готово!")
    print(f"Уникально сгенерировано: {len(generated):,}")
    print(f"Попыток генерации: {attempts:,}")
    print(f"Новый файл: {new_file}")
    print(f"Общий all.txt: {len(existing) + len(generated):,}")


if __name__ == "__main__":
    generate(1_000_000)

    Генерирует 1 миллион последовательностей + проверяет по тому, что уже сгенерировано. Приставка это случайная из pristavki.txt. После приставки с 1% шансом может выпасть _. Корень - это случайное из korni.txt. Суффикс - это числа в диапазоне от 1 до 10 к ИЛИ имитация случайного набора букв на клавиатуре (только символы a-z, 0-9) от 3 до 9 символов.
    С 20-процентной вероятностью результат может пойти в условный декоратор, а с 5-процентной - в две из них: литспик, перемещение букв, замена близких букв, удвоение букв

Добавляем телеграм-ссылку к генерке

Python:
with open("инпут.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

with open("output.txt", "w", encoding="utf-8") as f:
    for line in lines:
        line = line.strip()

        if line:
            f.write(f"https://t.me/{line}\n")

Python:
import subprocess
import random
import time


USER_AGENTS = [
    # Chrome Windows
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",

    # Chrome Linux
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",

    # Firefox Windows
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0",

    # Safari macOS
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15",

    # Edge
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",

    # Chrome Android
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 12; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 13; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 14; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",

    # Firefox Android
    "Mozilla/5.0 (Android 10; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0",
    "Mozilla/5.0 (Android 11; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0",
    "Mozilla/5.0 (Android 12; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0",
    "Mozilla/5.0 (Android 13; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0",
    "Mozilla/5.0 (Android 14; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0",

    # Safari iPhone
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1",
]


def check_urls():
    total = 0
    good = 0

    # Открываем good.txt заново при каждом запуске
    with open("good.txt", "w", encoding="utf-8") as good_file:

        with open("output.txt", "r", encoding="utf-8") as file:
            for line in file:
                url = line.strip()

                if not url:
                    continue

                total += 1

                user_agent = random.choice(USER_AGENTS)

                print(f"[{total}] Проверяю: {url}")

                try:
                    result = subprocess.run(
                        [
                            "curl",
                            "-L",
                            "-s",
                            "--max-time", "10",
                            "-A", user_agent,
                            url
                        ],
                        capture_output=True,
                        text=True,
                        encoding="utf-8",
                        errors="ignore"
                    )

                    response = result.stdout

                    if "Preview channel" in response:
                        good += 1
                        good_file.write(url + "\n")
                        good_file.flush()

                        print("    [+] Preview channel найден!")
                    else:
                        print("    [-] Не найдено")

                except Exception as e:
                    print(f"    [!] Ошибка: {e}")

                time.sleep(0.5)

    print()
    print("Готово!")
    print(f"Всего проверено: {total}")
    print(f"Найдено good: {good}")


if __name__ == "__main__":
    check_urls()

Проверка гудов по Preview channel, случайный юзер-агент и задержка от блокировки, аккаунт не требуется
👍13 ❤️2 🤔2
не понимаю а для чего
Ответqkid

не понимаю а для чего

Hi, тоже несколько раз пришлось перечитать что бы понять.

Ответ в самом начале.
ОтветRomanoff

Люди могут использовать телеграм как бесплатное облако

Правда вопрос, кто будет создавать публичную ссылку под канал? Так ещё и такого типа - myrabota. Да и зачем делать публичный канал, когда можно сделать приватный?

Но идея не плохая, я думаю если немного дополнить статью, и показать практический пример, то выйдет очень хорошая статья.
👍3
ОтветFebruary

Hi, тоже несколько раз пришлось перечитать что бы понять. Ответ в самом начале. Правда вопрос, кто будет создавать публичную ссылку под канал? Так ещё и такого типа - myrabota. Да и зачем делать публичный канал, когда…

Вполне себе номральаня история, обыватель может даже не думать о публичном и приватном статусе. Сейчас под рукой нет, но поищи сообщества веб сталкером, они и по телеге есть, там чего только не находят)

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.