From 33068735b5abd10d36da23ceda4ec345df76dae2 Mon Sep 17 00:00:00 2001 From: gitadmin Date: Fri, 26 Dec 2025 01:20:01 +0300 Subject: [PATCH] =?UTF-8?q?[=D0=92=D0=9E=D0=9B=D0=9A]=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BE=20=D0=BF=D1=83=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- evtg_publish.py | 82 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/evtg_publish.py b/evtg_publish.py index f2c52a3..47853d6 100644 --- a/evtg_publish.py +++ b/evtg_publish.py @@ -570,7 +570,8 @@ async def tg_post_event_by_id(id_event): password=MDB_PW, database=MDBASE, charset='utf8mb4', - cursorclass=pymysql.cursors.DictCursor + cursorclass=pymysql.cursors.DictCursor, + init_command="SET time_zone='+00:00'" # Устанавливаем часовой пояс UTC ) # Проверка времени изменения только в режиме ZILANT @@ -632,6 +633,7 @@ async def tg_post_event_by_id(id_event): timeout=20.0, follow_redirects=True ) + tg_message_id = None try: tg_message_id = await tg_post_event(httpx_client, event) # Получаем новый message_id finally: @@ -641,29 +643,58 @@ async def tg_post_event_by_id(id_event): # Используем UTC время для записи в базу данных current_time_utc = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") - # Обновляем подписки если был предыдущий message_id - if old_message_id: - cursor.execute(""" - UPDATE marks_evt - SET tg_event_id = %s - WHERE tg_event_id = %s - """, (tg_message_id, old_message_id)) - logger.info(f"Обновлены подписки для события {id_event}: {cursor.rowcount} записей") + # Обновляем базу данных в отдельном блоке try-except для гарантии сохранения + try: + # Обновляем подписки если был предыдущий message_id + if old_message_id: + cursor.execute(""" + UPDATE marks_evt + SET tg_event_id = %s + WHERE tg_event_id = %s + """, (tg_message_id, old_message_id)) + logger.info(f"Обновлены подписки для события {id_event}: {cursor.rowcount} записей") - cursor.execute(""" - UPDATE events - SET is_posted_tg = True, - tg_message_id = %s, - tg_posted_date = %s - WHERE id_event = %s - """, (tg_message_id, current_time_utc, id_event)) - conn.commit() - logger.info(f"Событие номер {event['number']} успешно опубликовано") + # Обновляем данные о публикации события + cursor.execute(""" + UPDATE events + SET is_posted_tg = True, + tg_message_id = %s, + tg_posted_date = %s + WHERE id_event = %s + """, (tg_message_id, current_time_utc, id_event)) + conn.commit() + logger.info(f"Событие номер {event['number']} успешно опубликовано. Данные сохранены в БД: message_id={tg_message_id}, date={current_time_utc}") + except Exception as db_error: + logger.error(f"Ошибка при сохранении данных о публикации события {id_event} в БД: {db_error}") + # Пытаемся выполнить commit даже при ошибке + try: + conn.rollback() + # Повторная попытка обновления + cursor.execute(""" + UPDATE events + SET is_posted_tg = True, + tg_message_id = %s, + tg_posted_date = %s + WHERE id_event = %s + """, (tg_message_id, current_time_utc, id_event)) + conn.commit() + logger.info(f"Данные о публикации события {id_event} успешно сохранены после повторной попытки") + except Exception as retry_error: + logger.error(f"Критическая ошибка при сохранении данных о публикации события {id_event}: {retry_error}") + raise else: logger.error(f"Не удалось опубликовать событие ID {id_event}") + except RetryAfterException as e: + # Обработка RetryAfter (FloodWait) + logger.error(f"Полная информация об ошибке RetryAfter в tg_post_event_by_id для события ID {id_event}:") + logger.error(f" Тип ошибки: RetryAfter") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" retry_after: {e.retry_after}") + logger.error(f" Полное представление: {repr(e)}") + raise except Exception as e: - # Проверяем, не RetryAfter ли это + # Проверяем, не RetryAfter ли это в строковом виде error_msg = str(e) if error_msg.startswith("RetryAfter:") or (hasattr(e, 'retry_after')): retry_after = getattr(e, 'retry_after', int(error_msg.split(":")[1]) if ":" in error_msg else 60) @@ -674,19 +705,11 @@ async def tg_post_event_by_id(id_event): logger.error(f" Полное представление: {repr(e)}") raise RetryAfterException(retry_after) # Если это не RetryAfter, обрабатываем как обычную ошибку - if "RetryAfter" not in error_msg: - logger.error(f"Ошибка при публикации: {e}") - logger.error(f"Полная информация об ошибке в tg_post_event_by_id для события ID {id_event}:") - logger.error(f" Тип ошибки: {type(e).__name__}") - logger.error(f" Сообщение: {str(e)}") - logger.error(f" Все атрибуты ошибки: {vars(e) if hasattr(e, '__dict__') else 'N/A'}") - logger.error(f" Полное представление: {repr(e)}") - except Exception as e: logger.error(f"Ошибка при публикации: {e}") logger.error(f"Полная информация об ошибке в tg_post_event_by_id для события ID {id_event}:") logger.error(f" Тип ошибки: {type(e).__name__}") logger.error(f" Сообщение: {str(e)}") - logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e) if hasattr(e, '__dict__') else 'N/A'}") logger.error(f" Полное представление: {repr(e)}") finally: if conn: @@ -703,7 +726,8 @@ async def tg_post_all_events(): password=MDB_PW, database=MDBASE, charset='utf8mb4', - cursorclass=pymysql.cursors.DictCursor + cursorclass=pymysql.cursors.DictCursor, + init_command="SET time_zone='+00:00'" # Устанавливаем часовой пояс UTC ) with conn.cursor() as cursor: