1041169294
RuyiPage 自动化交流、答疑、案例分享、框架更新通知,建议先进群。
RuyiPage 自动化交流、答疑、案例分享、框架更新通知,建议先进群。
需要 Claude / GPT 渠道时,可以直接看 Token 页面,已经整理好公开渠道、倍率说明和支持模型,适合自动化开发配套使用。
RuyiPage 是一套面向 Firefox + WebDriver BiDi 的自动化框架文档。这里不仅讲 API,还按普通启动、指纹浏览器、接管已打开浏览器、隐私模式、高风控与完整示例体系来组织内容。
用于在文档首页和概览页突出 Firefox + BiDi 路线的品牌识别。
用于说明 RuyiPage 在高风控场景下的访问与交互能力,适合配合 anti-bot 文档说明。
用于强调原生动作、拟人输入与 isTrusted 行为在验证码交互场景中的价值。
用于说明 Firefox + BiDi 路线在更强风控页面上的整体适配价值。
体现框架在真实业务站点中的页面控制、标签页管理和会话能力。
适合配合移动端模拟、UA 与 locale/timezone 配置一起说明 emulation 的实战价值。
适合第一次上手,先用 launch() 或 FirefoxPage() 验证环境,再看元素和动作链。
适合高风控场景,可叠加 fpfile、时区、语言、地理位置和请求头。
适合已经打开 ADS、FlowerBrowser 或 Firefox 实例后再由脚本接管。
既可以开启私密浏览,也可以用 XPath Picker 快速生成定位代码。
如果你希望 OpenCode、Claude、Cursor、Windsurf、Cline 等 AI 工具更稳定地理解 RuyiPage,建议直接接入官方 skill 仓库:https://github.com/LoseNine/ruyipage-skill
适合让 AI 更快分析 examples、选择 API 路线、完成网页分析、抓包排查和数据采集任务。
最短可运行的 hello-world 级别示例,适合验证环境和建立第一层心智模型。
源码文件:app/content/ruyipage_examples/01_quickstart.py · 仓库:01_quickstart.py
# =============================
# 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()
最接近真实业务脚本的入门示例,展示如何从搜索框输入到结果列表提取。
源码文件:app/content/ruyipage_examples/quickstart_bing_search.py · 仓库:quickstart_bing_search.py
# =============================
# 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()
面向高风控站点的快速开始示例,覆盖挑战处理、输入框识别和 Cookie 提取。
源码文件:app/content/ruyipage_examples/quickstart_cloudfare.py · 仓库:quickstart_cloudfare.py
# =============================
# 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()
演示如何把 Firefox 指纹浏览器、指纹文件、地理位置、语言和请求头一起接入 RuyiPage。
展示 Firefox 私密浏览模式的两种启动方式,以及它与临时 profile 的区别。
适合 Firefox、ADS、FlowerBrowser 等已打开实例的自动探测接管场景。