diff --git a/main.py b/main.py index 5c8c5c0..6a2fc65 100644 --- a/main.py +++ b/main.py @@ -1,51 +1,133 @@ -# main.py -# Замена рекламщикам - import asyncio import sys from os import getenv +import glob +from dotenv import load_dotenv from pyrogram import Client from loguru import logger -# Сообщение и путь к картинке, которую хотите отправить -image = 'img.png' -message = "Привет! Это тестовое сообщение с картинкой." +# Для режима сообщений +path_to_photo = "img.png" +text_msg = \ +f"""Приветствую меня зовут Инокендий +""" + "#флуд #ролевая #геншинимпакт #геншин #flood #rp #genshin" + +# Список ID групп и топиков, куда будут отправляться сообщения (Используйте числовые ID) +group_ids = { + -1002123850090: None, + 'sgfghsfdhsdfhdh': 21, + } -# Список ID групп, куда будут отправляться сообщения -group_ids = [-1000000000, - ] # Ваши данные для авторизации -api_id = getenv('API_KEY') # Получите это на https://my.telegram.org -api_hash = getenv('API_HASH') # Получите это на https://my.telegram.org -phone_number = getenv('PHONE_NUMBER') # Ваш номер телефона в международном формате -password = getenv('PASSWORD') # Если включена двухфакторная аутентификация -bot_token = getenv('BOT_TOKEN') -Perm = "bot" +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 "Не могу найти файл!" -# Функция отправки по id -async def send_greetings(client): - # Проходим по каждой группе и отправляем сообщение - for group_id in group_ids: +# Функция отправки инлайн-запроса и получения ответа +async def send_inline_request(client) -> None: + for group_id, topic_id in group_ids.items(): try: - # Отправка картинки - await client.send_photo(group_id, photo=image, caption=message) - logger.bind(user=group_id).info("Сообщение успешно отправлено в группу") + # Получаем инлайн результаты от бота + 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"Ошибка при отправке в группу: {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): +async def periodic_send(client) -> None: while True: - await send_greetings(client) - # Ожидание 60 секунд перед отправкой следующего сообщения - await asyncio.sleep(14400) # 60 секунд = 1 минута, 1 час = 3600 секунд, 4 часа = 14400 + 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(): +async def loger() -> None: logger.remove() max_size = '500 MB' info_text = ("{time:YYYY-MM-DD HH:mm:ss} | " @@ -58,14 +140,12 @@ async def loger(): colorize=True, format=info_text, level="INFO", - filter=lambda record: record["level"].name == "INFO", - ) # Добавлен аргумент sink + 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", - ) # Добавлен аргумент sink + filter=lambda record: record["level"].name == "ERROR",) logger.add("start.log", rotation=max_size, format=info_text, @@ -80,21 +160,22 @@ async def loger(): diagnose=True, level="ERROR", filter=lambda record: record["level"].name == "ERROR",) - logger.bind(user="@Console").info("Программа запущена!\n") + logger.bind(user="@Console").info("Программа запущена!") # Основная функция запуска клиента -async def main(): +async def main() -> None: await loger() - if Perm == 1: # Исправлено условие + await photo() + if account.lower() == "user": # Исправлено условие # Создаем клиента с использованием api_id и api_hash - async with Client("user_session", api_id=api_id, api_hash=api_hash, in_memory=True, + 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", bot_token=bot_token) as client: + async with Client("bot_session", api_id=api_id, api_hash=api_hash, bot_token=bot_token) as client: # Запускаем периодическую отправку сообщений await periodic_send(client)