diff --git a/.gitignore b/.gitignore index d90ae67..5f1e21c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ users.db config.py + *.pyc *.pyo *.egg-info diff --git a/app/debug_kb.py b/app/debug_kb.py new file mode 100644 index 0000000..da7baab --- /dev/null +++ b/app/debug_kb.py @@ -0,0 +1 @@ +# пока что пустой, но в дальнейшем может быть использован \ No newline at end of file diff --git a/app/handliers_test.py b/app/handliers_test.py new file mode 100644 index 0000000..d1a1025 --- /dev/null +++ b/app/handliers_test.py @@ -0,0 +1,44 @@ +"""на данный момент не работает, но а дальнейшем будет использован""" + + +# import asyncio +# from aiogram import F, Router +# from aiogram.filters import CommandStart, Command, CommandObject +# from aiogram.types import Message, CallbackQuery +# from aiogram.enums import ParseMode +# import app.keyboard as kb +# import app.debug_kb as debug_kb +# import sqlite3 +# from random import randint +# router = Router() + +# @router.message(CommandStart()) +# async def cmd_start(message: Message): +# base = sqlite3.connect('users.db') + +# cur = base.cursor() + +# insert_user = """INSERT OR IGNORE INTO users (first_name, last_name, username, id, is_bot, is_premium) +# VALUES (?, ?, ?, ?, ?, ?)""" + +# val = (message.from_user.first_name, message.from_user.last_name, message.from_user.username, +# message.from_user.id, message.from_user.is_bot, message.from_user.is_premium) + +# cur.execute(insert_user, val) + +# cur.execute("SELECT * FROM users") +# print(cur.fetchall()) +# base.commit() + +# base.close() + +# await message.answer("тестовый ответ") + +# @router.message(Command("share")) +# async def share_start(message: Message): +# pass + +# @router.message(Command("echo")) +# async def echo(message: Message): +# """Повторяет сообщение пользователя.""" +# await message.reply(message.text) \ No newline at end of file diff --git a/app/share_2.py b/app/share_2.py new file mode 100644 index 0000000..395431c --- /dev/null +++ b/app/share_2.py @@ -0,0 +1,197 @@ +import asyncio +from aiogram import F, Router, Bot +from aiogram.filters import CommandStart, Command, CommandObject +from aiogram.types import ContentType +from aiogram.types import Message, CallbackQuery +from aiogram.types import ReplyKeyboardRemove +from aiogram.types import InputMediaPhoto, InputMediaVideo, InputMediaDocument +from aiogram.enums import ParseMode +from aiogram.fsm.state import State, StatesGroup +from aiogram.fsm.context import FSMContext +import app.share_kb as share_kb +import sqlite3 +import re +from random import randint +from config import ADMIN_ID, TOKEN + +share_router = Router() + +TARGET_USER_ID = 7320951369 + +# Определяем состояния +class ForwardMessage(StatesGroup): + waiting_for_message = State() + share_begin = State() + share_msg = State() + +async def send_media(bot: Bot, chat_id: int, message: Message): + """Функция для точной пересылки сообщения без изменений""" + if message.photo: + await bot.send_photo( + chat_id=chat_id, + photo=message.photo[-1].file_id, + caption=message.caption + ) + elif message.video: + await bot.send_video( + chat_id=chat_id, + video=message.video.file_id, + caption=message.caption + ) + elif message.document: + await bot.send_document( + chat_id=chat_id, + document=message.document.file_id, + caption=message.caption + ) + elif message.text: + await bot.send_message( + chat_id=chat_id, + text=message.text + ) + + +@share_router.message(Command("share")) +async def command_mid_handler(message: Message, state: FSMContext) -> None: + if message.from_user.id == ADMIN_ID: + await state.set_state(ForwardMessage.waiting_for_message) + # Сохраняем сообщение в state + await message.answer("Теперь отправьте сообщение, которое хотите переслать.") + else: + await message.answer("вы не являетесь администратором") + +@share_router.message(ForwardMessage.waiting_for_message) +async def process_message_to_forward(message: Message, state: FSMContext, bot: Bot): + """Обработчик для пересылки сообщений + """ + await state.update_data(original_message=message) + try: + with sqlite3.connect('users.db') as base: + cur = base.cursor() + cur.execute("SELECT id FROM users") + + for user_id, in cur.fetchall(): + await send_media(bot, user_id, message) + print(user_id, "получил пересылку") + + await message.answer("✅ Сообщение переслано всем пользователям") + + finally: + await state.clear() + +# @share_router.message(ForwardMessage.waiting_for_message) +# async def process_message_to_forward(message: Message, state: FSMContext, bot: Bot) -> None: +# """ +# Обработчик для точной пересылки сообщения +# """ +# await state.update_data(original_message=message) # Сохраняем сообщение в state +# data = await state.get_data() +# message_to_forward = data.get("original_message") + +# if message_to_forward is None: +# await message.answer("Не удалось найти сообщение для пересылки.") +# await state.clear() +# return + +# with sqlite3.connect('users.db') as base: +# cur = base.cursor() +# cur.execute("SELECT id FROM users") +# users_id = cur.fetchall() + +# for user_id, in users_id: +# await send_media( +# bot=bot, +# chat_id=user_id, +# message=message_to_forward +# ) +# await asyncio.sleep(0.1) + +# await message.answer("Сообщение переслано всем пользователям") +# await state.clear() + + + + + + + + + + + + + + + + + + + + + + + + + +# @share_router.message(Command('share')) +# async def command_start_handler(message: Message, state: FSMContext) -> None: +# await message.answer( +# "Привет! Я бот для пересылки сообщений. Отправь мне любое сообщение " +# "(текст, фото, видео, документ и т.д.), и я смогу его переслать.\n\n" +# "После того, как ты отправишь мне сообщение, я попрошу тебя указать ID чата, куда его переслать." +# ) +# await state.set_state(ForwardStates.waiting_for_message) + +# @share_router.message(ForwardStates.waiting_for_message) +# async def process_message_to_forward(message: Message, state: FSMContext) -> None: +# await state.update_data( +# original_message_id=message.message_id, +# original_chat_id=message.chat.id +# ) +# await message.answer( +# "Отлично! Теперь отправь мне ID чата (или username группы/канала), куда нужно переслать это сообщение. " +# "Для пересылки в личный чат, можешь использовать свой ID." +# ) +# await state.set_state(ForwardStates.waiting_for_target_chat) + +# @share_router.message(ForwardStates.waiting_for_target_chat) +# async def forward_the_message(message: Message, state: FSMContext, bot: Bot) -> None: +# data = await state.get_data() +# original_message_id = data.get('original_message_id') +# original_chat_id = data.get('original_chat_id') +# target_chat_id = message.text + +# if not original_message_id or not original_chat_id: +# await message.answer("Произошла ошибка: не удалось найти исходное сообщение для пересылки. Пожалуйста, начни сначала (/start).") +# await state.clear() +# return + +# try: +# await bot.copy_message( +# chat_id=target_chat_id, +# from_chat_id=original_chat_id, +# message_id=original_message_id +# ) + +# escaped_target_chat_id = escape_markdown_v2(target_chat_id) + +# await message.answer( +# f"Сообщение успешно переслано в чат с ID: {escaped_target_chat_id}.", +# parse_mode=ParseMode.MARKDOWN_V2 +# ) +# except Exception as e: +# escaped_error_message = escape_markdown_v2(str(e)) +# await message.answer( +# f"Не удалось переслать сообщение\\. Возможно, указан неверный ID чата, или у бота нет прав для отправки сообщений в этот чат\\. Ошибка: {escaped_error_message}`", +# parse_mode=ParseMode.MARKDOWN_V2 +# ) +# finally: +# await state.clear() + +# @share_router.message() +# async def echo_handler(message: Message) -> None: +# if message.text: +# await message.answer( +# "Я получил твое сообщение, но сейчас я жду команду или ID чата. " +# "Если хочешь начать пересылку, используй /start." +# ) diff --git a/app/share_kb.py b/app/share_kb.py new file mode 100644 index 0000000..2f7ab0c --- /dev/null +++ b/app/share_kb.py @@ -0,0 +1,19 @@ +from aiogram.types import ( + ReplyKeyboardMarkup, + KeyboardButton, + InlineKeyboardButton, + InlineKeyboardMarkup, + ReplyKeyboardRemove +) +from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder +from aiogram.filters.callback_data import CallbackData + +share_starting = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text='да✅', callback_data='share_starting'), + InlineKeyboardButton(text='нет❌', callback_data='share_cancel')] +], resize_keyboard=True, input_field_placeholder='выберите действие') + +share_send = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text='да✅', callback_data='share_starting_send'), + InlineKeyboardButton(text='нет❌', callback_data='share_cancel')] +], resize_keyboard=True, input_field_placeholder='выберите действие') diff --git a/config.py b/config.py index 3aec734..257e991 100644 --- a/config.py +++ b/config.py @@ -1 +1,2 @@ -TOKEN='' \ No newline at end of file +TOKEN='' +ADMIN=123456789 \ No newline at end of file