Files
ReklamaWorldBot/main.py

190 lines
8.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
# Для режима сообщений
path_to_photo = "image.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, ACCOUNT, TYPE_MSG")
async def photo(file: str = path_to_photo) -> str:
# Находим все файлы, которые соответствуют шаблону
files = glob.glob(file)
# Проверяем, найдены ли файлы
if files:
# Получаем первый найденный файл
path_to_photo1 = files[0]
logger.bind(user="@Console").info(f"Выбранный файл: {path_to_photo1}\n")
return path_to_photo1
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)
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())