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())