Для одного проекта мне понадобился короткий ник в Telegram.
Минимальная длинна ника в тг - 5 символов.
Доступный алфавит - [_a-z0-9] (37 символов).
37^5 = 69 343 957
Значит мы имеем, порядка, 70 миллионов возможных, наиболее, коротких ников. Число большое, но чисто теоретически, могло быть занято (у Telegram, порядка, миллиарда активных пользователей в месяц).
У меня есть скрипт для проверки "зарегистрированности" ников крупными пачками.
Возведу уровень абстракции в абсолют и объясню свои намерения python-кодом. Для примера я решил найти все минимальные доступные ники начинающиеся с iaml:
from string import printable
ALPHABET = printable[:36] + "_"
for i in ALPHABET:
username = "iaml" + i
if await check(username):
print(username)
На выходе мы имеем следующий список ников:
>>> iamlr, iamly, iamlf, iamlm, iaml3, iaml7
Меня заинтересовал iamly. Но при попытке зарегистрировать аккаунт на это имя у меня не получилось...
Оказалось, что ник действительно никем не занят, но выставлен на продажу на платформе fragment.
После беглого аудита у меня появилось ощущение, что все минимальные возможные ники (4-5 символов) заняты (а точнее выставлены на продажу на fragment.
> Ага, и именно сейчас fragment упал...
Вернувшись к проекту через пару недель, я начал ресёрч материалов, касательно закрытого/открытого API фрагмента.
Явного упоминания открытого API на сайте/в поиске я не нашёл (что, не свойственно для проектов Telegram). Значит будет интересно найти способ получения информации.
Первым делом, я, разумеется, проанализировал запросы в параметрах для разработчиков, но это не результатов.
Я уже начал задумываться о реверс-инженеринге мини-приложения в тг, но перед этим решил проверить стандартные пути для API, так сказать методом подбора:
https://api.fragment.com/
https://fragment.com/api/
И второй вариант, всё же дал результат.
{"error":"Bad request"}
После этого я просто погуглил/поискал на github: "fragment.com/api": нашёл 3 репозитория и начал разбираться в одном из них.
Когда я попытался повторить запрос в insomnia (open sourse аналог postman-а), это на удивление не дало результатов.
Скопировал код (меня интересовал только один файл из репозитория), отформатировал, переписал на aiohttp (асинхронная python-библиотека для выполнения http запросов) и оптимизировал, чтобы в процессе понять логику.
> Оказалось, что проблема была в том, что fragment пробрасывает hash для доступа к API:
https://fragment.com/api?hash=9e123e5e1aab123456.
Пробросил. Всё работает. Для проверки попробую докопаться до себя:
{
"ok": True,
"html": (
'<...> <div class="<...> tm-value">@iamlostshe</div><...>'
'<div class=" tm-value">Unknown</div><...>'
'<div class=" tm-value">Taken</div><...>',
),
"url": '/?query=iamlostshe',
"expire": 1759692855,
"show_recent_bids": False,
}
Обновим код, для проверки гипотезы из начала статьи: о том что нет свободных пяти-символьных ников.
from string import printable
ALPHABET = printable[:36] + "_"
for i in ALPHABET:
for j in ALPHABET:
username = "iam" + i + j
if (
await telegram_checker.check(username) != "Taken"
and await fragment_checker.check(username) == "Unavailable"
):
print(username)
Такие ники выводятся, при запуске:
>>> iam0b, iam0c, iam0e, iam0h, iam0s, iam0t, iam0w, iam0y, ...
Немного мыслей об уникальности ников
По нику можно многое сказать о человеке, а можно ли оценить его уникальность, универсальным скриптом?
Для начала предлагаю определить, что делает ник уникальным:
1. Длинна - 5-32 символа, чем меньше, тем ценнее.
2. Количество слов (визуальных, например, 1 можно прочитать как l), чем меньше, тем лучше, но если нет, то 0 баллов (буду проверять только 10К самых популярных английских слов).
3. Состоит из одинаковых символов, например @aaaaa.
Предлагаю написать функцию для оценки:
from check_correct import check_correct
_CHARACTER_FREQUENCY = {
"9": "g",
"6": "b",
"4": "a",
"3": "e",
"1": "i",
"1": "l",
"0": "o",
"5": "s",
"7": "t",
"2": "z",
}
def unique_check(nick: str) -> int:
"""Проверка уникальности ника Telegram.
Возвращает число от 0 до 300 - показатель уникальности ника.
"""
if not check_correct(nick):
print(f"[{nick}] Некорректный юзернейм для оценки уникальности")
return -1
res = 0
nick = nick.lower()
for k, v in _CHARACTER_FREQUENCY.items():
nick.replace(k, v)
res += 100 - (len(nick) - 5) * 100 / 27
if nick.count(nick[0]) == len(nick):
res += 100
return res
Комментарии (3)

Chirkeshov_DC
03.12.2025 21:29Ты гений
Удевлен такими разработками талантами
Во сколько начинал программировать если не секрет?
nikerossxp
А потом из-за таких деятелей затянут гайки всем, как всегда.
imalostshe Автор
fragment-а? или о чём речь?
если так, то я в любом случае, не раскрываю полного механизма работы.