Добавлена функция escape_markdown для экранирования специальных символов Markdown перед отправкой сообщений в Telegram. Обновлены обработчики успешной оплаты для использования этой функции, что улучшает форматирование отчетов. Также добавлено детальное логирование для отладки, что поможет в выявлении ошибок при отправке сообщений.

This commit is contained in:
Vlad 2025-06-01 23:00:26 +03:00
parent 74c37930fe
commit 991f1d74b1

99
main.py
View File

@ -78,11 +78,31 @@ def parse_location(location_str: str) -> str:
return location_str
def escape_markdown(text: str) -> str:
"""
Экранирует специальные символы Markdown для безопасной отправки в Telegram
"""
if not text:
return ""
# Символы которые нужно экранировать для Markdown
escape_chars = ['*', '_', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
escaped_text = str(text)
for char in escape_chars:
escaped_text = escaped_text.replace(char, f'\\{char}')
return escaped_text
if getenv("DEBUG",'0') == '1':
logging.basicConfig(level=logging.INFO)
else:
logging.basicConfig(level=logging.WARNING)
# Временно включаем детальное логирование для отладки
logging.getLogger().setLevel(logging.INFO)
TOKEN = getenv("BOT_TOKEN")
BOTNAME = getenv("BOT_NAME")
@ -482,7 +502,8 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
report += "---\n"
report += f"📋 **VIN:** {vin}\n"
report += f"💰 **Transaction ID:** {message.successful_payment.telegram_payment_charge_id}"
report += f"💰 **Transaction ID:** {escape_markdown(message.successful_payment.telegram_payment_charge_id)}\n"
report += "⚠️ **This report shows salvage/damage history. Please consult with automotive experts for vehicle evaluation.**"
# Create keyboard with action buttons
builder = InlineKeyboardBuilder()
@ -490,7 +511,17 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
builder.button(text="Back to Main Menu", callback_data="main_menu")
builder.adjust(2) # Two buttons on one row
logging.info("Attempting to send message with Markdown...")
try:
await message.answer(report, reply_markup=builder.as_markup(), parse_mode="Markdown")
logging.info("Message sent successfully!")
except Exception as markdown_error:
logging.error(f"Markdown parsing failed: {markdown_error}")
logging.info("Attempting to send without Markdown...")
# Удаляем markdown символы и отправляем как обычный текст
plain_report = report.replace("**", "").replace("*", "")
await message.answer(plain_report, reply_markup=builder.as_markup())
logging.info("Plain text message sent successfully!")
else:
# No detailed information found - refund the payment
try:
@ -538,78 +569,116 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
vin = payload.split(":")[1]
try:
logging.info(f"=== DETAILED SALVAGE CHECK DEBUG START for VIN: {vin} ===")
# Получаем детальную информацию о salvage записях
salvage_records = await database.fetch_salvage_detailed_info(vin)
logging.info(f"Salvage records count: {len(salvage_records) if salvage_records else 0}")
if salvage_records:
# Логируем первую запись для отладки
if len(salvage_records) > 0:
logging.info(f"First record data: {salvage_records[0]}")
# Получаем базовую информацию о VIN для заголовка
make, model, year, cnt = await database.fetch_vin_info(vin)
logging.info(f"VIN info: make={make}, model={model}, year={year}, cnt={cnt}")
report = f"🚗 **{year} {make} {model}**\n"
report += f"📋 **VIN:** {vin}\n\n"
report += f"📋 **VIN:** {escape_markdown(vin)}\n\n"
report += f"🔍 **DETAILED SALVAGE HISTORY REPORT**\n"
report += f"📊 **Total Records Found:** {len(salvage_records)}\n\n"
logging.info(f"Report header created, length: {len(report)}")
# Добавляем информацию по каждой записи
for idx, record in enumerate(salvage_records[:5], 1): # Показываем максимум 5 записей
report += f"📋 **Record #{idx}**\n"
logging.info(f"Processing record #{idx}: {record}")
record_text = f"📋 **Record #{idx}**\n"
# Дата продажи с красивым форматированием
if record['sale_date']:
formatted_date = format_sale_date(record['sale_date'])
report += f"📅 **Sale Date:** {formatted_date}\n"
logging.info(f"Formatted date: {formatted_date}")
record_text += f"📅 **Sale Date:** {formatted_date}\n"
# Основное повреждение
if record['dem1']:
report += f"⚠️ **Primary Damage:** {record['dem1']}\n"
logging.info(f"Primary damage: {record['dem1']}")
record_text += f"⚠️ **Primary Damage:** {escape_markdown(record['dem1'])}\n"
# Вторичное повреждение
if record['dem2']:
report += f"⚠️ **Secondary Damage:** {record['dem2']}\n"
logging.info(f"Secondary damage: {record['dem2']}")
record_text += f"⚠️ **Secondary Damage:** {escape_markdown(record['dem2'])}\n"
# Одометр
if record['odo']:
try:
odo_value = int(record['odo']) if record['odo'] else 0
odo_status = f" ({record['odos']})" if record['odos'] else ""
report += f"🛣️ **Odometer:** {odo_value:,} miles{odo_status}\n"
logging.info(f"Odometer: {odo_value}, status: {record['odos']}")
record_text += f"🛣️ **Odometer:** {odo_value:,} miles{odo_status}\n"
except (ValueError, TypeError):
report += f"🛣️ **Odometer:** {record['odo']}\n"
logging.info(f"Odometer parsing error for: {record['odo']}")
record_text += f"🛣️ **Odometer:** {record['odo']}\n"
# Стоимость ремонта
if record['j_rep_cost']:
try:
repair_cost = float(record['j_rep_cost']) if record['j_rep_cost'] else 0
if repair_cost > 0:
report += f"💰 **Repair Cost:** ${repair_cost:,.2f}\n"
logging.info(f"Repair cost: {repair_cost}")
record_text += f"💰 **Repair Cost:** ${repair_cost:,.2f}\n"
except (ValueError, TypeError):
report += f"💰 **Repair Cost:** ${record['j_rep_cost']}\n"
logging.info(f"Repair cost parsing error for: {record['j_rep_cost']}")
record_text += f"💰 **Repair Cost:** {record['j_rep_cost']}\n"
# Состояние двигателя/движения
if record['j_runs_drive']:
report += f"🔧 **Engine Status:** {record['j_runs_drive']}\n"
logging.info(f"Engine status: {record['j_runs_drive']}")
record_text += f"🔧 **Engine Status:** {escape_markdown(record['j_runs_drive'])}\n"
# Локация с конвертированными штатами
if record['j_locate']:
formatted_location = parse_location(record['j_locate'])
report += f"📍 **Sale Location:** {formatted_location}\n"
logging.info(f"Location: {record['j_locate']} -> {formatted_location}")
record_text += f"📍 **Sale Location:** {formatted_location}\n"
report += "\n"
record_text += "\n"
report += record_text
logging.info(f"Record #{idx} text length: {len(record_text)}")
if len(salvage_records) > 5:
report += f"📋 **... and {len(salvage_records) - 5} more records**\n\n"
report += "---\n"
report += f"💰 **Transaction ID:** {message.successful_payment.telegram_payment_charge_id}\n"
report += f"💰 **Transaction ID:** {escape_markdown(message.successful_payment.telegram_payment_charge_id)}\n"
report += "⚠️ **This report shows salvage/damage history. Please consult with automotive experts for vehicle evaluation.**"
logging.info(f"Final report length: {len(report)}")
logging.info("=== REPORT CONTENT START ===")
logging.info(report)
logging.info("=== REPORT CONTENT END ===")
# Создаем клавиатуру
builder = InlineKeyboardBuilder()
builder.button(text="Try another VIN", callback_data="check_vin")
builder.button(text="Back to Main Menu", callback_data="main_menu")
builder.adjust(2)
logging.info("Attempting to send message with Markdown...")
try:
await message.answer(report, reply_markup=builder.as_markup(), parse_mode="Markdown")
logging.info("Message sent successfully!")
except Exception as markdown_error:
logging.error(f"Markdown parsing failed: {markdown_error}")
logging.info("Attempting to send without Markdown...")
# Удаляем markdown символы и отправляем как обычный текст
plain_report = report.replace("**", "").replace("*", "")
await message.answer(plain_report, reply_markup=builder.as_markup())
logging.info("Plain text message sent successfully!")
# Отправляем отдельное сообщение о фотографиях
if salvage_records and salvage_records[0]['img_count'] > 0:
@ -617,7 +686,9 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
photo_message = f"📸 **Photo Information**\n\n"
photo_message += f"🖼️ **{img_count} damage photos** found in our database for this vehicle.\n"
photo_message += f"These photos show the actual condition and damage of the vehicle during auction."
logging.info("Sending photo information message...")
await message.answer(photo_message, parse_mode="Markdown")
logging.info("Photo message sent successfully!")
else:
# Нет записей - возвращаем деньги
try: