import asyncio import sys from os import getenv import glob from dotenv import load_dotenv from pyrogram import Client from loguru import logger # Для режима сообщений path_to_photo = "img.png" text_msg = \ f"""Приветствую меня зовут Инокендий """ + "#флуд #ролевая #геншинимпакт #геншин #flood #rp #genshin" # Список ID групп и топиков, куда будут отправляться сообщения (Используйте числовые ID) group_ids = { -1002123850090: None, 'sgfghsfdhsdfhdh': 21, } # Ваши данные для авторизации load_dotenv('.env') api_id: int = int(getenv('API_ID')) # Получите это на https://my.telegram.org api_hash: str = str(getenv('API_HASH')) # Получите это на https://my.telegram.org phone_number: str = str(getenv('PHONE_NUMBER')) # Ваш номер телефона в международном формате password: str = str(getenv('PASSWORD')) # Если включена двухфакторная аутентификация bot_token: str = str(getenv('BOT_TOKEN')) # Токен бота, если включен режим бота bot_username: str = str(getenv('BOT_USERNAME')) # Юзернейм бота для инлайн-режима account: str = str(getenv('ACCOUNT', 'user')) # Режим аккаунта или бота msg_type: str = str(getenv('TYPE_MSG', 'inline')) # Выбор что будет отправлять сообщение или инлайн time: int = int(getenv('TIME', 3600)) # Количество времени перед постами, по умолчанию 20 секунд # Проверка наличия необходимых переменных окружения if not all([api_id, api_hash, phone_number, bot_token, account, msg_type]): raise ValueError("Необходимо установить все переменные окружения: API_ID, API_HASH, BOT_TOKEN, BOT_USERNAME, ACCOUNT, TYPE_MSG") async def photo(file: str = path_to_photo) -> str: # Находим все файлы, которые соответствуют шаблону files = glob.glob(file) # Проверяем, найдены ли файлы if files: # Получаем первый найденный файл path_to_photo = files[0] logger.bind(user="@Console").info(f"Выбранный файл: {path_to_photo}\n") return path_to_photo else: logger.bind(user="@Console").info("Файлы с именем 'img' не найдены.\n") return "Не могу найти файл!" # Функция отправки инлайн-запроса и получения ответа async def send_inline_request(client) -> None: for group_id, topic_id in group_ids.items(): try: # Получаем инлайн результаты от бота inline_results = await client.get_inline_bot_results(bot_username, "Реклама") if inline_results.results: # Выбираем первый результат result_id = inline_results.results[0].id # Отправляем выбранный инлайн результат в чат await client.send_inline_bot_result( chat_id=group_id, reply_to_message_id=topic_id, query_id=inline_results.query_id, result_id=result_id, ) logger.bind(user=group_id).info( f"Инлайн результат от {bot_username} успешно отправлен в группу {group_id}" f"{f', топик {topic_id}' if topic_id else ''}" ) else: logger.bind(user=group_id).warning( f"Нет инлайн результатов от {bot_username} для группы {group_id}" ) except Exception as e: logger.bind(user=group_id).error( f"Ошибка при отправке инлайн результата в группу {group_id}: {e}" ) # Функция отправки картинки с описанием (оставляем как есть, она работает с топиками) async def send_msg(client) -> None: for group_id, topic_id in group_ids.items(): try: # Проверяем, существует ли файл с фото import os if not os.path.exists(path_to_photo): raise FileNotFoundError(f"Файл {path_to_photo} не найден") # Отправляем картинку с описанием с учетом топика, если он указан if topic_id: await client.send_photo( chat_id=group_id, photo=path_to_photo, caption=text_msg, reply_to_message_id=topic_id # Отвечаем в топике ) else: await client.send_photo( chat_id=group_id, photo=path_to_photo, caption=text_msg ) logger.bind(user=group_id).info( f"Картинка успешно отправлена в группу {group_id}" f"{f', топик {topic_id}' if topic_id else ''}" ) except Exception as e: logger.bind(user=group_id).error( f"Ошибка при отправке картинки в группу {group_id}: {e}" ) # Функция бесконечного цикла сообщений async def periodic_send(client) -> None: while True: if msg_type.lower() == "inline": await send_inline_request(client) else: await send_msg(client) print('\n') await asyncio.sleep(time) # Временно 20 секунд, позже измените на 4 часа # Функция создания логгеров async def loger() -> None: logger.remove() max_size = '500 MB' info_text = ("{time:YYYY-MM-DD HH:mm:ss} | " "PRIMO-Message | " "{extra[user]} | {message}") error_text = ("{time:YYYY-MM-DD HH:mm:ss} | " "PRIMO-ERROR | " "{extra[user]} | {message}") logger.add(sys.stderr, colorize=True, format=info_text, level="INFO", filter=lambda record: record["level"].name == "INFO",) logger.add(sys.stderr, colorize=True, format=error_text, level="ERROR", filter=lambda record: record["level"].name == "ERROR",) logger.add("start.log", rotation=max_size, format=info_text, backtrace=True, diagnose=True, level="INFO", filter=lambda record: record["level"].name == "INFO",) logger.add("error.log", rotation=max_size, format=error_text, backtrace=True, diagnose=True, level="ERROR", filter=lambda record: record["level"].name == "ERROR",) logger.bind(user="@Console").info("Программа запущена!") # Основная функция запуска клиента async def main() -> None: await loger() await photo() if account.lower() == "user": # Исправлено условие # Создаем клиента с использованием api_id и api_hash async with Client("user_session", api_id=api_id, api_hash=api_hash, phone_number=phone_number, password=password) as client: # Запускаем периодическую отправку сообщений await periodic_send(client) else: # Создаем клиента с использованием api_id, api_hash и bot_token async with Client("bot_session", api_id=api_id, api_hash=api_hash, bot_token=bot_token) as client: # Запускаем периодическую отправку сообщений await periodic_send(client) # Бесконечный запуск if __name__ == "__main__": asyncio.run(main())