Подскажите, пожалуйста, можно ли каким-то образом получить список всех участников некоторого чата в Telegram? Интересует именно "useame" пользователей.
question@mail.ru
·
01.01.1970 03:00
Можно ли получить список всех участников чата в Telegram?
answer@mail.ru
·
01.01.1970 03:00
Да, возможно, приложу свой скрипт который справляется с данной задачей,
Также приложу код тут с пояснениями, на случай удаления репозитория:
Делаем необходимые импорты:
import sysfrom getpass import getpassfrom time import sleep# pip install telethon==0.11.5from telethon import TelegramClientfrom telethon.errors import SessionPasswordNeededErrorfrom telethon.errors.rpc_errors_400 import UseameNotOccupiedErrorfrom telethon.errors.rpc_errors_420 import FloodWaitErrorfrom telethon.tl.functions.channels import GetParticipantsRequestfrom telethon.tl.functions.contacts import ResolveUseameRequestfrom telethon.tl.types import ChannelParticipantsSearch, InputChannelДалее нам нужно создать аккаунт тут и заполнить следующие поля:
api_id = 0api_hash = ''phone = ''limit = 100Теперь нам надо авторизоваться:
def main(): # запрашиваем чат channel_name = input('Input a channel name, without ""@"": ') client = TelegramClient('current-session', api_id, api_hash) client.connect() # проверяем не залогинены ли вы уже # как можно видеть выше мы создали сессию под именем current-session # после первой авторизации можно будет использовать её if not client.is_user_authorized(): try: # отсылаем код подтверждения client.send_code_request(phone) client.sign_in(phone, code=input('Enter code: ')) # иногда телеграмм блокирует доступ на +- 80к сек # так что будьте аккуратны и не посылайте слишком много запросов except FloodWaitError as FloodError: print('Flood wait: {}.'.format(FloodError)) sys.exit() # проверяем есть ли у пользователя пароль # если да, запрашиваем его и логинимся except SessionPasswordNeededError: client.sign_in(password=getpass('Enter password: ')) # об этой функции расскажу ниже dump_users(get_chat_info(channel_name, client), client)Приступаем к сбору пользователей, для этого нам нужен ID чата и access_hash как в документации:
def get_chat_info(useame, client): try: chat = client(ResolveUseameRequest(useame)) except UseameNotOccupiedError: print('Chat/channel not found!') sys.exit() result = { 'chat_id': chat.peer.channel_id, 'access_hash': chat.chats[0].access_hash } retu resultМы получили данные о чате, осталось собрать пользователей:
def dump_users(chat, client): counter = 0 offset = 0 # нам нужно сделать объект чата, как сказано в документации chat_object = InputChannel(chat['chat_id'], chat['access_hash']) all_participants = [] while True: # тут мы получаем пользователей # всех сразу мы получить не можем для этого нам и нужен offset participants = client.invoke(GetParticipantsRequest( chat_object, ChannelParticipantsSearch(''), offset, limit )) # если пользователей не осталось, т.е мы собрали всех, выходим if not participants.users: break all_participants.extend(['{} {}'.format(x.id, x.useame) for x in participants.users]) users_count = len(participants.users) # увеличиваем offset на то кол-во юзеров которое мы собрали offset += users_count counter += users_count print('{} users collected'.format(counter)) # не забываем делать задержку во избежания блокировки sleep(2) # сохраняем в файл with open('users.txt', 'w') as file: file.write('\n'.join(map(str, all_participants)))Получаем уютный текстовик в формате:
ID USEAMEИспользовалось , в качестве обёртки
Блоги
Как правильно обрабатывать ошибки в Python: от try-except-finally до ловли всех исключений
Как начать изучать Python с нуля: лучшая стратегия + 17 шагов для самообучения
Какие проекты делать для портфолио
Как создать графический интерфейс на PyQt5?