CactusLib предоставляет прямой доступ к низкоуровневому API Telegram через CactusUtils.Telegram.
Это API для продвинутых пользователей. Неправильное его использование может привести к ошибкам “FLOOD_WAIT” или другим ограничениям со стороны Telegram.
# Не забудьте импортировать нужные классыfrom org.telegram.tgnet import TLRPCclass MyPlugin(CactusUtils.Plugin): @command(doc="Показывает кол-во аватарок у пользователя") def avatars(self, cmd: CactusUtils.Command): # Нужен ID пользователя. Например, из ответного сообщения. reply = cmd.params.replyToMsg if not reply: return cmd.answer("Ответьте на сообщение пользователя.") user_id = reply.messageOwner.from_id.user_id try: # 1. Создаем объект запроса и устанавливаем его параметры request = self.utils.Telegram.tlrpc_object( TLRPC.TL_photos_getUserPhotos(), offset=0, max_id=0, limit=80, user_id=self.utils.Telegram.input_user(user_id) ) # 3. Отправляем запрос и ждем ответа result: CactusUtils.Telegram.Result = self.utils.Telegram.send_request(request) # 4. Обрабатываем ответ # В result.response будет объект TLRPC.photos_Photos photos_count = result.response.photos.size() cmd.answer(f"У этого пользователя {photos_count} фото в профиле.") except self.utils.Telegram.TLRPCException as e: # Обрабатываем ошибки API self.error(f"TLRPC Error: {e.text}") cmd.answer(f"Ошибка API: {e.text}") return HookResult(strategy=HookStrategy.CANCEL)
Для продвинутых сценариев CactusLib предоставляет класс-помощник CactusUtils.Telegram. Он значительно упрощает прямое взаимодействие с методами Telegram API (TLRPC), предлагая синхронный способ выполнения запросов, более привычный для разработчиков и готовые методы-обертки для популярных запросов.Вместо использования callback-функций, теперь вы можете отправлять запросы и получать результат напрямую, обрабатывая ошибки через стандартный механизм try...except или самостоятельно без этого.Класс доступен через self.utils.Telegram.
Это основной способ использования. Выполнение кода приостанавливается до получения ответа или истечения таймаута.
Copy
# Создаем запрос для получения информации о чате по его IDreq = TLRPC.TL_messages_getChats()req.id.add(-123456789)try: # Отправляем запрос и ждем результат result = self.utils.Telegram.send(req) # result - это объект Result, содержащий ответ chat.title = result.response.chats.get(0) self.utils.show_info(f"Чат: {chat.title}")except self.utils.Telegram.TLRPCException as e: # Перехватываем ошибки, если API вернул ошибку self.error(f"Ошибка API {e.error.code}: {e.error.text}")except TimeoutError: # Перехватываем ошибку, если сервер не ответил вовремя self.error("Сервер не ответил на запрос.")
Если вы предпочитаете использовать callback-функции, вы можете передать их в метод send как аргумент callback.
Copy
def on_chat_info(response, error): if error: return # response в данном случае - это объект TLRPC.messages_Chats chat_title = response.chats.get(0).title self.utils.show_info(f"Имя чата: {chat_title}")# Отправляем запрос и передаем callback-функциюself.utils.Telegram.send(req, wait_response=False, callback=on_chat_info)
Эти методы упрощают вызов популярных эндпоинтов API. Они используют send “под капотом”, поэтому вы можете передавать в них его аргументы (timeout, raise_errors и т.д.).
Выполняет поиск сообщений в диалоге по множеству критериев.
dialog_id (int): ID диалога для поиска.
query (str): Текстовый запрос.
from_id (int): ID отправителя.
filter (SearchFilter): Фильтр типа сообщений (см. ниже).
limit (int): Количество сообщений для возврата.
offset (int): Смещение для начала поиска.
Возвращает список объектов org.telegram.messenger.MessageObject.SearchFilter - это Enum для удобного выбора фильтра.
Примеры значений: SearchFilter.PHOTO_VIDEO, SearchFilter.URL, SearchFilter.MUSIC, SearchFilter.EMPTY и другие.
Copy
try: # Ищем последние 5 сообщений с URL в текущем чате found_messages = self.utils.Telegram.search_messages( dialog_id=command.params.peer, filter=self.utils.Telegram.SearchFilter.URL, limit=5 ) self.answer(command.params, f"Найдено ссылок: {len(found_messages)}")except self.utils.Telegram.TLRPCException as e: self.answer(command.params, f"Ошибка поиска: {e.error.text}")
try: result = self.utils.Telegram.get_chat(-10012345678) chat_title = result.response.chats.get(0).title self.utils.show_info(f"Информация о чате: {chat_title}")except self.utils.Telegram.TLRPCException as e: self.error(f"Не удалось получить информацию о чате: {e.error.text}")
try: result = self.utils.Telegram.get_user_photos(user_id, limit=3) photo_count = len(result.response.photos) self.utils.show_info(f"Найдено {photo_count} фото.")except self.utils.Telegram.TLRPCException as e: self.error(f"Не удалось получить фото: {e.error.text}")
Получает информацию о наборе стикеров по его короткому имени.
Короткое имя - это часть URL стикерпака, например, CactusPlugins в t.me/addstickers/CactusPlugins.
Copy
try: result = self.utils.Telegram.get_sticker_set_by_short_name("CactusPlugins") sticker_set = result.response.set self.utils.show_info(f"Найден стикерпак: {sticker_set.title}")except self.utils.Telegram.TLRPCException as e: self.error(f"Стикерпак не найден: {e.error.text}")
messages (List[int]): Список ID сообщений для удаления.
chat_id (int): ID чата, в котором нужно удалить сообщения.
Copy
# Удаляем сообщения с ID 101 и 102 в текущем чатеmessages_to_delete = [101, 102]self.utils.Telegram.delete_messages(messages_to_delete, command.params.peer)