Initial commit: Batch Bot - Telegram Comment Bot

0.0.1
Features:
- Multi-account support via session files
- AI comments generation via Ollama (local LLM)
- Telegram bot for moderation (approve/reject/regenerate)
- Docker support (controller + worker)
- Auto-join public groups
- Comment regeneration on group re-add
- Statistics tracking

Tech stack:
- Python 3.11
- Telethon 1.34 (Telegram user client)
- Aiogram 3.4 (Telegram bot framework)
- SQLite (Database)
- Docker & Docker Compose
- Ollama (Local LLM)
This commit is contained in:
2026-02-24 04:40:07 +03:00
commit a18ad30961
20 changed files with 3431 additions and 0 deletions

58
bot/ollama.py Normal file
View File

@@ -0,0 +1,58 @@
import logging
import asyncio
import aiohttp
from bot.config import OLLAMA_URL, OLLAMA_MODEL, PROMPT_FILE
logger = logging.getLogger('ollama')
def load_prompt() -> str:
"""Загрузка промпта из файла"""
try:
with open(PROMPT_FILE, 'r', encoding='utf-8') as f:
return f.read().strip()
except Exception as e:
logger.error(f"Ошибка при загрузке промпта: {e}")
return "Напиши комментарий к следующему посту:\n\n{text}"
PROMPT_TEMPLATE = load_prompt()
async def generate_comment(text: str, max_retries: int = 3) -> str | None:
"""Генерация комментария с помощью Ollama"""
prompt = PROMPT_TEMPLATE.format(text=text)
for attempt in range(max_retries):
try:
async with aiohttp.ClientSession() as session:
async with session.post(
f"{OLLAMA_URL}/api/generate",
json={
"model": OLLAMA_MODEL,
"prompt": prompt,
"stream": False
},
timeout=aiohttp.ClientTimeout(total=60)
) as response:
response.raise_for_status()
data = await response.json()
comment = data.get('response', '')
# Очистка от тегов
comment = comment.replace('<think>', '').replace('</think>', '').strip()
logger.info(f"Комментарий сгенерирован (попытка {attempt + 1})")
return comment
except aiohttp.ClientError as e:
logger.warning(f"Ошибка подключения к Ollama (попытка {attempt + 1}): {e}")
if attempt < max_retries - 1:
await asyncio.sleep(2 ** attempt) # Exponential backoff
else:
logger.error(f"Не удалось подключиться к Ollama после {max_retries} попыток")
except Exception as e:
logger.error(f"Ошибка при генерации комментария: {e}")
return None
return None