Получение профилей пользователей, поиск по username, проверка ботов, определение прав в чате.
Ключевая идея: Пользователи Telegram — это сущности с профилями, username, фото и правами доступа. Telethon позволяет получать полную информацию о пользователях, искать их и определять их роли в чатах.
Метод get_entity() возвращает объект пользователя:
# По username
user = await client.get_entity('username')
print(f'{user.first_name} {user.last_name or ""}')
print(f'@{user.username or "без username"}')
# По ID (числовому)
user = await client.get_entity(123456789)
print(user.first_name)
# По ссылке
user = await client.get_entity('https://t.me/username')Ключевая идея:
get_entity()— универсальный метод. Он принимает username, ID, ссылку или объект и возвращает соответствующую сущность (User, Chat или Channel).
Объект User содержит множество атрибутов:
user = await client.get_entity('username')
# Основная информация
print(user.id) # Уникальный числовой ID
print(user.first_name) # Имя
print(user.last_name) # Фамилия (может быть None)
print(user.username) # Username без @ (может быть None)
print(user.phone) # Телефон (только для контактов)
print(user.bot) # True если это бот
print(user.verified) # True если верифицирован
print(user.restricted) # True если заблокирован Telegram
print(user.deleted) # True если аккаунт удалён (удалённый аккаунт)if user.bot:
print('Это бот')
if user.deleted:
print('Аккаунт удалён (удалённый аккаунт)')
if user.restricted:
print(f'Аккаунт заблокирован: {user.restriction_reason}')Для получения детальной информации используйте GetFullUserRequest:
from telethon.tl.functions.users import GetFullUserRequest
full = await client(GetFullUserRequest(user))
print(f'О себе: {full.full_user.about}')
print(f'Связь: {full.full_user.contact}')full = await client(GetFullUserRequest('username'))
bio = full.full_user.about
if bio:
print(f'Bio: {bio}')
else:
print('Bio не установлен')# Прямой поиск по username
try:
user = await client.get_entity('exact_username')
print(f'Найден: {user.first_name}')
except ValueError:
print('Пользователь не найден')# Поиск пользователя среди ваших диалогов
async for dialog in client.iter_dialogs():
if dialog.is_user and 'имя' in (dialog.name or '').lower():
print(f'{dialog.name} — @{dialog.entity.username or "нет username"}')Важно: Telethon не поддерживает поиск пользователей по имени через глобальный поиск. Вы можете искать только пользователей, с которыми уже взаимодействовали, или по точному username.
# Проверка, является ли сущность ботом
entity = await client.get_entity('some_entity')
if isinstance(entity, types.User) and entity.bot:
print(f'@{entity.username} — бот')
# Получение описания бота
full = await client(GetFullUserRequest(entity))
print(f'Описание: {full.full_user.about}')# Профильные фото
photos = await client.get_profile_photos('username')
for photo in photos[:5]: # Последние 5 фото
print(f'Фото ID: {photo.id}, дата: {photo.date}')
# Скачивание фото
await client.download_profile_photo('username', file='profile.jpg')# Маленькое фото
await client.download_profile_photo('username', file='small.jpg', download_big=False)
# Большой фото
await client.download_profile_photo('username', file='big.jpg', download_big=True)# Получение списка контактов
contacts = await client.get_contacts()
for contact in contacts:
print(f'{contact.first_name} +{contact.phone or "нет телефона"}')
# Удаление контакта
await client.delete_contacts([user])
# Блокировка пользователя
await client.block_user('username')
# Разблокировка
await client.block_user('username', blocked=False)from telethon.tl.functions.channels import GetParticipantRequest
participant = await client(GetParticipantRequest('chat', user_id))
p = participant.participant
# Проверка прав
if hasattr(p, 'admin_rights'):
print('Администратор')
rights = p.admin_rights
print(f'Может удалять: {rights.delete_messages}')
print(f'Может банить: {rights.ban_users}')
else:
print('Обычный участник')
# Проверка запретов
if hasattr(p, 'banned_rights'):
rights = p.banned_rights
print(f'Запрещено отправлять сообщения: {rights.send_messages}')
print(f'Запрещено медиа: {rights.send_media}')| Право | Описание |
|---|---|
change_info | Изменять информацию чата |
post_messages | Отправлять сообщения (каналы) |
edit_messages | Редактировать сообщения |
delete_messages | Удалять сообщения |
ban_users | Банить участников |
invite_users | Приглашать пользователей |
pin_messages | Закреплять сообщения |
add_admins | Назначать администраторов |
# Является ли пользователь взаимным контактом
if user.contact:
print('Взаимный контакт')
if user.contact and hasattr(user, 'mutual'):
print('Взаимный контакт (оба в контактах)')| Ошибка | Причина | Решение |
|---|---|---|
ValueError | Сущность не найдена | Проверьте username/ID |
UsernameNotOccupiedError | Username не существует | Убедитесь в правильности |
UserIsBlockedError | Пользователь заблокировал вас | Нельзя отправить сообщение |
UserNotFound | ID пользователя не найден | Проверьте ID |
try:
user = await client.get_entity('nonexistent_user')
except ValueError:
print('Пользователь не найден в диалогах или по username')# Получение пользователей из чата
participants = await client.get_participants('chat')
user_info = []
for p in participants:
info = {
'id': p.id,
'name': p.first_name,
'username': p.username,
'bot': p.bot
}
user_info.append(info)
print(f'Всего: {len(user_info)} участников')Правило: при массовом получении пользователей следите за лимитами Telegram. Большие группы (>10 000 участников) могут вызвать FloodWait.
Пользователи часто обмениваются медиафайлами. Следующая тема — работа с медиа и файлами — научит вас скачивать и загружать фото, видео, документы и голосовые сообщения.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.