Создание бота по рекламе чатов
This commit is contained in:
155
main.py
155
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 = "<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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user