def filtered_user_list(filter_string):
    user_list = []  # List that will contain all the users of the target chat
    limit = 200  # Amount of users to retrieve for each API call
    offset = 0  # Offset starts at 0

    while True:
        try:
            participants = client.send(
                functions.channels.GetParticipants(
                    channel=client.resolve_peer(target),
                    filter=types.ChannelParticipantsSearch(filter_string),
                    offset=offset,
                    limit=limit,
                    hash=0))
        except FloodWait as e:
            # Very large channels will trigger FloodWait.
            # When happens, wait X seconds before continuing
            time.sleep(e.x)
            continue

        if not participants.participants:
            break  # No more participants left

        user_list.extend(participants.users)
        offset += limit
    return user_list
Пример #2
0
app = Client(session_name="my_account", api_id=API_ID, api_hash="API_HASH")

app.start()

target = "CHANNEL"  # Target channel/supergroup
users = []  # List that will contain all the users of the target chat
limit = 200  # Amount of users to retrieve for each API call
offset = 0  # Offset starts at 0

while True:
    try:
        participants = app.send(
            functions.channels.GetParticipants(
                channel=app.resolve_peer(target),
                filter=types.ChannelParticipantsSearch(
                    ""),  # Filter by empty string (search for all)
                offset=offset,
                limit=limit,
                hash=0))
    except FloodWait as e:
        # Very large channels will trigger FloodWait.
        # When happens, wait X seconds before continuing
        time.sleep(e.x)
        continue

    if not participants.participants:
        break  # No more participants left

    users.extend(participants.users)
    offset += limit
Пример #3
0
    def get_chat_members(self,
                         chat_id: int or str,
                         offset: int = 0,
                         limit: int = 200,
                         query: str = "",
                         filter: str = Filters.ALL):
        """Use this method to get the members list of a chat.

        A chat can be either a basic group, a supergroup or a channel.
        You must be admin to retrieve the members list of a channel (also known as "subscribers").

        Args:
            chat_id (``int`` | ``str``):
                Unique identifier (int) or username (str) of the target chat.

            offset (``int``, *optional*):
                Sequential number of the first member to be returned.
                Defaults to 0 [1]_.

            limit (``int``, *optional*):
                Limits the number of members to be retrieved.
                Defaults to 200, which is also the maximum server limit allowed per method call.

            query (``str``, *optional*):
                Query string to filter members based on their display names and usernames.
                Defaults to "" (empty string) [2]_.

            filter (``str``, *optional*):
                Filter used to select the kind of members you want to retrieve. Only applicable for supergroups
                and channels. It can be any of the followings:
                *"all"* - all kind of members,
                *"kicked"* - kicked (banned) members only,
                *"restricted"* - restricted members only,
                *"bots"* - bots only,
                *"recent"* - recent members only,
                *"administrators"* - chat administrators only.
                Defaults to *"all"*.

        .. [1] Server limit: on supergroups, you can get up to 10,000 members for a single query and up to 200 members
            on channels.

        .. [2] A query string is applicable only for *"all"*, *"kicked"* and *"restricted"* filters only.

        Returns:
            On success, a :obj:`ChatMembers` object is returned.

        Raises:
            :class:`Error <pyrogram.Error>` in case of a Telegram RPC error.
            ``ValueError`` if you used an invalid filter or a chat_id that belongs to a user.
        """
        peer = self.resolve_peer(chat_id)

        if isinstance(peer, types.InputPeerChat):
            return utils.parse_chat_members(
                self.send(functions.messages.GetFullChat(peer.chat_id)))
        elif isinstance(peer, types.InputPeerChannel):
            filter = filter.lower()

            if filter == Filters.ALL:
                filter = types.ChannelParticipantsSearch(q=query)
            elif filter == Filters.KICKED:
                filter = types.ChannelParticipantsKicked(q=query)
            elif filter == Filters.RESTRICTED:
                filter = types.ChannelParticipantsBanned(q=query)
            elif filter == Filters.BOTS:
                filter = types.ChannelParticipantsBots()
            elif filter == Filters.RECENT:
                filter = types.ChannelParticipantsRecent()
            elif filter == Filters.ADMINISTRATORS:
                filter = types.ChannelParticipantsAdmins()
            else:
                raise ValueError("Invalid filter \"{}\"".format(filter))

            return utils.parse_chat_members(
                self.send(
                    functions.channels.GetParticipants(channel=peer,
                                                       filter=filter,
                                                       offset=offset,
                                                       limit=limit,
                                                       hash=0)))
        else:
            raise ValueError(
                "The chat_id \"{}\" belongs to a user".format(chat_id))
Пример #4
0
    def get_chat_members(
            self,
            chat_id: Union[int, str],
            offset: int = 0,
            limit: int = 200,
            query: str = "",
            filter: str = Filters.ALL) -> List["pyrogram.ChatMember"]:
        """Get a chunk of the members list of a chat.

        You can get up to 200 chat members at once.
        A chat can be either a basic group, a supergroup or a channel.
        You must be admin to retrieve the members list of a channel (also known as "subscribers").
        For a more convenient way of getting chat members see :meth:`~Client.iter_chat_members`.

        Parameters:
            chat_id (``int`` | ``str``):
                Unique identifier (int) or username (str) of the target chat.

            offset (``int``, *optional*):
                Sequential number of the first member to be returned.
                Only applicable to supergroups and channels. Defaults to 0 [1]_.

            limit (``int``, *optional*):
                Limits the number of members to be retrieved.
                Only applicable to supergroups and channels.
                Defaults to 200, which is also the maximum server limit allowed per method call.

            query (``str``, *optional*):
                Query string to filter members based on their display names and usernames.
                Only applicable to supergroups and channels. Defaults to "" (empty string) [2]_.

            filter (``str``, *optional*):
                Filter used to select the kind of members you want to retrieve. Only applicable for supergroups
                and channels. It can be any of the followings:
                *"all"* - all kind of members,
                *"kicked"* - kicked (banned) members only,
                *"restricted"* - restricted members only,
                *"bots"* - bots only,
                *"recent"* - recent members only,
                *"administrators"* - chat administrators only.
                Only applicable to supergroups and channels.
                Defaults to *"all"*.

        .. [1] Server limit: on supergroups, you can get up to 10,000 members for a single query and up to 200 members
            on channels.

        .. [2] A query string is applicable only for *"all"*, *"kicked"* and *"restricted"* filters only.

        Returns:
            List of :obj:`ChatMember`: On success, a list of chat members is returned.

        Raises:
            ValueError: In case you used an invalid filter or a chat id that belongs to a user.

        Example:
            .. code-block:: python

                # Get first 200 recent members
                app.get_chat_members("pyrogramchat")

                # Get all administrators
                app.get_chat_members("pyrogramchat", filter="administrators")

                # Get all bots
                app.get_chat_members("pyrogramchat", filter="bots")
        """
        peer = self.resolve_peer(chat_id)

        if isinstance(peer, types.InputPeerChat):
            r = self.send(functions.messages.GetFullChat(chat_id=peer.chat_id))

            members = r.full_chat.participants.participants
            users = {i.id: i for i in r.users}

            return pyrogram.List(
                pyrogram.ChatMember._parse(self, member, users)
                for member in members)
        elif isinstance(peer, types.InputPeerChannel):
            filter = filter.lower()

            if filter == Filters.ALL:
                filter = types.ChannelParticipantsSearch(q=query)
            elif filter == Filters.KICKED:
                filter = types.ChannelParticipantsKicked(q=query)
            elif filter == Filters.RESTRICTED:
                filter = types.ChannelParticipantsBanned(q=query)
            elif filter == Filters.BOTS:
                filter = types.ChannelParticipantsBots()
            elif filter == Filters.RECENT:
                filter = types.ChannelParticipantsRecent()
            elif filter == Filters.ADMINISTRATORS:
                filter = types.ChannelParticipantsAdmins()
            else:
                raise ValueError("Invalid filter \"{}\"".format(filter))

            while True:
                try:
                    r = self.send(
                        functions.channels.GetParticipants(channel=peer,
                                                           filter=filter,
                                                           offset=offset,
                                                           limit=limit,
                                                           hash=0))

                    members = r.participants
                    users = {i.id: i for i in r.users}

                    return pyrogram.List(
                        pyrogram.ChatMember._parse(self, member, users)
                        for member in members)
                except FloodWait as e:
                    log.warning("Sleeping for {}s".format(e.x))
                    time.sleep(e.x)
        else:
            raise ValueError(
                "The chat_id \"{}\" belongs to a user".format(chat_id))
Пример #5
0
}  # To ensure uniqueness, users will be stored in a dictionary with user_id as key
limit = 200  # Amount of users to retrieve for each API call (200 is the maximum)

# "" + "0123456789" + "abcdefghijklmnopqrstuvwxyz" (as list)
queries = [""] + [str(i) for i in range(10)] + list(ascii_lowercase)

for q in queries:
    print("Searching for '{}'".format(q))
    offset = 0  # For each query, offset restarts from 0

    while True:
        try:
            participants = app.send(
                functions.channels.GetParticipants(
                    channel=app.resolve_peer(target),
                    filter=types.ChannelParticipantsSearch(q),
                    offset=offset,
                    limit=limit,
                    hash=0))
        except FloodWait as e:
            # Very large chats could trigger FloodWait.
            # When happens, wait X seconds before continuing
            print("Flood wait: {} seconds".format(e.x))
            time.sleep(e.x)
            continue

        if not participants.participants:
            print("Done searching for '{}'".format(q))
            print()
            break  # No more participants left