Monolite
This commit is contained in:
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Папки и файлы, которые не нужно добавлять в репозиторий
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
.env
|
||||||
|
.venv/
|
||||||
|
*.log
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.DS_Store
|
||||||
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
10
.idea/TelegramAnonReciever.iml
generated
10
.idea/TelegramAnonReciever.iml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
6
.idea/inspectionProfiles/profiles_settings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
4
.idea/misc.xml
generated
4
.idea/misc.xml
generated
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (TelegramAnonReciever)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/TelegramAnonReciever.iml" filepath="$PROJECT_DIR$/.idea/TelegramAnonReciever.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
44
README.md
Normal file
44
README.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Telegram Anonymous Bot
|
||||||
|
|
||||||
|
Бот для анонимной связи с администрацией чата.
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Бот принимает текстовые сообщения от пользователей и анонимно пересылает их в чат модераторов.
|
||||||
|
|
||||||
|
## Установка
|
||||||
|
|
||||||
|
1. Склонируйте репозиторий:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/ваш_репозиторий.git
|
||||||
|
cd ваш_репозиторий
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Создайте виртуальное окружение:
|
||||||
|
```bash
|
||||||
|
python -m venv venv
|
||||||
|
source venv/bin/activate # Для Linux/MacOS
|
||||||
|
venv\Scripts\activate # Для Windows
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Установите зависимости:
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Создайте файл `.env` в корневой директории и добавьте туда следующие переменные:
|
||||||
|
```
|
||||||
|
BOT_TOKEN=ваш_токен_бота
|
||||||
|
MODERATORS_CHAT_ID=id_чата_модераторов
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Запустите бота:
|
||||||
|
```bash
|
||||||
|
python bot.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Тестирование
|
||||||
|
- Отправьте сообщение боту в личном чате.
|
||||||
|
- Убедитесь, что сообщение анонимно пересылается в чат модераторов.
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
MIT License
|
||||||
100
main.py
100
main.py
@@ -0,0 +1,100 @@
|
|||||||
|
import os
|
||||||
|
import logging
|
||||||
|
from aiogram import Bot, Dispatcher, types
|
||||||
|
from aiogram.utils import executor
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
# Загрузка переменных окружения из файла .env
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# Инициализация бота и диспетчера
|
||||||
|
BOT_TOKEN = os.getenv("BOT_TOKEN")
|
||||||
|
MODERATORS_CHAT_ID = int(os.getenv("MODERATORS_CHAT_ID"))
|
||||||
|
|
||||||
|
bot = Bot(token=BOT_TOKEN)
|
||||||
|
dp = Dispatcher(bot)
|
||||||
|
|
||||||
|
# Настройка логирования
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
# Обработчик команды /start
|
||||||
|
@dp.message_handler(commands=["start"])
|
||||||
|
async def send_welcome(message: types.Message):
|
||||||
|
await message.answer(
|
||||||
|
"Привет! Я анонимный бот для связи с администрацией. "
|
||||||
|
"Просто отправьте мне сообщение, и я передам его администраторам."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Обработчик команды /whereiam (только для групп)
|
||||||
|
@dp.message_handler(commands=["whereiam"], chat_type=[types.ChatType.GROUP, types.ChatType.SUPERGROUP])
|
||||||
|
async def get_group_id(message: types.Message):
|
||||||
|
chat_id = message.chat.id
|
||||||
|
chat_title = message.chat.title or "Беседа без названия"
|
||||||
|
await message.answer(
|
||||||
|
f"ID этой группы: `{chat_id}`\nНазвание: {chat_title}",
|
||||||
|
parse_mode="Markdown"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Обработчик текстовых сообщений
|
||||||
|
@dp.message_handler(content_types=types.ContentTypes.TEXT)
|
||||||
|
async def handle_text_message(message: types.Message):
|
||||||
|
user_id = message.from_user.id
|
||||||
|
user_message = message.text
|
||||||
|
|
||||||
|
# Логирование входящего сообщения
|
||||||
|
logging.info(f"Получено текстовое сообщение от пользователя {user_id}: {user_message}")
|
||||||
|
|
||||||
|
# Пересылка текстового сообщения в чат модераторов
|
||||||
|
try:
|
||||||
|
await bot.send_message(
|
||||||
|
chat_id=MODERATORS_CHAT_ID,
|
||||||
|
text=f"Анонимное текстовое сообщение:\n{user_message}"
|
||||||
|
)
|
||||||
|
await message.answer("Ваше сообщение успешно отправлено администраторам!")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Ошибка при отправке сообщения: {e}")
|
||||||
|
await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.")
|
||||||
|
|
||||||
|
# Обработчик медиа-сообщений (фото, видео, аудио, документы и т.д.)
|
||||||
|
@dp.message_handler(content_types=[
|
||||||
|
types.ContentType.PHOTO,
|
||||||
|
types.ContentType.VIDEO,
|
||||||
|
types.ContentType.AUDIO,
|
||||||
|
types.ContentType.DOCUMENT,
|
||||||
|
types.ContentType.STICKER,
|
||||||
|
types.ContentType.VOICE,
|
||||||
|
types.ContentType.VIDEO_NOTE
|
||||||
|
])
|
||||||
|
async def handle_media_message(message: types.Message):
|
||||||
|
user_id = message.from_user.id
|
||||||
|
content_type = message.content_type
|
||||||
|
|
||||||
|
# Логирование входящего сообщения
|
||||||
|
logging.info(f"Получено медиа-сообщение типа {content_type} от пользователя {user_id}")
|
||||||
|
|
||||||
|
# Пересылка медиа-сообщения в чат модераторов
|
||||||
|
try:
|
||||||
|
if content_type == "photo":
|
||||||
|
# Отправляем самую большую версию фото
|
||||||
|
await bot.send_photo(chat_id=MODERATORS_CHAT_ID, photo=message.photo[-1].file_id)
|
||||||
|
elif content_type == "video":
|
||||||
|
await bot.send_video(chat_id=MODERATORS_CHAT_ID, video=message.video.file_id)
|
||||||
|
elif content_type == "audio":
|
||||||
|
await bot.send_audio(chat_id=MODERATORS_CHAT_ID, audio=message.audio.file_id)
|
||||||
|
elif content_type == "document":
|
||||||
|
await bot.send_document(chat_id=MODERATORS_CHAT_ID, document=message.document.file_id)
|
||||||
|
elif content_type == "sticker":
|
||||||
|
await bot.send_sticker(chat_id=MODERATORS_CHAT_ID, sticker=message.sticker.file_id)
|
||||||
|
elif content_type == "voice":
|
||||||
|
await bot.send_voice(chat_id=MODERATORS_CHAT_ID, voice=message.voice.file_id)
|
||||||
|
elif content_type == "video_note":
|
||||||
|
await bot.send_video_note(chat_id=MODERATORS_CHAT_ID, video_note=message.video_note.file_id)
|
||||||
|
|
||||||
|
await message.answer("Ваше медиа-сообщение успешно отправлено администраторам!")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Ошибка при отправке медиа-сообщения: {e}")
|
||||||
|
await message.answer("Произошла ошибка при отправке сообщения. Попробуйте позже.")
|
||||||
|
|
||||||
|
# Запуск бота
|
||||||
|
if __name__ == "__main__":
|
||||||
|
executor.start_polling(dp, skip_updates=True)
|
||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
aiogram==2.25.1
|
||||||
|
python-dotenv==1.0.0
|
||||||
Reference in New Issue
Block a user