аватар question@mail.ru · 01.01.1970 03:00

Можно ли получить список всех участников чата в Telegram?

Подскажите, пожалуйста, можно ли каким-то образом получить список всех участников некоторого чата в Telegram? Интересует именно "useame" пользователей.

аватар 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

Использовалось , в качестве обёртки

Последние

Похожие