Начало:
1. Подготовка ботов
- Открой @BotFather
- /newbot → создай двух (или больше) ботов.
- Примеры имён: @researcher_bot, @analyst_bot
- Сохрани токены обоих ботов.
2. Включи Bot-to-Bot режим (обязательно!)
- Напиши @BotFather → /mybots
- Выбери бота → Bot Settings (откроется Mini App)
- Найди Bot-to-Bot Communication → включи On
- Повтори для каждого бота, который будет общаться.
Без этого боты не смогут отправлять/получать сообщения друг другу.
3. Простой пример на aiogram 3.x (рекомендуется)
bash
pip install aiogram[fast] python-dotenv
Структура проекта:
bot_to_bot/
├── .env
├── main_researcher.py
├── main_analyst.py
└── config.py
.env
env
RESEARCHER_TOKEN=123456:ABC...
ANALYST_TOKEN=654321:XYZ...
RESEARCHER_USERNAME=@researcher_bot
ANALYST_USERNAME=@analyst_bot
config.py
python
from dotenv import load_dotenv
import os
load_dotenv()
RESEARCHER_TOKEN = os.getenv("RESEARCHER_TOKEN")
ANALYST_TOKEN = os.getenv("ANALYST_TOKEN")
RESEARCHER_USERNAME = os.getenv("RESEARCHER_USERNAME")
ANALYST_USERNAME = os.getenv("ANALYST_USERNAME")
Бот 1 — Researcher (исследователь)
python
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
import asyncio
import json
from config import RESEARCHER_TOKEN, ANALYST_USERNAME
bot = Bot(token=RESEARCHER_TOKEN, parse_mode="HTML")
dp = Dispatcher()
@dp.message(Command("start"))
async def start(message: types.Message):
await message.answer("👋 Я Researcher. Запускаю поиск...")
@dp.message()
async def handle_message(message: types.Message):
if message.from_user.is_bot: # Сообщение от другого бота
print(f"Получил от бота: {message.text}")
# Можно обработать данные
# Пример: отправляем задание аналитику
if "анализируй" in message.text.lower():
data = {
"task": "Анализ тренда",
"query": message.text,
"timestamp": str(asyncio.get_event_loop().time())
}
await bot.send_message(
chat_id=ANALYST_USERNAME,
text=f"📊 Новое задание:\n{json.dumps(data, ensure_ascii=False, indent=2)}"
)
await message.answer("✅ Задание отправлено аналитику!")
async def main():
print("Researcher бот запущен...")
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Бот 2 — Analyst (аналитик)
python
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
import asyncio
import json
from config import ANALYST_TOKEN, RESEARCHER_USERNAME
bot = Bot(token=ANALYST_TOKEN, parse_mode="HTML")
dp = Dispatcher()
@dp.message()
async def handle_all(message: types.Message):
if message.from_user.is_bot: # Сообщение пришло от другого бота
try:
data = json.loads(message.text.split(":\n", 1)[-1])
print("Получил данные от Researcher:", data)
# Симулируем анализ
result = f"✅ Анализ завершён!\nТренд: {data['query']}\nРекомендация: Запустить контент-план"
await bot.send_message(
chat_id=RESEARCHER_USERNAME,
text=result,
reply_to_message_id=message.message_id
)
except:
await bot.send_message(
chat_id=RESEARCHER_USERNAME,
text="Получил сообщение, но не смог распарсить JSON"
)
async def main():
print("Analyst бот запущен...")
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
4. Как запустить
Открой два терминала и запусти оба бота одновременно:
bash
python main_researcher.py
python main_analyst.py
Напиши любому из ботов: анализируй ИИ в 2026 — и посмотри, как они общаются между собой.
Важные моменты и лучшие практики
- Защита от циклов — всегда проверяй message.from_user.is_bot и добавляй условия.
- Rate limits — Telegram строго лимитирует сообщения (30 в секунду разным чатам).
- JSON — удобный формат для передачи структурированных данных.
- reply_to_message_id — помогает создавать понятные цепочки.
- Long polling / Webhook — оба работают. Для продакшена лучше webhook.
- Можно использовать LangGraph, CrewAI или AutoGen внутри обработчиков.
Начало:
#TelegramBots #BotToBot #aiogram #АвтономныеАгенты #PythonAI