"""
练习 03: 监听抖音作品接口。

前置:
1. 先执行 `./.venv/bin/python login_douyin.py --browser-port 9223`
2. 在浏览器里完成登录
3. 打开某个抖音博主主页

目标:
1. 附着到浏览器
2. 调用 `page.listen.start(...)`
3. 等待一个接口包
4. 打印 `packet`、`packet.response`、`packet.response.body` 的类型或部分内容

建议:
- 第一版不要急着做完整解析
- 先看清楚监听回来的对象长什么样
- 如果没监听到，手动滚动页面再试

运行:
    ./.venv/bin/python learning/drissionpage_basics/03_listen_api.py
"""

import sys
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
if str(PROJECT_ROOT) not in sys.path:
    sys.path.insert(0, str(PROJECT_ROOT))

from Douyin import DEFAULT_USER_URL
from Douyin import build_browser_address
from Douyin import ensure_browser_debug_port_ready

LISTEN_TARGET = "web/aweme/post/"
DEFAULT_BROWSER_PORT = 9223


def main() -> None:
    from DrissionPage import ChromiumOptions
    from DrissionPage import ChromiumPage

    ensure_browser_debug_port_ready(DEFAULT_BROWSER_PORT)
    options = ChromiumOptions().set_address(build_browser_address(DEFAULT_BROWSER_PORT)).existing_only(True)
    page = ChromiumPage(options)

    page.listen.start(LISTEN_TARGET)
    page.get(DEFAULT_USER_URL)
    print(f"[INFO] 当前 URL: {page.url}")
    print("[INFO] 已开始监听作品接口。如果当前页不是博主主页，请在浏览器里切到博主主页并轻微滚动。")

    packet = page.listen.wait(timeout=10)
    if packet is None:
        print("[WARN] 10 秒内没有监听到接口包。请切到博主主页并滚动后重试。")
        return

    response = packet.response
    body = getattr(response, "body", None)
    print(f"[INFO] packet 类型: {type(packet).__name__}")
    print(f"[INFO] response 类型: {type(response).__name__}")
    print(f"[INFO] response.body 类型: {type(body).__name__}")

    if isinstance(body, dict):
        print(f"[INFO] body keys: {list(body.keys())[:10]}")
        aweme_list = body.get("aweme_list")
        if isinstance(aweme_list, list):
            print(f"[INFO] aweme_list 数量: {len(aweme_list)}")
            if aweme_list:
                print(f"[INFO] 第一条 aweme keys: {list(aweme_list[0].keys())[:10]}")
    else:
        raw_body = getattr(response, "raw_body", "")
        print(f"[INFO] raw_body 前 300 个字符: {str(raw_body)[:300]}")


if __name__ == "__main__":
    main()
