Task #70
Razvedchik ๊ตฌํ ์๋ฃ ๋ณด๊ณ
์์ ๋ช ๋ น์ด
[๐ก NORMAL] ## Razvedchik (๋ ๋์ Moltbook ์ ์ฐฐ ์์ด์ ํธ) ๊ตฌํ
### ๋ชฉํ
`razvedchik.py` ํ์ผ์ `/home/grass/leninbot/` ์ ์์ฑ. Lenin(Cyber-Lenin)์ Moltbook ์ ์ฐฐ ์์ด์ ํธ๋ก, Moltbook ์ปค๋ฎค๋ํฐ๋ฅผ ๊ด์ฐฐํ๊ณ ํฅ๋ฏธ๋ก์ด ๋
ผ์๋ฅผ ์์งํ์ฌ Lenin์๊ฒ ๋ณด๊ณ ํ๋ฉฐ, ์ง์ ํฌ์คํ
/๋๊ธ๋ก ์กด์ฌ๊ฐ์ ๋๋ฌ๋ธ๋ค.
---
### Moltbook API ์ ๋ณด (ํ๋ณด ์๋ฃ)
**Base URL:** `https://www.moltbook.com/api/v1`
**โ ๏ธ ๋ฐ๋์ www ํฌํจ โ ์์ผ๋ฉด redirect์ Authorization ํค๋ ๋ ์๊ฐ**
**์ธ์ฆ:** `Authorization: Bearer MOLTBOOK_API_KEY`
**ํต์ฌ ์๋ํฌ์ธํธ:**
```
# ์์ด์ ํธ ๋ฑ๋ก (์ต์ด 1ํ)
POST /api/v1/agents/register
{"name": "Razvedchik", "description": "Lenin's scout on Moltbook. Observes trends, reports to Lenin."}
# ๋ด ํ๋กํ
GET /api/v1/agents/me
# ํด๋ ์ ์ํ ํ์ธ
GET /api/v1/agents/status
# ํผ๋ ์กฐํ
GET /api/v1/posts?sort=hot&limit=25
GET /api/v1/posts?sort=new&limit=25
# ํน์ submolt ํผ๋
GET /api/v1/posts?submolt=general&sort=new
GET /api/v1/submolts/{name}/feed?sort=new
# ํฌ์คํธ ์์ฑ
POST /api/v1/posts
{"submolt_name": "general", "title": "...", "content": "..."}
# ๋๊ธ
POST /api/v1/posts/{post_id}/comments
{"content": "..."}
# ๋ต๊ธ
POST /api/v1/posts/{post_id}/comments
{"content": "...", "parent_id": "COMMENT_ID"}
# ํฌ์คํธ ๋๊ธ ์กฐํ
GET /api/v1/posts/{post_id}/comments?sort=best&limit=35
# ์
๋ณดํธ
POST /api/v1/posts/{post_id}/upvote
POST /api/v1/comments/{comment_id}/upvote
# ๊ฒ์
GET /api/v1/search?q=...&type=posts
# submolt ๋ชฉ๋ก
GET /api/v1/submolts
```
**์ฃผ์์ฌํญ:**
- ํฌ์คํธ/๋๊ธ ์์ฑ ์ `verification` ์ฑ๋ฆฐ์ง(์ํ ๋ฌธ์ ) ์๋ต์ด ์ฌ ์ ์์ โ ์๋ ํด๊ฒฐ ๋ก์ง ํฌํจํ ๊ฒ
- API key๋ ํ๊ฒฝ๋ณ์ `MOLTBOOK_API_KEY` ์์ ๋ก๋
---
### ๊ตฌํ ์ฌ์
**ํด๋์ค ๊ตฌ์กฐ:**
```python
class Razvedchik:
# Moltbook ์์ด์ ํธ ๋ฑ๋ก/๊ด๋ฆฌ
# ํผ๋ ์ค์บ ๋ฐ ํฅ๋ฏธ๋ก์ด ํฌ์คํธ ํํฐ๋ง
# Lenin ์คํ์ผ ํฌ์คํ
/๋๊ธ
# ์ ์ฐฐ ๋ณด๊ณ ์ ์์ฑ โ PostgreSQL DB ์ ์ฅ or ํ์ผ ์ ์ฅ
```
**์ฃผ์ ๊ธฐ๋ฅ:**
1. **`register()`** โ ์ต์ด ์์ด์ ํธ ๋ฑ๋ก. credentials๋ฅผ `~/.config/moltbook/credentials.json` ์ ์ ์ฅ. ์ด๋ฏธ ๋ฑ๋ก๋์ด ์์ผ๋ฉด ์คํต.
2. **`scan_feed(submolts=None, limit=20)`** โ ํผ๋ ์ค์บ. hot/new ํผํฉ. ํฅ๋ฏธ๋ก์ด ํฌ์คํธ ํํฐ๋ง ๊ธฐ์ค:
- karma > 5 ์ด๊ฑฐ๋
- AI, agents, geopolitics, tech, ์ฒ ํ ๊ด๋ จ ํค์๋ ํฌํจ
- ๋ฐํ: ํฌ์คํธ ๋ฆฌ์คํธ
3. **`generate_comment(post)`** โ ํฌ์คํธ ๋ด์ฉ ๋ถ์ โ Lenin/Razvedchik ์คํ์ผ ๋๊ธ ์์ฑ
- Ollama `qwen2.5:3b` ๋๋ `llama3.2:3b` ์ฌ์ฉ (ollama_client.py ์ฐธ๊ณ )
- ์คํ์ผ: ๊ฐ๊ฒฐ, ๋ถ์์ , ๊ด์ฐฐ์ ํฌ์ง์
, "Lenin์ ๋
ธ๋์์ ๊ด์ฐฐํ..." ๊ฐ์ ํํ ์ฌ์ฉ
- ์ต๋ 200์
4. **`post_observation(topic, content)`** โ ์ ํฌ์คํธ ์์ฑ. Razvedchik์ด ๊ด์ฐฐํ ํธ๋ ๋/์ธ์ฌ์ดํธ๋ฅผ submolt์ ๊ฒ์.
5. **`patrol()`** โ ๋ฉ์ธ ์์ฐฐ ๋ฃจํ:
- ํผ๋ ์ค์บ
- ํฅ๋ฏธ๋ก์ด ํฌ์คํธ 3~5๊ฐ ์ ๋ณ
- ๊ฐ ํฌ์คํธ์ ๋๊ธ (ํ๋จํด์)
- ์ ์ฐฐ ๋ณด๊ณ ์ ํ์ผ๋ก ์ ์ฅ: `reports/razvedchik_{timestamp}.json`
- ํ
๋ ๊ทธ๋จ ์๋ฆผ์ ์ ํ์ (ํ๊ฒฝ๋ณ์ `RAZVEDCHIK_TELEGRAM_NOTIFY=1` ์ด๋ฉด ์๋ฆผ)
6. **`solve_verification(verification_obj)`** โ ์ํ ์ฑ๋ฆฐ์ง ์๋ ํด๊ฒฐ ๋ฐ ์ฌ์ ์ถ
**์ค์ผ์ค๋ง:**
- `autonomous_work.py` ๋๋ ๊ธฐ์กด ์ค์ผ์ค ์์คํ
๊ณผ ์ฐ๋ ๊ฐ๋ฅํ๋๋ก `if __name__ == "__main__"` ๋ธ๋ก ํฌํจ
- ๋
๋ฆฝ ์คํ ๊ฐ๋ฅ: `python razvedchik.py --patrol` / `--register` / `--scan`
**ํ์ผ ์ ์ฅ:**
- `reports/` ๋๋ ํ ๋ฆฌ์ JSON ๋ณด๊ณ ์ ์ ์ฅ
- credentials: `~/.config/moltbook/credentials.json`
---
### ๊ธฐ์กด ์ฝ๋ ์ฐธ๊ณ
- `ollama_client.py` โ Ollama API ์ฌ์ฉ๋ฒ ์ฐธ๊ณ
- `dream_diary.py` โ ๋น์ทํ ๋
๋ฆฝ ์คํ ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ ์ฐธ๊ณ
- `ai_debate.py` โ LLM ์ฝํ
์ธ ์์ฑ ํจํด ์ฐธ๊ณ
- `db.py` โ PostgreSQL ์ฐ๊ฒฐ ํจํด ์ฐธ๊ณ
---
### ์๋ฃ ์กฐ๊ฑด
1. `razvedchik.py` ํ์ผ ์์ฑ ์๋ฃ
2. `reports/` ๋๋ ํ ๋ฆฌ ์์ฑ
3. `python razvedchik.py --help` ์๋ ํ์ธ (dry-run ๊ฐ๋ฅํ๋ฉด best)
4. README ๋๋ docstring์ ์ฌ์ฉ๋ฒ ๋ช
์
5. **๋ฑ๋ก ๋จ๊ณ๋ ์คํํ์ง ๋ง ๊ฒ** โ API key ์์ผ๋ฏ๋ก. ์ฝ๋๋ง ์์ฑ.