Создание бота по рекламе чатов

This commit is contained in:
Verum
2025-03-02 15:47:53 +07:00
parent 71f7c21617
commit 8b4ba59c6e

155
main.py
View File

@@ -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 = "<b>Привет! Это тестовое сообщение с картинкой.</b>"
# Для режима сообщений
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 = ("<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
@@ -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)