Task #75

[๐Ÿ”ด HIGH] razvedchik.py์˜ seen_posts ํŒจ์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ผ.

์ž‘์—… ๋ช…๋ น์–ด
[๐Ÿ”ด HIGH] razvedchik.py์˜ seen_posts ํŒจ์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ผ. ## ๋ฐฐ๊ฒฝ ์ด์ „ ๋Œ€ํ™”์—์„œ ํŒจ์น˜๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ฒŒ ์ ์šฉ๋˜์—ˆ๋‹ค: - `SEEN_POSTS_PATH` ์ƒ์ˆ˜๋Š” ์ถ”๊ฐ€๋˜์—ˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ - `_load_seen_posts()` / `_save_seen_posts()` ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์—†์Œ - `scan_feed()`์—์„œ seen_posts ํ•„ํ„ฐ๋ง ๋กœ์ง ๋ฏธ์ ์šฉ ํ˜„์žฌ razvedchik.py๋Š” ์‹คํ–‰ ์‹œ NameError๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋Š” ๋ถˆ์™„์ „ํ•œ ์ƒํƒœ์ž„. ## ๋ชฉํ‘œ ์ด๋ฏธ ์ฝ์€ ํฌ์ŠคํŠธ(seen_posts)๋ฅผ ๊ธฐ๋กํ•ด์„œ, ํ•œ ๋ฒˆ ์ฝ์€ ๊ธ€์€ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. - ํŒŒ์ผ ๊ฒฝ๋กœ: `~/.config/moltbook/seen_posts.json` - `seen_posts.json`์€ ์ด๋ฏธ ์กด์žฌํ•จ (7๊ฐœ ID ๋“ค์–ด์žˆ์Œ) ## ์ž‘์—… ์ ˆ์ฐจ 1. **๋จผ์ € ํ˜„์žฌ razvedchik.py ์ „์ฒด๋ฅผ ์ฝ์–ด๋ผ** (read_file๋กœ ์ „์ฒด ๋‚ด์šฉ ํ™•์ธ) 2. **ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋ผ**: - SEEN_POSTS_PATH ์ƒ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ - _load_seen_posts/_save_seen_posts ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ - scan_feed() ํ•จ์ˆ˜์—์„œ seen_posts ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ 3. **๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„๋งŒ ์ •ํ™•ํžˆ ํŒจ์น˜ํ•˜๋ผ**: ### ํ•„์š”ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ: **A. SEEN_POSTS_PATH ์ƒ์ˆ˜** (์—†์œผ๋ฉด ์ถ”๊ฐ€, ๊ฒฝ๋กœ ์ƒ์ˆ˜ ๋ธ”๋ก์—): ```python SEEN_POSTS_PATH = Path.home() / ".config" / "moltbook" / "seen_posts.json" ``` **B. ํ—ฌํผ ํ•จ์ˆ˜ 2๊ฐœ** (MoltbookClient ํด๋ž˜์Šค ์ •์˜ ๋ฐ”๋กœ ์œ„์— ์ถ”๊ฐ€, ์—†์œผ๋ฉด): ```python def _load_seen_posts() -> set: try: if SEEN_POSTS_PATH.exists(): return set(json.loads(SEEN_POSTS_PATH.read_text(encoding="utf-8"))) except Exception: pass return set() def _save_seen_posts(seen: set) -> None: SEEN_POSTS_PATH.parent.mkdir(parents=True, exist_ok=True) SEEN_POSTS_PATH.write_text( json.dumps(list(seen), ensure_ascii=False), encoding="utf-8" ) ``` **C. scan_feed() ํ•จ์ˆ˜ ์ˆ˜์ •**: - ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— `seen = _load_seen_posts()` ์ถ”๊ฐ€ - ํ”ผ๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ํฌ์ŠคํŠธ ์ค‘ `post_id not in seen`์ธ ๊ฒƒ๋งŒ ๊ฒฐ๊ณผ์— ํฌํ•จ - ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ post_id๋“ค์„ seen์— ์ถ”๊ฐ€ - ํ•จ์ˆ˜ ๋์—์„œ `_save_seen_posts(seen)` ํ˜ธ์ถœ 4. **์ˆ˜์ • ํ›„ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ**: `python -m py_compile razvedchik.py` 5. **์‹ค์ œ ์‹คํ–‰ ํ…Œ์ŠคํŠธ**: `python razvedchik.py --dry-run` ๋˜๋Š” import ํ…Œ์ŠคํŠธ๋กœ NameError ์—†๋Š”์ง€ ํ™•์ธ 6. **๋ฌธ์ œ ์—†์œผ๋ฉด ์™„๋ฃŒ ๋ณด๊ณ ** ## ์ค‘์š”ํ•œ ์ฃผ์˜์‚ฌํ•ญ - ํŒŒ์ผ์„ ํ†ต์งธ๋กœ ๋ฎ์–ด์“ฐ์ง€ ๋ง๊ณ , ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋จผ์ € ์ฝ๊ณ  ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•˜๋ผ - scan_feed()์˜ ์ •ํ™•ํ•œ ํ˜„์žฌ ๊ตฌํ˜„์„ ์ฝ๊ณ  ๋‚˜์„œ ์ˆ˜์ •ํ•˜๋ผ (๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ) - json ๋ชจ๋“ˆ์ด ์ด๋ฏธ import๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ (์—†์œผ๋ฉด ์ถ”๊ฐ€) - Path๊ฐ€ ์ด๋ฏธ import๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ - razvedchik.py ๊ฒฝ๋กœ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์žˆ์Œ