Создание бота по рекламе чатов
This commit is contained in:
155
main.py
155
main.py
@@ -1,51 +1,133 @@
|
|||||||
# main.py
|
|
||||||
# Замена рекламщикам
|
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import sys
|
import sys
|
||||||
from os import getenv
|
from os import getenv
|
||||||
|
import glob
|
||||||
|
from dotenv import load_dotenv
|
||||||
from pyrogram import Client
|
from pyrogram import Client
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
# Сообщение и путь к картинке, которую хотите отправить
|
# Для режима сообщений
|
||||||
image = 'img.png'
|
path_to_photo = "img.png"
|
||||||
message = "<b>Привет! Это тестовое сообщение с картинкой.</b>"
|
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
|
load_dotenv('.env')
|
||||||
api_hash = getenv('API_HASH') # Получите это на https://my.telegram.org
|
api_id: int = int(getenv('API_ID')) # Получите это на https://my.telegram.org
|
||||||
phone_number = getenv('PHONE_NUMBER') # Ваш номер телефона в международном формате
|
api_hash: str = str(getenv('API_HASH')) # Получите это на https://my.telegram.org
|
||||||
password = getenv('PASSWORD') # Если включена двухфакторная аутентификация
|
phone_number: str = str(getenv('PHONE_NUMBER')) # Ваш номер телефона в международном формате
|
||||||
bot_token = getenv('BOT_TOKEN')
|
password: str = str(getenv('PASSWORD')) # Если включена двухфакторная аутентификация
|
||||||
Perm = "bot"
|
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):
|
async def send_inline_request(client) -> None:
|
||||||
# Проходим по каждой группе и отправляем сообщение
|
for group_id, topic_id in group_ids.items():
|
||||||
for group_id in group_ids:
|
|
||||||
try:
|
try:
|
||||||
# Отправка картинки
|
# Получаем инлайн результаты от бота
|
||||||
await client.send_photo(group_id, photo=image, caption=message)
|
inline_results = await client.get_inline_bot_results(bot_username, "Реклама")
|
||||||
logger.bind(user=group_id).info("Сообщение успешно отправлено в группу")
|
|
||||||
|
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:
|
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:
|
while True:
|
||||||
await send_greetings(client)
|
if msg_type.lower() == "inline":
|
||||||
# Ожидание 60 секунд перед отправкой следующего сообщения
|
await send_inline_request(client)
|
||||||
await asyncio.sleep(14400) # 60 секунд = 1 минута, 1 час = 3600 секунд, 4 часа = 14400
|
else:
|
||||||
|
await send_msg(client)
|
||||||
|
print('\n')
|
||||||
|
await asyncio.sleep(time) # Временно 20 секунд, позже измените на 4 часа
|
||||||
|
|
||||||
|
|
||||||
# Функция создания логгеров
|
# Функция создания логгеров
|
||||||
async def loger():
|
async def loger() -> None:
|
||||||
logger.remove()
|
logger.remove()
|
||||||
max_size = '500 MB'
|
max_size = '500 MB'
|
||||||
info_text = ("<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
info_text = ("<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
||||||
@@ -58,14 +140,12 @@ async def loger():
|
|||||||
colorize=True,
|
colorize=True,
|
||||||
format=info_text,
|
format=info_text,
|
||||||
level="INFO",
|
level="INFO",
|
||||||
filter=lambda record: record["level"].name == "INFO",
|
filter=lambda record: record["level"].name == "INFO",)
|
||||||
) # Добавлен аргумент sink
|
|
||||||
logger.add(sys.stderr,
|
logger.add(sys.stderr,
|
||||||
colorize=True,
|
colorize=True,
|
||||||
format=error_text,
|
format=error_text,
|
||||||
level="ERROR",
|
level="ERROR",
|
||||||
filter=lambda record: record["level"].name == "ERROR",
|
filter=lambda record: record["level"].name == "ERROR",)
|
||||||
) # Добавлен аргумент sink
|
|
||||||
logger.add("start.log",
|
logger.add("start.log",
|
||||||
rotation=max_size,
|
rotation=max_size,
|
||||||
format=info_text,
|
format=info_text,
|
||||||
@@ -80,21 +160,22 @@ async def loger():
|
|||||||
diagnose=True,
|
diagnose=True,
|
||||||
level="ERROR",
|
level="ERROR",
|
||||||
filter=lambda record: record["level"].name == "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()
|
await loger()
|
||||||
if Perm == 1: # Исправлено условие
|
await photo()
|
||||||
|
if account.lower() == "user": # Исправлено условие
|
||||||
# Создаем клиента с использованием api_id и api_hash
|
# Создаем клиента с использованием 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:
|
phone_number=phone_number, password=password) as client:
|
||||||
# Запускаем периодическую отправку сообщений
|
# Запускаем периодическую отправку сообщений
|
||||||
await periodic_send(client)
|
await periodic_send(client)
|
||||||
else:
|
else:
|
||||||
# Создаем клиента с использованием api_id, api_hash и bot_token
|
# Создаем клиента с использованием 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)
|
await periodic_send(client)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user