Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion tests/test_qr_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@

from xhs_cli.command_normalizers import normalize_xhs_user_payload
from xhs_cli.exceptions import XhsApiError
from xhs_cli.qr_login import BrowserQrLoginUnavailable, _normalize_browser_cookies, qrcode_login
from xhs_cli.qr_login import (
BrowserQrLoginUnavailable,
_camoufox_launch_options,
_normalize_browser_cookies,
qrcode_login,
)


class _FakeQrClient:
Expand Down Expand Up @@ -219,6 +224,15 @@ def test_qrcode_login_falls_back_when_browser_backend_unavailable(monkeypatch):
}


def test_browser_assisted_login_excludes_default_addons():
from camoufox import DefaultAddons

options = _camoufox_launch_options()

assert options["headless"] is False
assert options["exclude_addons"] == [DefaultAddons.UBO]


def test_normalize_browser_cookies_uses_allowlist():
cookies = _normalize_browser_cookies([
{"name": "a1", "value": "a1-value", "domain": ".xiaohongshu.com"},
Expand Down
13 changes: 12 additions & 1 deletion xhs_cli/qr_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,16 @@ def _ensure_camoufox_ready() -> None:
)


def _camoufox_launch_options() -> dict[str, Any]:
"""Return Camoufox launch options for browser-assisted QR login."""
from camoufox import DefaultAddons

return {
"headless": False,
"exclude_addons": [DefaultAddons.UBO],
}


def _browser_assisted_qrcode_login(
*,
on_status: callable[[str], None] | None = None,
Expand All @@ -347,6 +357,7 @@ def _browser_assisted_qrcode_login(

try:
from camoufox.sync_api import Camoufox
launch_options = _camoufox_launch_options()
except ImportError as exc:
raise BrowserQrLoginUnavailable(
"Camoufox sync API is unavailable in the current environment."
Expand All @@ -356,7 +367,7 @@ def _browser_assisted_qrcode_login(

_emit_status(on_status, "🔑 Starting browser-assisted QR login...")

with Camoufox(headless=False) as browser:
with Camoufox(**launch_options) as browser:
page = browser.new_page()

def _handle_response(response) -> None:
Expand Down