Clouldon Blog
    • 版块
    • 最新
    • 用户
    • 友链
    • 注册
    • 登录
    1. 主页
    2. 四折光曲
    离线
    • 资料
    • 关注 1
    • 粉丝 1
    • 主题 15
    • 帖子 79
    • 群组 2

    四折光曲

    @四折光曲

    administrators
    10
    资料浏览
    79
    帖子
    1
    粉丝
    1
    关注
    注册时间
    最后登录

    四折光曲 取消关注 关注
    Global Moderator administrators

    四折光曲 发布的最新帖子

    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - shiaho777/web-to-app: The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone

      The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone - shiaho777/web-to-app

      favicon

      GitHub (github.com)

      WebToApp
      在手机上把 Web 项目打包成可安装的 Android APK。

      发布在 软件教程
      四折光曲四
      四折光曲
    • Edge MCP Agent 2

      Link Preview Image
      GitHub - Raven777777/EMA2: 通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的**真实 Edge 浏览器**: 读取任意网页、操作标签页、点击元素、执行 JS,并**带真实登录态**。

      通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的**真实 Edge 浏览器**: 读取任意网页、操作标签页、点击元素、执行 JS,并**带真实登录态**。 - Raven777777/EMA2

      favicon

      GitHub (github.com)

      EMA2 — Edge MCP Agent 2 (Rust)

      通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的真实 Edge 浏览器:
      读取任意网页、操作标签页、点击元素、执行 JS,并带真实登录态。

      AI 客户端 ──MCP over HTTP──> ema2.exe (单进程) ──WebSocket──> Edge 扩展 ──> 真实浏览器
      (opencode / Claude ...)   http://127.0.0.1:8765/mcp       ws://127.0.0.1:8765/
      

      特性

      • 单进程、单 exe(约 1.5 MB):Rust 实现,一个常驻进程同时承担 MCP 服务与浏览器桥接
      • MCP over HTTP:标准 Streamable HTTP + legacy SSE 双传输,opencode type: remote 直连
      • 控制真实浏览器:真实指纹、真实登录态,无头检测失效,不依赖 CDP 调试端口
      • 18 个工具:读页面 / 读标签页 / 列标签页 / 新建关闭 / 导航 / 点击 / 执行 JS,以及等待、截图、表单和页面交互工具
      • MV3 保活:定时 ping,防止 Edge 扩展 service worker 闲置回收断连
      • 安全:只绑定 127.0.0.1

      目录结构

      EMA2/
      ├── bin/ema2.exe                 # release 构建的单 exe(直接分发)
      ├── rust/                        # Rust 源码(cargo 工程)
      │   └── src/
      │       ├── main.rs              # 子命令:run / status
      │       ├── config.rs            # 端口/保活(env 覆盖)
      │       ├── http.rs              # axum:/mcp + /sse + /messages + /status + WS
      │       ├── mcp.rs               # MCP 协议处理
      │       ├── relay.rs             # 扩展 WS 连接 + 保活
      │       ├── state.rs             # 共享状态(扩展连接/待响应映射)
      │       └── tools.rs             # 18 个工具定义
      ├── extension/                   # Edge 浏览器扩展 (MV3)
      ├── scripts/
      │   ├── setup.cmd                # cargo build --release → bin/
      │   ├── start-bridge.cmd         # 启动常驻中继(隐藏后台)
      │   └── stop-bridge.cmd          # 停止中继
      ├── examples/
      │   ├── opencode.json.example    # opencode remote MCP 配置
      ├── docs/ARCHITECTURE.md
      ├── README.md
      └── LICENSE
      

      快速开始

      前置要求

      • Microsoft Edge(新版)
      • Rust 工具链(仅构建和测试需要;运行只需 bin/ema2.exe)

      1. 启动中继

      scripts\start-bridge.cmd     # 或直接运行 bin\ema2.exe run
      

      2. 加载扩展

      1. Edge 打开 edge://extensions/
      2. 打开右上角「开发人员模式」
      3. 「加载解压缩的扩展」→ 选择 extension/ 目录
      4. 确认扩展已启用:bin\ema2.exe status 显示 "extension_connected": true

      3. 配置 AI 客户端

      opencode(~/.config/opencode/opencode.json):

      {
        "mcp": {
          "edge-browser": {
            "type": "remote",
            "url": "http://127.0.0.1:8765/mcp",
            "enabled": true
          }
        }
      }
      

      Claude Desktop(%APPDATA%\Claude\claude_desktop_config.json):

      {
        "mcpServers": {
          "edge-browser": {
            "url": "http://127.0.0.1:8765/mcp"
          }
        }
      }
      

      然后重启 AI 客户端。

      工具列表

      工具 说明
      edge_get_tabs 列出所有标签页(id/title/url/active)
      edge_get_active_tab 当前标签页信息
      edge_read_active_tab 提取当前标签页纯文本
      edge_read_tab 按 tabId 提取指定标签页纯文本
      edge_execute_js 在当前标签页执行任意 JS(chrome.debugger)
      edge_click_element 按 CSS 选择器点击元素
      edge_new_tab / edge_close_tab 新建 / 关闭标签页
      edge_navigate 当前标签页跳转
      edge_wait_for 等文本出现/消失或固定时长(默认超时 30s)
      edge_take_screenshot 截图(保存 PNG 到输出目录,返回文件路径)
      edge_console_messages 读取页面 console 日志
      edge_network_requests 列出页面发起的网络请求(performance entries)
      edge_type 向选择器元素输入文本(触发 input/change)
      edge_press_key 在当前聚焦元素按键(Enter/Escape 等)
      edge_fill_form 批量填充表单字段
      edge_hover 悬停到指定元素
      edge_scroll 页面滚动(默认一个视口高度)

      配置(环境变量)

      变量 默认 说明
      EDGE_MCP_PORT 8765 监听端口
      EDGE_MCP_KEEPALIVE_MS 10000 MV3 保活 ping 间隔
      EDGE_MCP_TOKEN 无 启用后 MCP HTTP 需 Authorization: Bearer <token>;扩展 WS 地址需追加 ?token=<token>
      EDGE_MCP_OUTPUT_DIR ./output 截图输出目录

      命令行

      bin\ema2.exe run --port 8765    # 启动常驻中继
      bin\ema2.exe status             # 健康检查(含扩展连接状态)
      

      HTTP MCP 调用示例

      不依赖任何 SDK,任何语言用 HTTP POST 即可调用(这也是 opencode remote 接入的方式):

      # 1. 握手
      curl -X POST -H "Content-Type: application/json" \
        -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
        http://127.0.0.1:8765/mcp
      
      # 2. 工具列表
      curl -X POST -H "Content-Type: application/json" -H "Mcp-Session-Id: <session-id-from-step-1>" \
        -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
        http://127.0.0.1:8765/mcp
      
      # 3. 调用工具(打开新标签页 / 读取标签页文本)
      curl -X POST -H "Content-Type: application/json" -H "Mcp-Session-Id: <session-id-from-step-1>" \
        -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"edge_new_tab","arguments":{"url":"https://www.bing.com"}}}' \
        http://127.0.0.1:8765/mcp
      

      Node.js 示例(读取网页正文):

      // sessionId is the Mcp-Session-Id response header from initialize.
      const res = await fetch('http://127.0.0.1:8765/mcp', {
        method: 'POST', headers: { 'Content-Type': 'application/json', 'Mcp-Session-Id': sessionId },
        body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call',
          params: { name: 'edge_read_active_tab', arguments: {} } }),
      });
      const j = await res.json();
      console.log(j.result.content[0].text);
      

      构建

      scripts\setup.cmd     # 或 cd rust && cargo build --release,产物复制到 bin/
      

      验证 Rust 服务和扩展脚本:

      cd rust
      cargo test
      cargo build --release
      cd ..
      node --check extension\background.js
      

      cargo test 当前用于验证项目可编译和测试入口;浏览器工具需要加载 Edge 扩展后才能进行端到端调用。

      天气查询脚本

      scripts/weather.js 通过 EMA2 MCP 控制真实 Edge,在 Google 查询天气并读取结果,不直接调用天气 API。需要先启动中继并确保扩展已连接:

      node scripts/weather.js "Tokyo"
      node scripts/weather.js "New York"
      node scripts/weather.js "Shanghai" --json
      

      作为模块复用:

      const { queryWeather } = require('./scripts/weather.js');
      const weather = await queryWeather('Tokyo');
      

      可通过 EMA2_MCP_URL 和 EDGE_MCP_TOKEN 覆盖 MCP 地址和鉴权;浏览器控制请求超时为 30 秒。

      常见问题

      扩展报 ERR_CONNECTION_REFUSED
      中继没在运行。先 scripts\start-bridge.cmd,扩展会自动重连(每 3s)。

      edge_execute_js 报错
      该工具走 chrome.debugger,attach 时 Edge 会短暂显示"正在调试"提示;不能在内置页面(edge:// 等)执行。若行为异常,到 edge://extensions/ 刷新扩展。

      想换端口
      环境变量 EDGE_MCP_PORT,或 ema2.exe run --port <n>;扩展侧通过 chrome.storage.local 设置 wsUrl 同步修改。

      重启电脑后中继没了
      scripts\start-bridge.cmd 是手动常驻;如需开机自启,加入「启动」文件夹或任务计划。

      安全提示

      • 中继只绑定 127.0.0.1,不要对外网暴露
      • 扩展含 debugger + <all_urls> 权限,等价于完全控制浏览器,仅用于可信的本机环境
      • 用真实登录态做高频自动化时,遵守目标网站服务条款,账号风控依旧有效

      MIT

      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - snltty/linker: 极具特色的,P2P打洞(UDP+TCP、IPV4+IPV6) + 服务器转发,实现的异地组网、内网穿透。让你那些散落在世界各地的联网设备就像在隔壁房间一样轻松访问。

      极具特色的,P2P打洞(UDP+TCP、IPV4+IPV6) + 服务器转发,实现的异地组网、内网穿透。让你那些散落在世界各地的联网设备就像在隔壁房间一样轻松访问。 - snltty/linker

      favicon

      GitHub (github.com)

      UDP P2P

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - permissionlesstech/bitchat: bluetooth mesh chat, IRC vibes

      bluetooth mesh chat, IRC vibes. Contribute to permissionlesstech/bitchat development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      蓝牙 去中心化 mesh 通讯

      发布在 软件教程
      四折光曲四
      四折光曲
    • Nginx Zstd 自动安装脚本

      [color=#FF4D4D]环境:Debian 13 Nginx1.31.1[/color]

      nano auto_zstd_nginx.sh
      
      #!/usr/bin/env bash
      
      # ==============================================================================
      # 脚本名称: auto_zstd_nginx.sh
      # 适用系统: Debian 12/13 / Ubuntu
      # 功能描述: 具备智能缓存检测的全功能 Nginx Zstd 动态模块编译与全自动更新脚本
      # ==============================================================================
      
      set -e # 遇到致命错误立即停止执行
      
      # 颜色输出定义
      GREEN='\033[0;32m'
      RED='\033[0;31m'
      YELLOW='\033[1;33m'
      NC='\033[0m'
      
      log_info() { echo -e "${GREEN}[INFO] $1${NC}"; }
      log_warn() { echo -e "${YELLOW}[WARN] $1${NC}"; }
      log_err()  { echo -e "${RED}[ERROR] $1${NC}"; exit 1; }
      
      SRC_DIR="/usr/src"
      CACHE_META="${SRC_DIR}/.nginx_zstd_cache.meta"
      MODULES_INSTALL_DIR="/usr/lib/nginx/modules"
      
      # 1. 权限检查
      if [ "$EUID" -ne 0 ]; then
          log_err "请使用 root 用户或通过 sudo 运行此脚本!"
      fi
      
      # 2. 检测当前运行的 Nginx 状态
      if ! command -v nginx &> /dev/null; then
          log_err "未检测到系统安装了 Nginx,请先安装 Nginx 主程序!"
      fi
      
      # 动态提取当前 Nginx 版本号 (例如: 1.31.0)
      NGINX_VER=$(nginx -v 2>&1 | awk -F/ '{print $2}' | cut -d' ' -f1)
      NGINX_ARGS=$(nginx -V 2>&1 | grep "configure arguments:" | sed 's/configure arguments://')
      log_info "当前系统运行的 Nginx 版本: ${NGINX_VER}"
      
      # 自动修正模块安装路径
      if [ ! -d "$MODULES_INSTALL_DIR" ]; then
          MODULES_INSTALL_DIR="/etc/nginx/modules"
      fi
      
      # 3. 智能检测远端 Zstd 库的最新版本(无需提前克隆)
      log_info "正在检测 Facebook Zstd 官方仓库最新动态..."
      if ! command -v git &> /dev/null; then
          # 如果没有 git,临时安装以便检测
          apt-get update -y || true
          apt-get install -y git wget awk
      fi
      
      # 获取远程最新 Commit ID
      REMOTE_ZSTD_COMMIT=$(git ls-remote https://github.com/facebook/zstd.git HEAD | awk '{print $1}')
      if [ -z "$REMOTE_ZSTD_COMMIT" ]; then
          log_err "无法连接到 GitHub 获取 Zstd 版本,请检查网络连接。"
      fi
      
      # 4. 缓存验证:比对版本与文件完整性
      NEED_BUILD_ZSTD=true
      NEED_BUILD_MODULE=true
      
      if [ -f "$CACHE_META" ]; then
          # 读取缓存的元数据
          # shellcheck disable=SC1090
          source "$CACHE_META"
          
          # 检查本地动态库文件是否存在
          if [ -f "/usr/local/lib/libzstd.so" ] && [ "$LAST_ZSTD_COMMIT" == "$REMOTE_ZSTD_COMMIT" ]; then
              NEED_BUILD_ZSTD=false
              log_info "✨ 检测到本地 Zstd 核心库已是最新版本 (${REMOTE_ZSTD_COMMIT:0:7}),跳过拉取与编译。"
          fi
      
          # 检查 Nginx 动态模块文件是否存在并比对版本
          if [ -f "${MODULES_INSTALL_DIR}/ngx_http_zstd_filter_module.so" ] && \
             [ -f "${MODULES_INSTALL_DIR}/ngx_http_zstd_static_module.so" ] && \
             [ "$LAST_NGINX_VER" == "$NGINX_VER" ] && \
             [ "$NEED_BUILD_ZSTD" == "false" ]; then
              NEED_BUILD_MODULE=false
          fi
      fi
      
      # 如果一切都未改变,直接退出
      if [ "$NEED_BUILD_ZSTD" == "false" ] && [ "$NEED_BUILD_MODULE" == "false" ]; then
          log_info "🚀 [完美缓存] 当前 Nginx 编译环境与 Zstd 模块均无任何更新,无需重复编译!"
          exit 0
      fi
      
      # 5. 解决 APT 签名错误并安装依赖
      log_info "正在准备同步系统依赖包..."
      # 核心容错:使用 || true 允许非关键性源(如 MySQL 签名过期)报错,不中断脚本
      apt-get update -y || log_warn "部分第三方软件源同步失败(例如系统的 MySQL 密钥未找到),脚本将忽略并尝试继续..."
      
      log_info "正在安装与更新必要的编译工具链..."
      apt-get install -y build-essential git libpcre3-dev zlib1g-dev libssl-dev debhelper wget
      
      # 如果系统残留了旧的发行版自带库,予以清除以防冲突
      if dpkg -l | grep -q libzstd-dev; then
          log_warn "清理系统自带的旧版 libzstd-dev 以防链路冲突..."
          apt-get remove -y libzstd-dev libzstd1 || true
      fi
      
      # 6. 【按需编译】最新的 Zstd 核心库
      cd ${SRC_DIR}
      if [ "$NEED_BUILD_ZSTD" == "true" ]; then
          log_info "正在下载/更新 Zstd 官方源码并进行编译..."
          if [ ! -d "zstd" ]; then
              git clone --depth 1 https://github.com/facebook/zstd.git
          fi
          cd zstd
          git fetch --depth 1 origin
          git reset --hard origin/dev || git reset --hard origin/master # 适配官方默认主分支
          
          log_info "开始编译 Zstd 核心库..."
          make -j$(nproc)
          make install
          ldconfig
          log_info "Zstd 核心库编译并安装成功。"
      fi
      
      # 7. 【按需编译】Nginx Zstd 动态模块
      cd ${SRC_DIR}
      if [ "$NEED_BUILD_MODULE" == "true" ]; then
          log_info "正在同步 Nginx 源码与动态模块源码..."
          
          # 清理旧的 Nginx 源码目录确保干净编译
          rm -rf "nginx-${NGINX_VER}" "nginx-${NGINX_VER}.tar.gz"
          wget -c "http://nginx.org/download/nginx-${NGINX_VER}.tar.gz"
          tar -zxf "nginx-${NGINX_VER}.tar.gz"
      
          if [ ! -d "zstd-nginx-module" ]; then
              git clone https://github.com/tokers/zstd-nginx-module.git
          fi
          cd zstd-nginx-module && git pull && cd ..
      
          log_info "配置 Nginx 模块环境,无缝继承原生 Nginx 编译参数..."
          cd "nginx-${NGINX_VER}"
          
          # 注入原生参数与定制的 Zstd include 路径
          eval "./configure ${NGINX_ARGS} --add-dynamic-module=${SRC_DIR}/zstd-nginx-module --with-cc-opt='-I/usr/local/include' --with-ld-opt='-L/usr/local/lib -Wl,-rpath,/usr/local/lib'"
      
          log_info "并行编译 Nginx Zstd 动态模块..."
          make modules
      
          log_info "将编译产物自动替换至 Nginx 目录..."
          mkdir -p ${MODULES_INSTALL_DIR}
          cp objs/ngx_http_zstd_filter_module.so ${MODULES_INSTALL_DIR}/
          cp objs/ngx_http_zstd_static_module.so ${MODULES_INSTALL_DIR}/
          chmod 644 ${MODULES_INSTALL_DIR}/ngx_http_zstd_*.so
          
          # 检查模块语法
          if nginx -t &>/dev/null; then
              log_info "Nginx 配置文件语法检查通过,正在平滑重启服务..."
              systemctl reload nginx || log_warn "Nginx 重载失败,请手动检查系统服务状态。"
          else
              log_warn "检测到 Nginx 配置当前存在异常,未自动重载,请执行 'nginx -t' 排查。"
          fi
      fi
      
      # 8. 写入/更新本地编译缓存元数据
      cat > "$CACHE_META" <<EOF
      LAST_NGINX_VER="${NGINX_VER}"
      LAST_ZSTD_COMMIT="${REMOTE_ZSTD_COMMIT}"
      EOF
      
      log_info "=================================================="
      log_info "🎉 全功能自动 Nginx Zstd 模块部署/更新任务成功完成!"
      log_info "当前缓存状态:Nginx [${NGINX_VER}] | Zstd [${REMOTE_ZSTD_COMMIT:0:7}]"
      log_info "=================================================="
      
      chmod +x auto_zstd_nginx.sh
      
      # 执行两次测试版本缓存
      sudo ./auto_zstd_nginx.sh
      
      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - DietrichGebert/ponytail: Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.

      Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote. - DietrichGebert/ponytail

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      @clouldon 早知道不设置32位数随机复杂密码了,,,才登上

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - Raven777777/UDP2CAL: UDP2CAL 是一个双向、低延迟的局域网音频串流系统。支持 Android 手机麦克风采集发送到 Windows 虚拟声卡(正向),同时 PC 扬声器音频回传到手机播放(反向)。Opus 编解码、零软件降噪、声学回声消除、立体声/单声道自适应。全链路零堆分配,生产-消费双协程,P2P 独占通信防抢占。

      UDP2CAL 是一个双向、低延迟的局域网音频串流系统。支持 Android 手机麦克风采集发送到 Windows 虚拟声卡(正向),同时 PC 扬声器音频回传到手机播放(反向)。Opus 编解码、零软件降噪、声学回声消除、立体声/单声道自适应。全链路零堆分配,生产-消费双协程,P2P 独占通信防抢占。 - Raven777777/UDP2CAL

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      VPS重装脚本

      Link Preview Image
      GitHub - bin456789/reinstall: 一键DD/重装脚本 (One-click reinstall OS on VPS)

      一键DD/重装脚本 (One-click reinstall OS on VPS). Contribute to bin456789/reinstall development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 作为生活本身的哲学基础的操练

      三三水这样问我,我认真的思考了一下:你觉得我们应该相信第一印象不

      额我就拿我个人为例吧(?)
      我是一个不看第一印象的人,我的习惯就是不带评价的去观察人(至少是与我不相干不会实际上冒犯到我的人)
      即使我看到一个人,比如你XXXXXX,我也不会下意识的去给人贴标签
      我承认人的多样和复杂这样的客观事实,我承认这些经历会导致一些可能的坏事或者好事
      但是额由于我接触到的可以说是纯坏或者不可理喻而且将这种不可理喻(以一种令我不愉快的方式)施加到我身上的人几乎为零
      大家对我都挺好的,所有我其实潜意识里认为世界上是好人多的(经历导致)
      冒犯到我的人额那就另说了,我对此和希特勒持相同态度()

      我觉得这个是否应该相信第一印象,是一个复杂的命题
      像我的生活环境,是不怎么需要去判断一个人的好坏的,我接触的人也很少,所以我可以不去看第一印象
      但是如果生活动荡,实际上的生活环境接触到的对自己不利的人的可能大的话,应该使用第一印象去进行一些排除

      但是我觉得这个根本的命题可能是:
      我们该如何避开那些潜在的人际威胁(?)
      我们该如何在社交中选择潜在的“好人”(?)
      但是这其实很难,正如我所说,人是很复杂的,就像你,无论你是怎么看待自己的,或者你是如何对待别人,你在对待我(某些特定的人的时候)又是不一样的,是好的

      所以我的结论是,额
      如果自己是一个会被别人以第一印象来评判的人,也就是额第一印象差的人,应该用第一印象去评价别人,因为会造成这样第一印象的环境本身就是不安定的,这时候使用第一印象评价法是可以有效的避开那些风险和威胁的
      如果自己是一个不会被人以第一印象评判的人,那也不用去用第一印象去评价别人,因为你的生活环境既然塑造了这样的你,你接触那些风险和威胁的可能本来就是极小的

      但是说到底,如果一个人带着敌意,隐藏,不可见人的目的与你接触,该被拐去棉被还是得被拐去棉被,和你是否使用第一印象去规避风险没多大关系我感觉

      当然我的社交范围很小啊,这个是前提,如果大家可以在面对冒犯直白的坦言,互相沟通,无法沟通和互相理解就各自保持距离,真心换真心才是最优解吧()保持自我的独立性,不被他人左右(谈何容易()

      发布在 哲学基础
      四折光曲四
      四折光曲