186 lines
8.5 KiB
Python
186 lines
8.5 KiB
Python
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 = ("<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
||
"<blue>PRIMO-Message</blue> <red>|</red> "
|
||
"<red>{extra[user]} |</red> <level>{message}</level>")
|
||
error_text = ("<level>{time:YYYY-MM-DD HH:mm:ss} | "
|
||
"<bold>PRIMO-ERROR</bold> | "
|
||
"{extra[user]} | {message}</level>")
|
||
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())
|