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)