Fix asyncio import in qwen_oauth and other improvements

This commit is contained in:
Vladimir 2026-03-06 19:38:09 +08:00
parent f114d874ff
commit 7b3d7375e6
3 changed files with 47 additions and 15 deletions

16
bot.py
View File

@ -964,17 +964,13 @@ async def handle_local_session_input(update: Update, text: str, session: LocalSe
cleaned_output = clean_ansi_codes(session.output_buffer) cleaned_output = clean_ansi_codes(session.output_buffer)
cleaned_output = normalize_output(cleaned_output) cleaned_output = normalize_output(cleaned_output)
# Форматируем длинный вывод: первые 5 и последние 10 строк # Формируем полный вывод БЕЗ обрезки — send_long_message сам разобьёт
formatted_output = format_long_output(cleaned_output.strip(), max_lines=15, head_lines=5, tail_lines=10) full_output = f"✅ *Результат:*\n\n" \
if len(formatted_output) > 4000: f"```\n{session.command}\n```\n\n" \
formatted_output = formatted_output[:4000] + "\n... (вывод обрезан)" f"```\n{cleaned_output.strip()}\n```"
await update.message.reply_text( # Отправляем длинный вывод с разбивкой на сообщения
f"✅ *Результат:*\n\n" await send_long_message(update, full_output, parse_mode="Markdown")
f"```\n{session.command}\n```\n\n"
f"```\n{formatted_output}\n```",
parse_mode="Markdown"
)
local_session_manager.close_session(user_id) local_session_manager.close_session(user_id)
except Exception as e: except Exception as e:

View File

@ -14,6 +14,25 @@ MAX_MESSAGE_LENGTH = 4096 # Максимальная длина сообщен
RESERVED_FOR_HEADER = 20 # Резервируем место для "(N/N) " RESERVED_FOR_HEADER = 20 # Резервируем место для "(N/N) "
def escape_code_block_content(text: str) -> str:
"""
Экранировать спецсимволы Markdown внутри блоков кода.
Нужно для случаев когда сообщение содержит ```блок кода``` и текст с Markdown.
Telegram пытается интерпретировать [text](url) внутри блока кода как ссылку.
"""
# Находим все блоки кода
parts = text.split("```")
result_parts = []
for i, part in enumerate(parts):
if i % 2 == 1:
# Внутри блока кода — экранируем [ и ]
part = part.replace('[', '\\[').replace(']', '\\]')
result_parts.append(part)
return "```".join(result_parts)
def escape_markdown(text: str) -> str: def escape_markdown(text: str) -> str:
""" """
Экранирование специальных символов Markdown для Telegram API. Экранирование специальных символов Markdown для Telegram API.
@ -227,16 +246,32 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p
# Начинаем с указанного сообщения # Начинаем с указанного сообщения
for i in range(start_from, total): for i in range(start_from, total):
part, has_code, code_opened, code_closed = parts[i] part, has_code, code_opened, code_closed = parts[i]
# Определяем parse_mode для этого сообщения # Проверяем был ли блок кода открыт в предыдущем сообщении
prev_closed = parts[i-1][3] if i > 0 else True prev_closed = parts[i-1][3] if i > 0 else True
# Определяем находимся ли внутри блока кода (между ``` и ```)
in_code_block = not prev_closed or (code_opened and not code_closed) in_code_block = not prev_closed or (code_opened and not code_closed)
actual_parse_mode = parse_mode if parse_mode and (has_code or in_code_block) else None
# Проверяем будем ли добавлять ``` к этому сообщению
will_add_opening = total > 1 and i > 0 and not prev_closed and not code_closed
will_add_closing = total > 1 and i < total - 1 and not code_closed
# КЛЮЧЕВОЕ ИСПРАВЛЕНИЕ:
# Отключаем parse_mode если:
# 1. Это промежуточная часть блока кода (in_code_block=True, но нет ``` в этом сообщении)
# 2. Это сообщение содержит ``` (has_code=True)
# 3. Мы добавляем искусственные ``` (will_add_opening или will_add_closing)
if in_code_block or has_code or will_add_opening or will_add_closing:
actual_parse_mode = None
else:
# Обычный текст без блоков кода — используем Markdown
actual_parse_mode = parse_mode
# Логика работы с блоками кода между сообщениями # Логика работы с блоками кода между сообщениями
if total > 1 and i > 0 and not prev_closed: if total > 1 and i > 0 and not prev_closed:
part = "```\n" + part part = "```\n" + part
if total > 1 and i < total - 1 and not code_closed: if total > 1 and i < total - 1 and not code_closed:
part = part + "\n```" part = part + "\n```"

View File

@ -4,6 +4,7 @@ Qwen OAuth 2.0 Device Flow клиент.
Реализует авторизацию через Device Authorization Grant (RFC 8628). Реализует авторизацию через Device Authorization Grant (RFC 8628).
""" """
import asyncio
import os import os
import json import json
import hashlib import hashlib