Красивые никнеймы всегда были чем-то из разряда блатных номеров. С появлением мессенджеров же люди и вовсе как будто помешались на этой теме. Однако дальше всех пошел Telegram, создавший полноценную TON-биржу никнеймов. Все это делает попытки занять красивое имя вручную практически невозможными: ведь когда за один и тот же никнейм борются несколько десятков ботов, поспеть за ними просто нереально. Впрочем, пытаться их опередить и не нужно, ведь можно сделать свой бот. О том, как это сделать, мы и расскажем сегодня.


Какие задачи выполняет бот для занятия имени Telegram-канала
В первую очередь бот создан для тех, чьи никнеймы были угнаны после накруток ботов или из-за внезапно нагрянувших сторонних обстоятельств непреодолимой силы. Формально те, кто угнал никнеймы, конечно, могут сделать так, что вы не сможете получить их обратно. Однако в большинстве случаев они забивают на угнанное имя, привязывая его к рандомному акку. Telegram же неактивные акки со временем удаляет, благодаря чему можно попытаться имя перехватить.
Кроме того, обычно имена угоняют для последующей перепродажи. Так вот в момент продажи его тоже можно успеть вернуть. Кроме этого, бот для занятия имени Telegram-канала позволяет:
Автоматизировать процесс занятия красивых имен заброшенных каналов.
Частично обезопасить канал путем мгновенного перехвата имени в случае перевода канала в приватный режим.
(Опционально) автоматизировать проверку валидности сгенерированных имен.
Впрочем, давайте разберемся, как все это дело устроено.
Принцип работы бота для занятия имени Telegram-канала
Алгоритмически бот довольно простой. Хотя удобства ради использует и bot-api, и user-api. Однако в остальном все сводится к следующему:
- Бот слушает эфир и реагирует на введенные сообщения.
- В случае если текст сообщения совпадает с username канала, где авторизованный профиль создатель — бот инициирует запуск остального функционала.
- Бот запоминает канал, в котором нужно сменить имя.
- Бот запоминает имя, на которое нужно изменить имя канала.
- Бот запоминает время паузы между попытками.
- Бот проверяет, может ли быть использовано введенное сообщение в качестве имени канала.
- Бот проверяет, доступно ли введенное имя.
- Бот уходит в паузу или меняет имя — в зависимости от того, свободно ли оно.
- Оповещает об успехе/неудаче при смене имени.
Как видите, ничего сложного. Но есть нюанс: создатель канала, имя которого вы будете менять, должен быть тем же самым профилем, в котором бот авторизован по user-api. Увы, менять username каналов в Телеге может исключительно создатель. Но никто не мешает создать канал-пустышку, просто чтобы занять им красивое имя. А уже потом переносить его туда, куда вам нужно.
Пошаговая инструкция, как сделать бот для занятия имени Telegram-канала
Увы, через bot-api менять username каналов нельзя. Поэтому мы будем использовать для ядра бота user-api. Однако и bot-api будет использован для более удобного управления ботом. Поэтому авторизуемся и в веб-версии, и в BotFather.
Начнем с BotFather:
- Пишем в ЛС BotFather.
- Делаем то, что написано в инструкции.
- Копируем токен.
Но нам нужны еще и api_id с api_hash:
- Заходим в веб-версию.
- Открываем «API development tools», вносим данные.
- Копируем api_id и api_hash.
Также понадобится настроить сервер. Если у вас его нет, советы из этой статьи помогут развернуть сервак на своем ПК. Вводим в консоль сервера:
pip install python-telegram-bot telethon
1. Делаем на сервере файл bot.py
2. Открываем этот файл в текстовом редакторе, вставляем код бота:
import asyncio
from telethon import TelegramClient, errors
from telethon.tl.functions.channels import UpdateUsernameRequest
from telethon.tl.functions.account import CheckUsernameRequest
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, ContextTypes, filters
api_id = ВАШ API_ID
api_hash = 'ВАШ API_HASH'
phone = 'ВАШ ТЕЛЕФОН'
bot_token = 'ВАШ ТОКЕН'
user_states = {}
STATE_CHANNEL, STATE_TARGET, STATE_DELAY, STATE_RUNNING = range(4)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_chat.id
user_states[user_id] = {'state': STATE_CHANNEL}
await update.message.reply_text("Привет! Введи username текущего канала (channel_username):")
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_chat.id
message = update.message.text.strip()
if user_id not in user_states:
await update.message.reply_text("Сначала отправь /start.")
return
user_data = user_states[user_id]
if user_data['state'] == STATE_CHANNEL:
user_data['channel_username'] = message
user_data['state'] = STATE_TARGET
await update.message.reply_text("Теперь введи желаемый username (target_username):")
elif user_data['state'] == STATE_TARGET:
user_data['target_username'] = message
user_data['state'] = STATE_DELAY
await update.message.reply_text("Теперь введи задержку между попытками в секундах (например: 30):")
elif user_data['state'] == STATE_DELAY:
try:
delay = float(message)
user_data['delay_seconds'] = delay
user_data['state'] = STATE_RUNNING
await update.message.reply_text(f"Запускаем процесс отслеживания...")
asyncio.create_task(attempt_username_claim(update, context, user_data))
except ValueError:
await update.message.reply_text("Некорректное число. Введи задержку в секундах (например: 30):")
async def attempt_username_claim(update: Update, context: ContextTypes.DEFAULT_TYPE, user_data):
user_id = update.effective_chat.id
channel_username = user_data['channel_username']
target_username = user_data['target_username']
delay_seconds = user_data['delay_seconds']
try:
async with TelegramClient(f'session_{user_id}', api_id, api_hash) as client:
await client.start(phone=phone)
me = await client.get_me()
entity = await client.get_entity(channel_username)
attempt = 1
while True:
await context.bot.send_message(chat_id=user_id, text=f"[{attempt}] Проверяем {target_username}...")
try:
is_available = await client(CheckUsernameRequest(username=target_username))
except Exception as e:
await context.bot.send_message(chat_id=user_id, text=f"[!] Ошибка при проверке: {e}")
is_available = False
if is_available:
await context.bot.send_message(chat_id=user_id, text=f"[{target_username}] свободен! Пытаемся назначить...")
try:
await client(UpdateUsernameRequest(channel=entity, username=target_username))
await context.bot.send_message(chat_id=user_id, text=f"[+] УСПЕХ! Username {target_username} теперь у канала.")
break
except errors.UsernameOccupiedError:
await context.bot.send_message(chat_id=user_id, text=f"[!] Имя занято (хотя казалось свободным). Пробуем снова.")
except errors.UsernameInvalidError:
await context.bot.send_message(chat_id=user_id, text=f"[!] Имя недопустимо. Завершаем.")
break
except errors.UsernameNotModifiedError:
await context.bot.send_message(chat_id=user_id, text=f"[!] Имя уже установлено. Завершаем.")
break
except Exception as e:
await context.bot.send_message(chat_id=user_id, text=f"[!] Ошибка при назначении: {e}")
else:
await context.bot.send_message(chat_id=user_id, text=f"[{target_username}] занят. Ждём {delay_seconds} сек...")
attempt += 1
await asyncio.sleep(delay_seconds)
except Exception as e:
await context.bot.send_message(chat_id=user_id, text=f"[!] Неизвесная ошибка. Код ошибки: {e}")
if __name__ == '__main__':
app = ApplicationBuilder().token(bot_token).build()
app.add_handler(CommandHandler('start', start))
app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_message))
print("Бот запущен.")
app.run_polling()
3. Вместо ВАШ API_ID, ВАШ API_HASH, ВАШ ТЕЛЕФОН и ВАШ ТОКЕН подставляем свои.
4. Сохраняем.
5. Запускаем наш бот, вводя в консоль python bot.py.
6. Проверяем, все ли работает.
Демонстрация работы
Подводя итоги
Как видите, создать бот для занятия имени Telegram-канала не так уж и сложно. Главное — не злоупотребляйте подобным, иначе вас быстро забанят. Но вот попытаться вернуть свое имя или же занять красивое имя заброшенного канала с помощью данного бота можно.