全球动态代理 · 静态住宅代理 · 极高质量 · 包月不限量 · 学员低价 · 联系如意进行免费测试 · 欢迎公司及学员采购 · 另有任何海外数据采集需求,随时联系 · 商务合作微信:Charleval
交流 QQ 群

1041169294

RuyiPage 自动化交流、答疑、案例分享、框架更新通知,建议先进群。

推荐服务

推荐使用我们的 Token 服务

需要 Claude / GPT 渠道时,可以直接看 Token 页面,已经整理好公开渠道、倍率说明和支持模型,适合自动化开发配套使用。

Automation / RuyiPage 文档首页
Automation Docs

RuyiPage RuyiPage 文档首页

RuyiPage 是一套面向 Firefox + WebDriver BiDi 的自动化框架文档。这里不仅讲 API,还按普通启动、指纹浏览器、接管已打开浏览器、隐私模式、高风控与完整示例体系来组织内容。

展示图

RuyiPage 品牌标识

用于在文档首页和概览页突出 Firefox + BiDi 路线的品牌识别。

launchFirefoxPagepage.get

Cloudflare 场景展示

用于说明 RuyiPage 在高风控场景下的访问与交互能力,适合配合 anti-bot 文档说明。

Cloudflare 场景展示
page.handle_cloudflare_challengepage.actionspage.get_cookies

hCaptcha 场景展示

用于强调原生动作、拟人输入与 isTrusted 行为在验证码交互场景中的价值。

hCaptcha 场景展示
page.actionspage.touchpage.is_trusted

DataDome 场景展示

用于说明 Firefox + BiDi 路线在更强风控页面上的整体适配价值。

DataDome 场景展示
page.emulationpage.networkpage.actions

Outlook 实战访问展示

体现框架在真实业务站点中的页面控制、标签页管理和会话能力。

Outlook 实战访问展示
page.getpage.elepage.browser_tools

Google / Gmail 场景展示

适合配合移动端模拟、UA 与 locale/timezone 配置一起说明 emulation 的实战价值。

Google / Gmail 场景展示
page.emulation.apply_mobile_presetpage.getpage.run_js

你可以从哪条路线开始

普通 Firefox 启动

适合第一次上手,先用 launch() 或 FirefoxPage() 验证环境,再看元素和动作链。

指纹浏览器路线

适合高风控场景,可叠加 fpfile、时区、语言、地理位置和请求头。

接管已打开浏览器

适合已经打开 ADS、FlowerBrowser 或 Firefox 实例后再由脚本接管。

隐私模式与辅助工具

既可以开启私密浏览,也可以用 XPath Picker 快速生成定位代码。

推荐阅读顺序

  • 先看安装:确认 Python、Firefox 和基础环境正常。
  • 再看启动方式总览:先决定你是普通启动、指纹浏览器、接管浏览器还是隐私模式。
  • 再看快速上手:先跑通最短脚本,再按自己的场景选 quickstart 示例。
  • 普通网页自动化继续看页面对象、元素定位、等待机制和动作链。
  • 高风控与真实环境访问继续看指纹浏览器接入、接管已打开浏览器、代理与认证、高风控场景。
  • 需要处理复杂页面结构时,再看 XPath Picker、iframe 和 Shadow DOM。

给 AI 一键接入使用

ruyipage-skill

如果你希望 OpenCode、Claude、Cursor、Windsurf、Cline 等 AI 工具更稳定地理解 RuyiPage,建议直接接入官方 skill 仓库:https://github.com/LoseNine/ruyipage-skill

适合什么场景

适合让 AI 更快分析 examples、选择 API 路线、完成网页分析、抓包排查和数据采集任务。

相关示例源码

6 个示例 ▶ 点击展开

一步上手:最少代码完成访问与读取

examples/01_quickstart.py

最短可运行的 hello-world 级别示例,适合验证环境和建立第一层心智模型。

GitHub 仓库 查看仓库源码 launchpage.getpage.waitpage.titlepage.eleele.textpage.quit
  • 用 launch() 启动 Firefox
  • 访问网页并等待页面稳定
  • 读取标题和 H1 文本
  • 演示最短退出流程

源码文件:app/content/ruyipage_examples/01_quickstart.py · 仓库:01_quickstart.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: 一步上手:最少代码完成访问与读取
# 说明: 最短可运行的 hello-world 级别示例,适合验证环境和建立第一层心智模型。
# 你会学到:
#   1. 用 launch() 启动 Firefox
#   2. 访问网页并等待页面稳定
#   3. 读取标题和 H1 文本
#   4. 演示最短退出流程
# 相关 API: launch, page.get, page.wait, page.title, page.ele, ele.text, page.quit
# =============================

# -*- coding: utf-8 -*-
"""
示例01: 一步上手

面向新手:最少代码完成一次页面访问与元素交互。
"""

import io
import sys


if sys.platform == "win32":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")


from ruyipage import launch


def quickstart_demo():
    print("=" * 60)
    print("示例01: 一步上手")
    print("=" * 60)

    page = launch(headless=False)

    try:
        page.get("https://example.com")
        page.wait(1)
        print(f"标题: {page.title}")

        h1 = page.ele("tag:h1")
        print(f"H1文本: {h1.text}")

        print("\n✓ 快速上手完成")
    finally:
        page.wait(1)
        page.quit()


if __name__ == "__main__":
    quickstart_demo()

Bing 搜索并抓取前三页结果

quickstart_bing_search.py

最接近真实业务脚本的入门示例,展示如何从搜索框输入到结果列表提取。

GitHub 仓库 查看仓库源码 FirefoxOptionsFirefoxPagepage.getpage.elepage.elespage.actions.pressele.attrele.text
  • 打开搜索引擎主页并定位输入框
  • 输入关键词并使用回车提交
  • 批量读取搜索结果列表
  • 在结果容器内二次定位标题、链接和摘要
  • 跨页面翻页抓取结果

源码文件:app/content/ruyipage_examples/quickstart_bing_search.py · 仓库:quickstart_bing_search.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: Bing 搜索并抓取前三页结果
# 说明: 最接近真实业务脚本的入门示例,展示如何从搜索框输入到结果列表提取。
# 你会学到:
#   1. 打开搜索引擎主页并定位输入框
#   2. 输入关键词并使用回车提交
#   3. 批量读取搜索结果列表
#   4. 在结果容器内二次定位标题、链接和摘要
#   5. 跨页面翻页抓取结果
# 相关 API: FirefoxOptions, FirefoxPage, page.get, page.ele, page.eles, page.actions.press, ele.attr, ele.text
# =============================

# -*- coding: utf-8 -*-
"""快速开始:Bing 搜索前 3 页。"""
from ruyipage import FirefoxOptions, FirefoxPage, Keys


opts = FirefoxOptions()
# 如果 Firefox 不在默认安装目录,可以取消注释并指定路径。
# opts.set_browser_path(r"D:\Firefox\firefox.exe")

# 如果你想复用登录状态、Cookie、扩展,可以取消注释并指定 userdir。
# opts.set_user_dir(r"D:\ruyipage_userdir")

page = FirefoxPage(opts)

try:
    page.get("https://cn.bing.com/")
    page.ele("#sb_form_q").input("小肩膀教育")
    page.actions.press(Keys.ENTER).perform()
    page.wait(3)

    for page_no in range(1, 4):
        print("=" * 80)
        print(f"第 {page_no} 页")
        print("=" * 80)

        items = page.eles("css:#b_results > li.b_algo")

        for i, item in enumerate(items, 1):
            title_ele = item.ele("css:h2 a")
            if not title_ele:
                continue

            title = " ".join((title_ele.text or "").split())
            url = title_ele.attr("href") or ""

            desc_ele = item.ele("css:.b_caption p")
            content = desc_ele.text if desc_ele else item.text
            content = " ".join((content or "").split())

            print(f"{i}. {title}")
            print(f"   URL: {url}")
            print(f"   内容: {content}")

        if page_no < 3:
            next_btn = page.ele("css:a.sb_pagN")
            if not next_btn:
                break
            next_btn.click_self()
            page.wait(2)
finally:
    page.quit()

Cloudflare / Copilot 快速开始

quickstart_cloudfare.py

面向高风控站点的快速开始示例,覆盖挑战处理、输入框识别和 Cookie 提取。

GitHub 仓库 查看仓库源码 FirefoxOptionsFirefoxPagepage.getpage.elepage.handle_cloudflare_challengepage.get_cookies
  • 访问高风控站点并等待页面完成首屏加载
  • 自动尝试处理 Cloudflare 挑战
  • 定位输入框并发送问题
  • 提取 document.cookie 与完整 Cookie 信息

源码文件:app/content/ruyipage_examples/quickstart_cloudfare.py · 仓库:quickstart_cloudfare.py

python 注释版
# =============================
# RuyiPage 示例注释版
# 标题: Cloudflare / Copilot 快速开始
# 说明: 面向高风控站点的快速开始示例,覆盖挑战处理、输入框识别和 Cookie 提取。
# 你会学到:
#   1. 访问高风控站点并等待页面完成首屏加载
#   2. 自动尝试处理 Cloudflare 挑战
#   3. 定位输入框并发送问题
#   4. 提取 document.cookie 与完整 Cookie 信息
# 相关 API: FirefoxOptions, FirefoxPage, page.get, page.ele, page.handle_cloudflare_challenge, page.get_cookies
# =============================

# -*- coding: utf-8 -*-
"""快速开始:访问 Copilot,自动尝试通过 Cloudflare,并打印完整 Cookie。"""

from ruyipage import FirefoxOptions, FirefoxPage, Keys


QUESTION = "你好,今天天气怎么样?"


def find_input_box(page: FirefoxPage):
    for _ in range(30):
        box = page.ele("css:textarea")
        if not box:
            box = page.ele('css:[contenteditable="true"]')
        if not box:
            box = page.ele("css:.input-area")
        if box:
            return box
        page.wait(1)
    return None


def print_full_cookies(page: FirefoxPage) -> None:
    print("\n" + "=" * 60)
    print("Cloudflare / 页面 Cookie")
    print("=" * 60)

    raw_cookie = page.run_js("return document.cookie") or ""
    print(f"document.cookie: {raw_cookie}")

    cookies = page.get_cookies(all_info=True)
    print(f"Cookie 数量: {len(cookies)}")
    for i, cookie in enumerate(cookies, 1):
        print(f"[{i}] name={cookie.name}")
        print(f"    value={cookie.value}")
        print(f"    domain={cookie.domain}")
        print(f"    path={cookie.path}")
        print(f"    httpOnly={cookie.http_only}")
        print(f"    secure={cookie.secure}")
        print(f"    sameSite={cookie.same_site}")
        print(f"    expiry={cookie.expiry}")


opts = FirefoxOptions()
# 如果 Firefox 不在默认安装目录,可以取消注释并指定路径。
# opts.set_browser_path(r"D:\Firefox\firefox.exe")

# 如果你想复用登录状态、Cookie、扩展,可以取消注释并指定 userdir。
# opts.set_user_dir(r"D:\ruyipage_userdir")

page = FirefoxPage(opts)

try:
    print("=" * 60)
    print("copilot.microsoft.com Cloudflare 测试")
    print("=" * 60)

    print("\n-> 访问 https://copilot.microsoft.com/ ...")
    page.get("https://copilot.microsoft.com/", wait="none")
    page.wait(5)

    print("-> 等待输入框...")
    input_box = find_input_box(page)

    if input_box:
        print("-> 找到输入框,开始输入问题...")
        try:
            input_box.click()
            page.wait(0.8)
            input_box.input(QUESTION, clear=True)
            page.wait(0.8)

            send_btn = page.ele('css:button[aria-label*="Send"]')
            if not send_btn:
                send_btn = page.ele('css:button[type="submit"]')

            if send_btn:
                print("-> 点击发送按钮...")
                send_btn.click()
            else:
                print("-> 按 Enter 发送...")
                page.actions.press(Keys.ENTER).perform()

            print("-> 已发送问题,等待 Cloudflare 触发...")
            page.wait(15)
        except Exception as e:
            print(f"-> 发送失败: {e}")
            page.wait(5)
    else:
        print("-> 未找到输入框,直接等待 Cloudflare...")
        page.wait(5)

    print("\n-> 开始自动处理 Cloudflare...")
    passed = page.handle_cloudflare_challenge(timeout=120, check_interval=2)

    print("\n" + "=" * 60)
    if passed:
        print("✅ 成功通过 Cloudflare!")
        print_full_cookies(page)
    else:
        print("❌ 超时未通过")

    print("\n[+] 保持浏览器打开 500 秒...")
    page.wait(500)

finally:
    page.quit()

指纹浏览器快速开始

quickstart_fingerprint_browser.py

演示如何把 Firefox 指纹浏览器、指纹文件、地理位置、语言和请求头一起接入 RuyiPage。

GitHub 仓库 查看仓库源码 FirefoxOptionsopts.set_browser_pathopts.set_fpfilepage.emulation.set_geolocationpage.emulation.set_timezonepage.emulation.set_localepage.network.set_extra_headerspage.emulation.set_screen_size
  • 加载 Firefox 指纹浏览器可执行文件
  • 通过 fpfile 复用指纹配置
  • 叠加地理位置、时区和语言环境
  • 为请求增加语言请求头
  • 访问指纹检测站点验证效果

隐私模式快速开始

quickstart_private_mode.py

展示 Firefox 私密浏览模式的两种启动方式,以及它与临时 profile 的区别。

GitHub 仓库 查看仓库源码 FirefoxOptionsopts.private_modeFirefoxPagelaunch(private=True)page.getpage.quit
  • 通过 FirefoxOptions 开启私密浏览
  • 通过 launch(private=True) 快速启动
  • 理解私密模式与临时用户目录的区别
  • 验证私密模式下的页面访问流程

自动探测并接管已打开浏览器

examples/39_attach_exist_browser.py

适合 Firefox、ADS、FlowerBrowser 等已打开实例的自动探测接管场景。

GitHub 仓库 查看仓库源码 auto_attach_exist_browser_by_processpage.browser.addresspage.titlepage.url
  • 按进程特征自动探测真实调试端口
  • 接管已打开的 Firefox 或指纹浏览器
  • 自动切到最新标签页
  • 复用已有人机操作会话