Untitled
unknown
python
a year ago
5.3 kB
7
Indexable
from pyrogram.errors import exceptions as pyro_exceptions, rpc_error from pyrogram.types import ChatPrivileges, ChatEventFilter from pyrogram.enums import ChatMembersFilter from pyrogram.raw import functions from pyrogram import Client from loguru import logger import asyncio filters = { "RESTRICTED": ChatMembersFilter.RESTRICTED, "ADMINS": ChatMembersFilter.ADMINISTRATORS, "BANNED": ChatMembersFilter.BANNED, "RECENT": ChatMembersFilter.RECENT } async def get_client(userbot_id: int, session_number: int, api_id: str, api_hash: str, bot_token: str): client_name = f"{userbot_id}_{session_number}" logger.debug(client_name) client = Client( client_name, api_id=api_id, api_hash=api_hash, bot_token=bot_token, workdir="sessions", no_updates=True ) await client.start() logger.debug("done") return client async def get_full_chat(client: Client, chat_id: int): entity = await client.resolve_peer(chat_id) full_chat = await client.invoke(functions.channels.GetFullChannel(channel=entity)) return full_chat async def get_chat_members(client: Client, chat_id: int, query: str, delay=1, max_retries=5, timeout=60): members = [] # Инициализируем список участников # Получение списка участников канала, удовлетворяющих текущему запросу for _ in range(max_retries): try: get_members_task = get_chat_members_(client, chat_id, query) # Ждем выполнения запроса с установленным временем ожидания members = await asyncio.wait_for(get_members_task, timeout) logger.debug(f"{chat_id}, {query}, {client.name} ({len(members)})") await asyncio.sleep(delay) break except pyro_exceptions.flood_420.FloodWait as e: logger.error(f"[{chat_id}] FloodWait: {e}") await asyncio.sleep(e.value) except pyro_exceptions.internal_server_error_500.RpcMcgetFail as e: logger.error(f"[{chat_id}] RpcMcgetFail: {e}") await asyncio.sleep(5) except (TimeoutError, asyncio.TimeoutError, rpc_error.RPCError) as e: logger.error(f"[{chat_id}] : {e}") except ConnectionError as e: logger.error(e) await asyncio.sleep(5) except OSError as e: logger.exception(f"RuntimeError: {e}") # await remove_client_from_cache(client) return query, [] except pyro_exceptions.bad_request_400.ChannelInvalid as e: logger.error(f"[{chat_id}] ChannelInvalid: {e}") break return query, members async def get_chat_members_(client: Client, chat_id: int, query: str): if query in filters: members = client.get_chat_members(chat_id, filter=filters[query]) else: members = client.get_chat_members(chat_id, query=query) members_list = [] counter = 0 async for member in members: members_list.append(member) counter += 1 # Логгируем после каждых 100 элементов if counter % 100 == 0: logger.debug(f"[{chat_id}] Processed {counter} members") return members_list async def join_chat(client: Client, link: str): return await client.join_chat(link) async def leave_chat(client: Client, chat_id: int): return await client.leave_chat(chat_id) async def promote_chat_member(client: Client, chat_id: int, user_id: int): privileges = ChatPrivileges( can_invite_users=False, can_promote_members=False, can_restrict_members=True ) result = await client.promote_chat_member( chat_id=chat_id, user_id=user_id, privileges=privileges ) return result async def get_users(client: Client, user_ids: list): user_ids = await asyncio.gather(*[client.resolve_peer(i) for i in user_ids]) a = await client.invoke( functions.users.GetUsers( id=user_ids ) ) return a async def get_full_user(client: Client, user_id: int): peer = await client.resolve_peer(user_id) data = await client.invoke(functions.users.GetFullUser(id=peer)) return data async def get_chat_events(client: Client, chat_id: int): filters = ChatEventFilter( new_members=True, leaving_members=True, new_restrictions=True, new_privileges=True ) # Пример асинхронного генератора для получения событий из чата async for event in client.get_chat_event_log(chat_id, filters=filters): yield event async def get_messages(client: Client, chat_id: int, message_ids: list): messages = await client.get_messages(chat_id, message_ids) return messages async def get_chat(client: Client, chat_id: int): return await client.get_chat(chat_id) async def get_join_requests(client: Client, chat_id: int): async for x in client.get_chat_join_requests(chat_id): yield x async def get_chat_history(client: Client, chat_peer): async for post in client.get_chat_history(chat_peer): yield post
Editor is loading...
Leave a Comment