Store MAX publication URLs

This commit is contained in:
Your Name
2026-07-22 22:15:52 +05:00
parent 184ccb55fb
commit d5d9194bef
2 changed files with 82 additions and 1 deletions
+66
View File
@@ -0,0 +1,66 @@
from __future__ import annotations
import asyncio
from loguru import logger
from vk_parser_app.constants import PUBLICATION_STATUS_PUBLISHED
from vk_parser_app.db import close_pool, fetch_int_setting, fetch_setting, get_pool
from vk_parser_app.workers.max_poster import MAXAPIClient, MAXPoster
async def main() -> None:
pool = await get_pool()
token = str(await fetch_setting("max_poster_bot_token", "") or "").strip()
base_url = str(await fetch_setting("max_poster_api_base_url", "https://platform-api2.max.ru") or "").strip()
if not token:
raise RuntimeError("max_poster_bot_token is empty")
rows = await pool.fetch(
"""
SELECT id, raw_post_id, external_id
FROM post_publications
WHERE platform='max'
AND status=$1
AND COALESCE(url, '')=''
AND COALESCE(external_id, '')<>''
ORDER BY published_at DESC NULLS LAST, id DESC
""",
PUBLICATION_STATUS_PUBLISHED,
)
poster = MAXPoster()
updated = 0
missing = 0
async with MAXAPIClient(
token,
base_url,
timeout_sec=max(30, await fetch_int_setting("max_poster_timeout_sec", 120)),
max_attempts=max(1, await fetch_int_setting("max_poster_max_attempts", 3)),
retry_backoff_max_sec=max(1, await fetch_int_setting("max_poster_retry_backoff_max_sec", 30)),
) as client:
for row in rows:
data = await client.get_message(str(row["external_id"]))
url = poster.message_url_from_response(data)
if not url:
missing += 1
continue
await pool.execute(
"""
UPDATE post_publications
SET url=$2,
updated_at=NOW()
WHERE id=$1
""",
int(row["id"]),
url,
)
updated += 1
logger.info("MAX URL backfilled raw_post={} url={}", row["raw_post_id"], url)
logger.info("MAX URL backfill done: scanned={} updated={} missing={}", len(rows), updated, missing)
await close_pool()
if __name__ == "__main__":
asyncio.run(main())