{"adoption": {"forks": 217, "observed_at": "2026-08-28T04:05:32.497225+00:00", "stars": 1759}, "canonical_url": "https://ross.abutalabs.com/products/ruyipage", "card": {"archived": false, "artifact_type": "library", "description": "下一代Python的web自动化过检测框架，通过一切网站检测的Firefox内核浏览器。RuyiPage is a Python-based Firefox automation framework built on the next-generation WebDriver BiDi protocol.", "domain": ["web-development", "crawlers", "security", "privacy", "developer-tools"], "enriched": true, "function": ["web-scraping", "http-client", "security", "workflow-automation"], "health_score": 98, "homepage": null, "language": "Python", "license": "BSD-3-Clause", "license_family": "permissive", "maturity": "active", "member_repos": ["LoseNine/ruyipage"], "name": "LoseNine/ruyipage", "platform": ["python", "windows", "cross-platform"], "pushed_at": "2026-08-13T10:01:44+00:00", "repo": "LoseNine/ruyipage", "stars": 1759, "tags": ["anti-detection", "firefox", "webdriver-bidi", "browser-fingerprinting", "bot-detection-bypass", "data-capture", "proxy-support", "linux"], "topics": [], "urls": [], "use_cases": ["scrape websites protected by Cloudflare, DataDome, or hCaptcha", "automate Firefox without triggering bot detection", "intercept request and response packets for AI data collection", "assign per-tab HTTP/SOCKS5 authenticated proxies", "automate fingerprint browsers like ADS", "access closed shadow root DOM nodes", "pass high-risk-control sites like bet365 or webmail logins"], "what_it_is": "RuyiPage is a Python browser automation framework built on Firefox and the WebDriver BiDi protocol, shipping with an anti-detection Firefox browser kernel for Windows and Linux. It intercepts arbitrary request and response packets and produces native isTrusted events to evade bot detection, targeting AI analysis and data capture workflows.", "when_to_avoid": ["you only need simple, non-protected site scraping where Playwright or Selenium suffice", "you require Chromium/Chrome-specific automation features", "your use case involves testing rather than evading detection", "you need a framework with a large plugin ecosystem and long-term community support"], "when_to_choose": ["you need browser automation that bypasses anti-bot systems like Cloudflare or DataDome", "you want native isTrusted events indistinguishable from real user interaction", "you need request/response interception plus per-tab proxy support in Python", "you prefer a Firefox-based alternative to Chromium automation tools"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ruyipage", "repo": "LoseNine/ruyipage", "role": "main", "score": 79}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:32.497225+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:27:15.669974+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "affd1f0a983487ec173678ca03930b5becf3be68593fe952bdb7e1c5ae7e3e6b", "fetched_at": "2026-08-28T04:05:32.497225+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LoseNine/ruyipage"}, {"content_hash": "b28b1282b1f12136a9ce628662b60064afc85e6b59915580a0b337ec69c2c37e", "fetched_at": "2026-08-29T11:05:31.010549+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/ruyipage/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 10, "rhythm": 95}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 148, "days_push": 20, "days_rel": 32, "gap_med": 3.5, "n_releases_24m": 5}, "score": 79, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}