惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Securelist
Simon Willison's Weblog
Simon Willison's Weblog
Security Latest
Security Latest
博客园 - 司徒正美
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Check Point Blog
Jina AI
Jina AI
H
Heimdal Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog
美团技术团队
W
WeLiveSecurity
G
Google Developers Blog
K
Kaspersky official blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Visual Studio Blog
T
Threatpost
酷 壳 – CoolShell
酷 壳 – CoolShell
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
腾讯CDC
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cyberwarzone
Cyberwarzone
Apple Machine Learning Research
Apple Machine Learning Research
P
Privacy & Cybersecurity Law Blog
H
Hacker News: Front Page
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
V
Vulnerabilities – Threatpost
AI
AI
MongoDB | Blog
MongoDB | Blog
Project Zero
Project Zero
Hacker News: Ask HN
Hacker News: Ask HN
量子位
A
Arctic Wolf
GbyAI
GbyAI
Recorded Future
Recorded Future
SecWiki News
SecWiki News
小众软件
小众软件
Martin Fowler
Martin Fowler

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром T-TOPS: Как распутать гордиев узел проекта после выхода в прод (меч не понадобится) Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
LLM-агент для поиска свободных доменов: автоматизируем подбор
Гордиенко Сергей · 2026-04-16 · via Все публикации подряд на Хабре

Каждый день регистрируются сотни тысяч новых доменов, поэтому найти среди оставшихся что-то короткое, понятное и незанятое становится сложнее. Хороший домен — это узнаваемость и доверие пользователя. 

Привет, Хабр! Меня зовут Сергей. Я работаю инженером в Selectel, а в свободное время пишу пет-проекты для души. Недавно я прикинул: а что, если прямо сейчас мне понадобится запустить свой бренд или продукт? Первое, во что упираешься в таких раздумьях — это выбор домена. В этой статье я покажу небольшой проект, благодаря которому можно подбирать доменные имена не вручную, а автоматически с применением ИИ-агентов. Удобно или нет, решайте сами, подробности под катом.

Идея автоматизации 

Будем честны: подбор домена — это тупая механическая работа. Придумали название, открыли регистратор, вбили желаемое в поиск — «Занято». 

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

В какой-то момент мне стало банально лень. Но вместо того, чтобы смириться, я решил потратить вечер-два и собрать костыль, который будет страдать за меня. Идея простая: заставить LLM-агента генерировать названия и сразу проверять их доступность по API, чтобы на выходе получать только свободные и адекватные варианты.

Хорошее доменное имя: существует или нет

Кризис доменных имен

Пространство доменных имен не резиновое — особенно в популярных зонах, таких как: .com, .ru, .io и .org. По данным статьи DomainIncite, только в зоне .com зарегистрировано более 160 млн доменов. 

Короткие, осмысленные, легко запоминающиеся имена разобраны уже давно — часть из них перепродается на вторичном рынке за десятки тысяч долларов. Новым проектам приходится либо идти на компромисс, либо проявлять изобретательность.

Индекс доменного рынка подтверждает: активность в популярных зонах выросла втрое за последние три года, что только усиливает дефицит свободных имен. Источник.

Индекс доменного рынка подтверждает: активность в популярных зонах выросла втрое за последние три года, что только усиливает дефицит свободных имен. Источник.

Обычно в таких случаях инженеры идут по пути наименьшего сопротивления: просто добавляют цифры или лишние буквы. Получается, вместо flowers.ru, что-то вроде flowers11.ru или flowerrs.ru. Это не только выглядит дешево, но и несет риски для безопасности: пользователи могут ошибиться в написании и попасть на фишинговый сайт. 

Фишинговые домены и домены-зеркала

Фишинговые домены плодят сущности вроде sberbank-online.ru или pay-pal-service.com. И именно тут появляются мошенники, используя тайпосквоттинг — регистрацию имен, которые визуально почти не отличимы от оригинала: go0gle.com (через ноль) или paypa1.com.

Реальный кейс: минус $500 000 за одну букву. Летом 2025 года блокчейн-разработчик из России лишился криптоактивов на полмиллиона долларов из-за одной опечатки. Он скачал расширение для подсветки синтаксиса Solidity из маркетплейса Open VSX. Плагин выглядел легитимным, имел тысячи загрузок и хорошие отзывы.

Подвох был в имени автора: злоумышленники использовали ник juanbIanco — с заглавной латинской I вместо строчной l. Разработчик, как и алгоритмы ранжирования, не заметил подмены. В итоге расширение подтянуло бэкдор, который выгреб приватные ключи из системы.

Если даже опытный инженер попадается на замену одной буквы в знакомом имени, то обычный пользователь и подавно не отличит ваш «официальный» my-service-24.io от мошеннического my-servlce-24.io.


Домены-зеркала — это еще одна проблема. Популярные бренды и сервисы часто вынуждены создавать копии своих сайтов после блокировок, используя созвучные адреса (например, добавляя приставки mirror, online или порядковые номера), или через другие зоны.

Проблема в том, что пользователь привыкает: «Ага, основной сайт не открывается, значит, надо искать что-то похожее в поиске». Оба явления процветают именно потому, что в «нормальных» зонах места почти не осталось — злоумышленники занимают соседние ниши.

Масштабы могут быть и более катастрофическими. В 2024 году перед Олимпиадой в Париже, киберпреступники развернули сеть из 700+ доменов типа paris2024-tickets.com. Сайты были отрисованы один в один с официальными, а из-за ажиотажа люди массово вводили данные карт. В итоге 180 000 пострадавших, 15 млн евро ущерба и гигантский слив персональных данных.

Домен — это не просто эстетика

Хороший домен работает как первое рукопожатие с пользователем. Он должен легко произноситься вслух, без ошибок набираться с клавиатуры и мгновенно ассоциироваться с тематикой сайта. Домен вида xn--e1afmapc.xn--p1ai или my-super-cool-startup-2024.net создает лишнюю нагрузку и подрывает доверие еще до того, как пользователь увидел сам сайт. Но это вы и сами знаете.

Перенос и продление домена по 1 ₽

С легкостью переходите в Selectel от любого другого провайдера. Сайт продолжит работать без остановки.

Исследовать →

Автоматизация подбора доменного имени

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

Обзор проекта в общих чертах

Проект состоит из двух последовательных этапов. 

Первый — обращение к LLM-агенту с описанием проекта и требованиями к домену (длина, ключевые слова, зоны). В итоге получаем список потенциальных названий. 

Второй — автоматический фильтр. Скрипт прогоняет каждый вариант через WHOIS-запрос: занят или свободен. В конце на руках остается готовый список: мы видим и сами идеи, и информацию о том, какие из них свободны для регистрации. Весь ручной перебор в интерфейсе регистратора исключается.

Детали реализации

Стек и структура проекта

Проект написан на Python. Для обращения к LLM-агенту используется OpenAI-совместимый API-ключ. WHOIS-запросы реализованы через библиотеку python-whois. Структура сама по себе компакта: модуль генерации через агента, модуль проверки занятости адреса, точка входа с конфигурацией через .env и простой web-интерфейс.

Как компоненты работают вместе

Генерация и проверка соединены в линейный конвейер: сначала агент создает список из возможных адресов, потом каждый домен проходит WHOIS-проверку на занятость. Результат — отфильтрованный список доменов, который выводится на веб-странице. Весь процесс от запуска до результата занимает порядка 10–30 секунд в зависимости от количества кандидатов и скорости WHOIS-серверов.

Процесс создания проекта

Первым делом мы получаем API-ключ на сайте openrouter.ai для того, чтобы можно было обращаться с запросом к LLM-агенту. Далее выносим его в env-файл, после чего беремся за создание самого проекта:

MODELS = [
    "qwen/qwen3-next-80b-a3b-instruct:free",
    "arcee-ai/trinity-large-preview:free",
    "openai/gpt-oss-120b:free",
]

Для отказоустойчивости, возьмем небольшой список из бесплатных моделей в случае, если одна из них отвалится:

def generate_domains(user_prompt: str, tlds: list, count: int) -> list:
    if not OPENROUTER_API_KEY:
        raise Exception("OPENROUTER_API_KEY не задан. Проверьте файл .env")
    headers = {
        "Authorization": f"Bearer {OPENROUTER_API_KEY}",
        "Content-Type": "application/json",
    }

    tlds_str = ", ".join(tlds) if tlds else ".com, .net, .org"
    prompt_text = (
        f"Based on the following description, generate exactly {count} creative and relevant domain name suggestions.\n\n"
        "Description: " + user_prompt + "\n\n"
        "Rules:\n"
        f"- Use ONLY these TLDs (domain zones): {tlds_str}\n"
        "- Each domain should be concise (2-20 characters before the TLD)\n"
        "- Make them memorable and brandable\n"
        "- No spaces or special characters except hyphens\n"
        "- Distribute suggestions across the provided TLDs\n"
        "- Return ONLY a JSON array of domain names, nothing else\n"
        '- Example format: ["example.com", "mystore.net", "coolbrand.io"]\n\n'
        f"Generate exactly {count} domain suggestions as a JSON array."
    )

    last_error = None
    for model in MODELS:
        try:
            payload = {
                "model": model,
                "messages": [{"role": "user", "content": prompt_text}],
                "max_tokens": 1024,
            }

            body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
            response = requests.post(OPENROUTER_URL, headers=headers, data=body, timeout=60)
            response.raise_for_status()
            data = response.json()
            response_text = data["choices"][0]["message"]["content"].strip()
            json_match = re.search(r'\[.*?\]', response_text, re.DOTALL)
            if json_match:
                domains = json.loads(json_match.group())
                if domains:
                    print(f"Used model: {model}")
                    return domains[:count]
        except Exception as e:
            print(f"Model {model} failed: {e}")
            last_error = e
            continue
    raise Exception(f"Все модели недоступны. Последняя ошибка: {last_error}")

Зададим структурированный промт и передадим в него описание проекта пользователя, список доменных зон и желаемое количество вариантов. Спарсим ответ модели, и извлечем JSON-массив из полученного текста

def check_domain_availability(domain: str) -> dict:
    try:
        w = whois.whois(domain)
        if w.domain_name or w.registrar or w.creation_date:
            return {"domain": domain, "available": False, "status": "taken"}
        else:
            return {"domain": domain, "available": True, "status": "available"}
    except SystemExit:
        return {"domain": domain, "available": None, "status": "unknown"}
    except Exception as e:
        error_str = str(e).lower()
        if any(x in error_str for x in ["no match", "not found", "no entries", "no data"]):
            return {"domain": domain, "available": True, "status": "available"}
        return {"domain": domain, "available": None, "status": "unknown"}

Выполняем WHOIS-запросы и анализируем результат по названию, регистратору или дате создания. Если хотя бы один из них присутствует — домен занят.

def check_domains_parallel(domains: list) -> list:
    results = [None] * len(domains)
    with ThreadPoolExecutor(max_workers=10) as executor:

        futures = {
            executor.submit(check_domain_availability, domain): i
            for i, domain in enumerate(domains)
        }

        for future in as_completed(futures):
            i = futures[future]
            results[i] = future.result()
    return results

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

@app.route('/generate', methods=['POST'])
def generate():
    data = request.get_json(force=True)
    prompt = data.get('prompt', '').strip()
    tlds = data.get('tlds', ['.com', '.net', '.org', '.io', '.store', '.shop'])
    count = int(data.get('count', 10))
    count = max(1, min(20, count))
    if not tlds:
        tlds = ['.com', '.net', '.org']
    if not prompt:
        return jsonify({"error": "Пожалуйста, введите описание"}), 400
    try:
        domains = generate_domains(prompt, tlds, count)
        if not domains:
            return jsonify({"error": "Не удалось сгенерировать доменные имена"}), 500
        results = check_domains_parallel(domains)
        return jsonify({"domains": results})
    except Exception as e:
        return jsonify({"error": f"Ошибка: {str(e)}"}), 500
if name == '__main__':
    app.run(debug=True, port=5000)

Здесь мы проводим валидацию входных значений: число выводимых результатов, какие доменные зоны будут выводиться и описание запроса.

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

Выгрузил данные на сервер, установил необходимые зависимости, создал и запустил systemd-сервис, открыл порт на файрволе. И теперь проект функционировал и был доступен в любой момент при необходимости.

Как работает проект

При переходе на страницу проекта мы попадаем на пользовательский интерфейс. Он выполнен максимально просто.

На странице есть поле для описания проекта, блок с чекбоксами для выбора предпочтительных доменных зон (например, .io, .tech, .ru), поле-счетчик, в котором указывается количество выходных результатов, и кнопка для запуска поиска.

Задаем входные значения и нажимаем кнопку Найти домены.

После этого запускается процесс генерации вариантов через LLM, проверка доступности и парсинг ответов WHOIS.

В конце мы получаем результат в виде списка из возможных вариантов, которые уже проверены на занятость и отмечены либо «Свободен», либо «Занят».

Входные данные: что передаем агенту

На вход агент принимает текстовое описание проекта или продукта, желаемые доменные зоны и их количество. Чем точнее описание, тем релевантнее результат: «сервис для автоматизации бухгалтерии малого бизнеса» даст значительно лучшие варианты, чем просто «финтех». Иначе получим стандартный набор с корнем pay или coin.

Проверка занятости через WHOIS

Когда модель генерирует пачку названий, скрипт проверяет их через WHOIS-запросы пулом по 10 потоков одновременно. 

Логика простая:

  • если в ответе есть запись о регистраторе или дата истечения — домен занят;

  • если WHOIS вернул пустой ответ или статус AVAILABLE / NOT FOUND — домен свободен, можно брать.

В итоге вся рутина с копипастом в поиск регистратора исчезает: ты сразу видишь только то, что реально можно купить.

А теперь к примерам

Вот пара примеров того, что предлагает нам агент, и насколько это органично смотрится:

Тест 1:

Для первого теста я задал следующие параметры: описание — «Бизнес-коучинг в Москве», зоны — .com, .net, .org, .ru, а желаемое количество вариантов — 15.

Результат:

Есть свободный и лаконичный вариант — bizmoscow.org.

Тест 2:

Во втором случае я решил проверить более узкую нишу — «Магазин кофейной продукции в Саратове». В качестве целевых зон выбрал .store, .shop и .ru, ограничив выдачу 10 вариантами.

Результат:

Тут тоже есть несколько хороших вариантов.

Заключение

В конечном итоге проект получился небольшим и узконаправленным, но со своей задачей справляется. LLM-агент хорошо подходит для генерации определенного количества вариантов, которые потом уже можно модернизировать и изменять по своему усмотрению или оставить как есть, а WHOIS-запросы закрывают вопрос доступности. Как пет-проект — это интересный опыт. Инструмент вполне неплох для конкретных задач, но явно требует определенных доработок и добавления более тонких настроек.

Полный код проекта можно посмотреть в моем профиле на GitHub.

Делитесь в комментариях, пытались ли уже внедрять ИИ в такие рутинные задачи?