/
rhombe
/
telegram
Обзор
Документация
Войти
/
rhombe
/
telegram
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
bot1.py
151 строка
8 KB
rhombe
Первый коммит
17 ноя 2025, 10:08
17 ноя 2025, 10:08
93e3b15
Код
Авторство
О чём код?
import asyncio import logging import random from aiogram import Bot, Dispatcher, types from apscheduler.schedulers.asyncio import AsyncIOScheduler from datetime import datetime, timedelta from gigachat import GigaChat logging.basicConfig(level=logging.INFO) BOT_TOKEN = "8518030150:AAGM9CM6ycJyBevHJ5ZasNTOxlZfhypkIa8" # Вставь сюда Authorization Key (ключ, который ты получил в личном кабинете, # выглядит как base64-строка). НЕ публикуй этот ключ где попало. GIGA_CREDENTIALS = "MDE5YTgzNjEtN2EzYS03MTg0LWJhY2EtZDI1NmY0ZDU4OWRlOjVkN2I3YjYzLThhYzUtNDU4NC05YTIyLTYxMjY4NTU0OGYxZQ==" # По умолчанию версия для физлиц; не трогай, если использовал personal scope GIGA_SCOPE = "GIGACHAT_API_PERS" SON_ID = 1732841965 # тестируем с собой PARENT_ID = 1732841965 MIN_QUESTIONS = 6 MAX_QUESTIONS = 10 dp = Dispatcher() bot = Bot(BOT_TOKEN, parse_mode="HTML") active_sessions = {} first_questions_pool = [ "Ну как день с тебя начался — чувствуется живое что-то?", "С какой мыслью сегодня проснулся?", "На что ставишь сегодня ставку — прокрастинация или подвиг?", "Был ли уже повод докопаться самому до чего-то, кроме домашки?", "Какой момент уже бесил или веселил за этот день?", "Ждёшь чего-то особенного или просто держишься?" ] def get_first_question(session): previous = session.get("last_first_question") variants = [q for q in first_questions_pool if q != previous] question = random.choice(variants) if variants else random.choice(first_questions_pool) session["last_first_question"] = question return question def get_ai_reaction_and_question(dialogue_history, last_user_message): giga = GigaChat(credentials=GIGA_CREDENTIALS, scope=GIGA_SCOPE, verify_ssl_certs=False) prompt = ( "Ты — настоящий батя лет 45-50, жизнью битый, с иронией и любовью докапываешься до сына. " "Учителем быть не хочешь, нравоучения не любишь, свой стиль — подкалываешь, но слушаешь и реально вникаешь в то, что пишет сын.\n" "Сначала обязательно обратись к его ответу: прокомментируй не по-детски, а как взрослый мужик, можешь докопаться, пошутить осмысленно, поддержать, но никогда не говори банальности или 'считай расстояния до булок'.\n" "Если ответ сухой — добавь иронии, если ответ содержательный — докопайся, зацепись за детали, расскажи свою точку зрения или ситуацию, как взрослый друг.\n" "Дальше — придумай новый вопрос: он может быть глубже, может чуть провокационный, может про жизнь, про быт, про настоящие ситуации и отношения — только не учительский, не детский и не приторный.\n" "Пиши строго так (в одну строку, без приветствий):\nКомментарий бати ||| Новый вопрос\n" "Вот предыдущий диалог:\n" f"{dialogue_history}\n" f"Последний ответ сына: '{last_user_message}'." ) response = giga.chat(prompt) try: text = response.choices[0].message.content.strip() except Exception: text = str(response) if "|||" in text: reaction, question = [s.strip() for s in text.split("|||", 1)] return reaction, question else: return None, text def get_ai_summary(dialogue_history): giga = GigaChat(credentials=GIGA_CREDENTIALS, scope=GIGA_SCOPE, verify_ssl_certs=False) prompt = ( "Ты — взрослый батя, подведи итог дня так, как делаешь это для себя — без пафоса, честно, со скрытым юмором и мужским взглядом. " "Главное — итог должен показать характер сына, реальное настроение и пару твоих жизненных выводов, без занудства и морали.\n" "Диалог:\n" f"{dialogue_history}" ) response = giga.chat(prompt) try: return response.choices[0].message.content.strip() except Exception: return str(response) def should_finish(session): msgs = session.get("messages", []) info_msgs = [ m for i, m in enumerate(msgs) if i % 2 == 1 and not any(x in m.lower() for x in ["ладно", "ничего", "не хочу", "не знаю", "никак", "по лайту", "средне", "угу", "ага"]) ] return len(msgs) // 2 >= MIN_QUESTIONS and len(info_msgs) >= 2 or len(msgs) // 2 >= MAX_QUESTIONS def format_history(session): out = [] msgs = session.get("messages", []) for i, m in enumerate(msgs): out.append(f"Сын: {m}" if i % 2 == 0 else f"Батя: {m}") return "\n".join(out) @dp.message() async def handle_message(message: types.Message): user_id = message.from_user.id if user_id != SON_ID: return session = active_sessions.setdefault(user_id, {"messages": [], "last_first_question": None}) if not session["messages"]: session["messages"].append(message.text.strip()) dialogue_history = format_history(session) _, first_ai_question = get_ai_reaction_and_question(dialogue_history, message.text.strip()) session["messages"].append(first_ai_question) await bot.send_message(SON_ID, first_ai_question) return last_user_message = message.text.strip() session["messages"].append(last_user_message) if should_finish(session): dialogue_history = format_history(session) summary = get_ai_summary(dialogue_history) await bot.send_message(SON_ID, "Ну всё, сын, разузнал всё, что можно. Пошёл пить чай и смотреть за твоими успехами!") await bot.send_message(PARENT_ID, summary) del active_sessions[user_id] else: dialogue_history = format_history(session) reaction, question = get_ai_reaction_and_question(dialogue_history, last_user_message) if reaction: await bot.send_message(SON_ID, reaction) await asyncio.sleep(random.uniform(0.7, 1.7)) await bot.send_message(SON_ID, question) session["messages"].append(question) async def start_conversation(): print("Запуск первого вопроса!") # Должен появиться после старта session = active_sessions.setdefault(SON_ID, {"messages": [], "last_first_question": None}) session["messages"] = [] q = get_first_question(session) session["messages"].append(q) await bot.send_message(SON_ID, q) async def main(): print("СТАРТУЮ scheduler и polling (новый event loop)") scheduler = AsyncIOScheduler() scheduler.add_job(start_conversation, 'date', run_date=datetime.now() + timedelta(seconds=1)) scheduler.start() await dp.start_polling(bot) if __name__ == "__main__": print("Запуск главного блока — сейчас стартует бот") asyncio.run(main())