fix(telegram): async API calls & pagination
This commit is contained in:
+19
-14
@@ -67,13 +67,13 @@ class TelegramStarsBot:
|
|||||||
post_ids = 0
|
post_ids = 0
|
||||||
for post in all_posts:
|
for post in all_posts:
|
||||||
post_id = post.get("post_id")
|
post_id = post.get("post_id")
|
||||||
has_comments = self.lolz_api.has_comments(post=post)
|
has_comments = await self.lolz_api.has_comments(post=post)
|
||||||
|
|
||||||
if has_comments:
|
if has_comments:
|
||||||
self.processed_manager.mark_processed(post_id)
|
self.processed_manager.mark_processed(post_id)
|
||||||
post_ids += 1
|
post_ids += 1
|
||||||
|
|
||||||
logger.info(f"Добавлено {len(post_ids)} постов в список обработанных.")
|
logger.info(f"Добавлено {post_ids} постов в список обработанных.")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.info("Не найдено постов для добавления в обработанные.")
|
logger.info("Не найдено постов для добавления в обработанные.")
|
||||||
@@ -87,18 +87,20 @@ class TelegramStarsBot:
|
|||||||
for attempt in range(self.config.max_retries):
|
for attempt in range(self.config.max_retries):
|
||||||
try:
|
try:
|
||||||
if message_id is None:
|
if message_id is None:
|
||||||
history = await self.client.get_chat_history(
|
fetched_id = None
|
||||||
|
async for msg in self.client.get_chat_history(
|
||||||
chat_id=channel, limit=1
|
chat_id=channel, limit=1
|
||||||
)
|
):
|
||||||
|
fetched_id = msg.id
|
||||||
|
break
|
||||||
|
|
||||||
if len(history) == 0:
|
if fetched_id is None:
|
||||||
logger.error(
|
logger.error(
|
||||||
f"Не удалось найти сообщения в канале https://t.me/{channel}"
|
f"Не удалось найти сообщения в канале https://t.me/{channel}"
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
message = history[0]
|
message_id = fetched_id
|
||||||
message_id = message.id
|
|
||||||
|
|
||||||
await self.client.send_paid_reaction(
|
await self.client.send_paid_reaction(
|
||||||
chat_id=channel,
|
chat_id=channel,
|
||||||
@@ -111,8 +113,9 @@ class TelegramStarsBot:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
except FloodWait as e:
|
except FloodWait as e:
|
||||||
logger.warning(f"FloodWait: необходимо подождать {e.x + 2} секунд.")
|
wait_time = getattr(e, "value", getattr(e, "x", 10)) + 2
|
||||||
await asyncio.sleep(e.x + 2)
|
logger.warning(f"FloodWait: необходимо подождать {wait_time} секунд.")
|
||||||
|
await asyncio.sleep(wait_time)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(
|
logger.error(
|
||||||
@@ -138,7 +141,7 @@ class TelegramStarsBot:
|
|||||||
logger.info(f"Найден новый пост для обработки: ID {post_id}")
|
logger.info(f"Найден новый пост для обработки: ID {post_id}")
|
||||||
|
|
||||||
if self.config.skip_commented:
|
if self.config.skip_commented:
|
||||||
if await self.lolz_api.has_comments(post_id):
|
if await self.lolz_api.has_comments(post=post):
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Пост {post_id} уже имеет комментарии. Пропускаю обработку."
|
f"Пост {post_id} уже имеет комментарии. Пропускаю обработку."
|
||||||
)
|
)
|
||||||
@@ -189,13 +192,17 @@ class TelegramStarsBot:
|
|||||||
logger.info(
|
logger.info(
|
||||||
f"Проверка новых постов в теме {self.config.lolz_thread_id} начиная со страницы {self.start_page}..."
|
f"Проверка новых постов в теме {self.config.lolz_thread_id} начиная со страницы {self.start_page}..."
|
||||||
)
|
)
|
||||||
posts = await self.lolz_api.get_thread_posts(
|
posts, last_page = await self.lolz_api.get_thread_posts(
|
||||||
self.config.lolz_thread_id, self.start_page
|
self.config.lolz_thread_id, self.start_page
|
||||||
)
|
)
|
||||||
|
|
||||||
if posts:
|
if posts:
|
||||||
for post in posts:
|
for post in posts:
|
||||||
await self._process_single_post(post)
|
await self._process_single_post(post)
|
||||||
|
# Next cycle starts from the last page that had posts —
|
||||||
|
# new posts always appear there or on a new page beyond it,
|
||||||
|
# never on earlier pages.
|
||||||
|
self.start_page = last_page
|
||||||
else:
|
else:
|
||||||
logger.info("Новых постов для обработки не найдено.")
|
logger.info("Новых постов для обработки не найдено.")
|
||||||
|
|
||||||
@@ -216,9 +223,7 @@ class TelegramStarsBot:
|
|||||||
if is_first_login:
|
if is_first_login:
|
||||||
logger.info("Сессия Telegram не найдена. Запускаю процесс входа...")
|
logger.info("Сессия Telegram не найдена. Запускаю процесс входа...")
|
||||||
else:
|
else:
|
||||||
choice = self.config.default_choice
|
if self.config.default_choice == 2:
|
||||||
|
|
||||||
if choice == "2":
|
|
||||||
logger.info("Выбран режим парсинга существующих постов.")
|
logger.info("Выбран режим парсинга существующих постов.")
|
||||||
self.client = Client(
|
self.client = Client(
|
||||||
name=self.SESSION_NAME,
|
name=self.SESSION_NAME,
|
||||||
|
|||||||
Reference in New Issue
Block a user