init commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.venv/
|
||||||
|
.env
|
||||||
|
.history
|
||||||
10
Dockerfile
Normal file
10
Dockerfile
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
CMD ["python", "main.py"]
|
||||||
71
README.MD
Normal file
71
README.MD
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
# MULTIBOT — Многобот на aiogram v3
|
||||||
|
|
||||||
|
Минималистичное Python-приложение, которое позволяет запускать **несколько Telegram-ботов** из одного кода. Каждый бот обрабатывает сообщения одинаково: отвечает пользователю, повторяя его сообщение с подписью.
|
||||||
|
|
||||||
|
## 📦 Стек
|
||||||
|
|
||||||
|
- Python 3.11+
|
||||||
|
- aiogram v3
|
||||||
|
- python-dotenv
|
||||||
|
- Docker / Docker Compose (опционально)
|
||||||
|
|
||||||
|
## 🔧 Возможности
|
||||||
|
|
||||||
|
- Единый код для всех ботов
|
||||||
|
- Добавление новых ботов — просто добавьте токен в `.env`
|
||||||
|
- Поддержка `.env` и Docker
|
||||||
|
- Ответ пользователю:
|
||||||
|
_«Это бот `{username}`, вы написали "{message}"»_
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Быстрый запуск
|
||||||
|
|
||||||
|
|
||||||
|
## Пре-подготовка
|
||||||
|
### Установка Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||||
|
sudo sh get-docker.sh
|
||||||
|
```
|
||||||
|
Добавление пользователя в группу docker, чтобы не использовать sudo при работе с ним
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
Или установимся вот так:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install docker.io docker-compose-v2
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка и запуск
|
||||||
|
|
||||||
|
### 1. клонируем репозиторий
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/Artemyev/multibot.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Правим `.env`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
>> cp .env.sample .env
|
||||||
|
>> nano .env # или любой другой текстовый редактор
|
||||||
|
> BOT_TOKENS=TTOKEN1,TOKEN2,TOKEN3
|
||||||
|
```
|
||||||
|
сохряем и выходим
|
||||||
|
|
||||||
|
### 3. Запускаем
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Проверяем
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps
|
||||||
|
```
|
||||||
8
docker-compose.yml
Normal file
8
docker-compose.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
multibot:
|
||||||
|
build: .
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: unless-stopped
|
||||||
1
env.sample
Normal file
1
env.sample
Normal file
@@ -0,0 +1 @@
|
|||||||
|
BOT_TOKENS=список токенов через запятую
|
||||||
30
main.py
Normal file
30
main.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import asyncio
|
||||||
|
import os
|
||||||
|
from aiogram import Bot, Dispatcher, F
|
||||||
|
from aiogram.types import Message
|
||||||
|
from aiogram.enums import ParseMode
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
from aiogram.client.default import DefaultBotProperties
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
BOT_TOKENS = os.getenv("BOT_TOKENS", "").split(",")
|
||||||
|
|
||||||
|
async def send_echo_message(message: Message, bot: Bot):
|
||||||
|
me = await bot.get_me()
|
||||||
|
await message.answer(f"Это бот {me.username}, вы написали \"{message.text}\"")
|
||||||
|
|
||||||
|
async def start_bot(token: str):
|
||||||
|
bot = Bot(
|
||||||
|
token,
|
||||||
|
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
|
||||||
|
)
|
||||||
|
dp = Dispatcher()
|
||||||
|
dp.message.register(send_echo_message, F.text)
|
||||||
|
await dp.start_polling(bot)
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
await asyncio.gather(*(start_bot(token) for token in BOT_TOKENS if token))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main())
|
||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
aiogram==3.*
|
||||||
|
python-dotenv==1.0.0
|
||||||
Reference in New Issue
Block a user