命令行使用指南

安装

环境要求

  1. node.js >= 18 (更低版本也许可以使用,但不在官方测试和支持范围)

安装 fxd-cli

  1. 首先使用终端进入你想要存放 fxd 代码的目录,没有可以创建一个,记为 FoldA
  2. npm install fxd-cli fxd-app-core 安装命令行和核心应用。
  3. sudo ln -s $PWD/node_modules/fxd-cli/index.js /usr/local/bin/fxd 创建快捷命令。

Windows 下建议使用 WSL 来运行

安装完成以后,即可以在命令行中使用fxd了。

$ fxd
Usage:
 fxd core [command] [options]

使用

安装了 fxd 后,就可以安装具体的应用了。

Check酱2

  1. 进入 FoldA
  2. npm install fxd-app-check-chan 安装Check酱2
  3. sudo npx playwright install-deps 安装无头浏览器框架 playwright 依赖
  4. fxd checkChan help 查看Check酱2帮助:
fxd checkChan help
Usage:
 fxd check-chan [command] [options]

command: main|check|watch:
 --url <string>	要打开的页面 URL (required)
 --headless <boolean>	是否使用无头模式 (default: true)
 --selectors <string>	要检测的元素的 CSS 选择器,多个用逗号分隔 (default: body) (required)
 --prejs <string>	页面加载完成后执行的自定义 JavaScript 代码
 --prejs_args <string>	自定义 JavaScript 代码的参数
 --preplay <string>	页面加载完成后执行的自定义 Playwright 代码
 --timeout <number>	 Playwright 操作超时时间,单位毫秒 (default: 60000)
 --list <boolean>	 选择器是否返回元素列表 (default: false)
 --user <string>	浏览器使用的用户目录 (default: default)
 --format <string>	返回的数据格式 (default: text)
 --wait_type <string>	等待元素出现的方式 (default: domcontentloaded)

command: watch:
 --sendkey <string>	填入后,检测到变化时会调用Server酱发消息
 --apprise_server_url <string>	apprise的Server URL;需安装 apprise 命令行以后才可使用
 --task_title <string>	显示在动态中,非命令行模式则无需填写
 --feed_publish <boolean>	是否发布为Feed,将显示在动态页面 (default: false)
 --feed_as_public <boolean>	Feed 是否公开 (default: true)

命令

应用可以包含多个命令,在help命令中会显示命令和对应的参数。在上边的例子中,check-chan 这个应用,包含了 maincheckwatch 三个命令, main 为入口命令,在不指定时命令是作为默认命令使用。

  1. command: main|check|watch 表示以下参数是 maincheckwatch 三个命令都支持的。
  2. command: watch: 表示以下参数是 watch 特有的。

check命令

check命令用于获取某个网页上某个选择器(selector,可以用 Check酱浏览器插件或者Chrome浏览器DevTools获得)的内容。

基本命令

使用实例,获取方糖气球首页第一篇文章的标题:

fxd checkChan --url="https://ftqq.com/" --selectors=".entry-title"

执行结果:

$ fxd checkChan --url="https://ftqq.com/" --selectors=".entry-title"
检测到的数据 [
  {
    "selector": ".entry-title",
    "html": "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>",
    "text": "看这里看这里",
    "meta": {
      "html": [
        "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
      ],
      "text": [
        "看这里看这里"
      ]
    }
  }
]

JSON输出

可以添加 --format=json 参数,保证输出是JSON:

fxd checkChan --url="https://ftqq.com/" --selectors=".entry-title" --format=json
{
    "merged_html": "\n\n<a href=\"https://ftqq.com/notice/\">看这里看这里</a>",
    "merged_text": "\n\n看这里看这里",
    "output": "\n\n看这里看这里",
    "data": [
        {
            "selector": ".entry-title",
            "html": "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>",
            "text": "看这里看这里",
            "meta": {
                "html": [
                    "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
                ],
                "text": [
                    "看这里看这里"
                ]
            }
        }
    ]
}

返回列表

默认情况下,只返回匹配选择器的第一个值,如果想要返回全部,可增加 --list=true 参数:

fxd checkChan --url="https://ftqq.com/" --selectors=".entry-title" --list=true
检测到的数据 [
  {
    "selector": ".entry-title",
    "html": "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>\n<a href=\"https://ftqq.com/real-node-package/\">方糖迷因·Node Package</a>\n<a href=\"https://ftqq.com/telechan/\">Tele 酱:基于 Telegram 和 Vercel 的开源 Server 酱实现</a>\n<a href=\"https://ftqq.com/member-prism/\">开源项目:Member Prism</a>\n<a href=\"https://ftqq.com/docker2saas/\">开源项目:Docker2SaaS</a>\n<a href=\"https://ftqq.com/serverchan2/\">Server酱实战课</a>",
    "text": "看这里看这里\n方糖迷因·Node Package\nTele 酱:基于 Telegram 和 Vercel 的开源 Server 酱实现\n开源项目:Member Prism\n开源项目:Docker2SaaS\nServer酱实战课",
    "meta": {
      "html": [
        "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>",
        "<a href=\"https://ftqq.com/real-node-package/\">方糖迷因·Node Package</a>",
        "<a href=\"https://ftqq.com/telechan/\">Tele 酱:基于 Telegram 和 Vercel 的开源 Server 酱实现</a>",
        "<a href=\"https://ftqq.com/member-prism/\">开源项目:Member Prism</a>",
        "<a href=\"https://ftqq.com/docker2saas/\">开源项目:Docker2SaaS</a>",
        "<a href=\"https://ftqq.com/serverchan2/\">Server酱实战课</a>"
      ],
      "text": [
        "看这里看这里",
        "方糖迷因·Node Package",
        "Tele 酱:基于 Telegram 和 Vercel 的开源 Server 酱实现",
        "开源项目:Member Prism",
        "开源项目:Docker2SaaS",
        "Server酱实战课"
      ]
    }
  }
]

可视化

添加 --headless=false 参数,可以将背后工作的浏览器显示出来,从而更直观地看到整个执行过程。

如果你是在远程服务器上执行,需要安装桌面环境和 VNC 才能看到界面,否则会提示 Looks like you launched a headed browser without having a XServer running.

base64参数传递

在通过命令行传递参数时,如果参数中包含众多换行和特殊字符,会非常容易出错。因此,所有的参数都可以用过base64的方式来传递。

假设参数为 a ,传递的值为 base64: 前缀 + base64(JSON.stringify(a)) 。

以下是 fxd 读取参数的源码,可以参考其逻辑

if( content.startsWith('base64:') )
{
    content = jsonDecode(Buffer.from(content.replace('base64:', ''), 'base64').toString());
}

watch 命令

check命令只负责获取数据,watch命令除了完整执行check的逻辑,还会比较每次获得的内容,并发送通知。

通过Server酱发送通知

 fxd checkChan watch --url="https://ftqq.com/" --selectors=".entry-title" --sendkey="SCT..."
检测到的数据 [
  {
    "selector": ".entry-title",
    "html": "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>",
    "text": "看这里看这里",
    "meta": {
      "html": [
        "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
      ],
      "text": [
        "看这里看这里"
      ]
    }
  }
]
不存在历史记录,将当前结果保存为历史记录

定时执行(比如把这个命令加入到 crontab)watch命令,这样在内容变动时,可以收到 Server酱推送:

fxd checkChan watch --url="https://ftqq.com/" --selectors=".entry-title" --sendkey="SCT..."
检测到的数据 [
  {
    "selector": ".entry-title",
    "html": "<a href=\"https://ftqq.com/notice/\">看这里看这里1</a>",
    "text": "看这里看这里1",
    "meta": {
      "html": [
        "<a href=\"https://ftqq.com/notice/\">看这里看这里1</a>"
      ],
      "text": [
        "看这里看这里1"
      ]
    }
  }
]
检测到变动  {
-  merged_html: "\n\n<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
+  merged_html: "\n\n<a href=\"https://ftqq.com/notice/\">看这里看这里1</a>"
-  merged_text: "\n\n看这里看这里"
+  merged_text: "\n\n看这里看这里1"
-  output: "\n\n看这里看这里"
+  output: "\n\n看这里看这里1"
   data: [
     {
-      html: "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
+      html: "<a href=\"https://ftqq.com/notice/\">看这里看这里1</a>"
-      text: "看这里看这里"
+      text: "看这里看这里1"
       meta: {
         html: [
-          "<a href=\"https://ftqq.com/notice/\">看这里看这里</a>"
+          "<a href=\"https://ftqq.com/notice/\">看这里看这里1</a>"
         ]
         text: [
-          "看这里看这里"
+          "看这里看这里1"
         ]
       }
     }
   ]
 }

存在sendkey,发送结果到Server酱 {"code":0,"message":"","data":{"pushid":"1502...","readkey":"SCT...","error":"SUCCESS","errno":0}}

通过 Apprise 发送通知

除了使用 Server酱,你还可以通过 Apprise 将消息发送到上百个通道。

在传递参数前,你需要安装 Apprise 的命令行工具。

pip install apprise

如果运行环境没有 pip,你需要先安装它

安装完成后,注意按提示将 apprise 所在路径加入到 PATH 中:

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ubuntu/.local/bin"

然后通过 --apprise_server_url 参数传递 Server URL:

fxd checkChan watch --url="https://ftqq.com/" --selectors=".entry-title" --apprise_server_url="schan://SCT..."

上边的例子是用过 Apprise 调用Server酱通道;你可以随意更换为其他通道。可以参照它的文档来拼接 Server URL。

带状态页面和 KeepLive

原理

Check酱2应用的原理,是在背后启动一个浏览器,然后通过交互命令去读取浏览器中的页面信息。为了访问带状态的页面,我们需要先在对应的网站上进行登录。

这些操作我们可以通过 fxd-app-keep-live 应用来完成。

KeepLive

安装

  1. 进入 FoldA
  2. npm install fxd-app-keep-live 安装 KeepLive
  3. fxd keepLive help 查看应用帮助:
 fxd keepLive help
Usage:
 fxd keep-live [command] [options]

command: main|check:
 --check_url <string>	状态检测页面URL (required)
 --check_selector <string>	状态检测页面待检测元素的selector (default: body)
 --check_text <string>	状态检测页面待检测元素应该包含的文本
 --user <string>	浏览器使用的用户目录 (default: default)
 --timeout <number>	状态检测页面加载超时时间 (default: 5000)
 --headless <boolean>	是否使用无头模式 (default: true)
 --format <string>	返回的数据格式 (default: text)

command: auth:
 --auth_url <string>	登录页面URL (required)
 --user <string>	浏览器使用的用户目录 (default: default)

command: refresh:
 --refresh_url <string>	刷新页面URL (required)
 --user <string>	浏览器使用的用户目录 (default: default)
 --headless <boolean>	是否使用无头模式 (default: true)
 --timeout <number>	状态检测页面加载超时时间 (default: 5000)
 --format <string>	返回的数据格式 (default: text)

命令

KeepLive 包含以下命令:

  1. auth: 打开浏览器,等待用户登录后关闭
  2. refresh: 用浏览器刷新页面,以保持cookie/session活跃,可以把这个命令加入到crontab,定时执行
  3. check: 用浏览器监测某页面某元素的值,用来判断用户状态是否失效。可以把可以把这个命令加入到crontab,定时执行

auth 命令会打开浏览器,因此只能在配置了桌面的环境运行

打开浏览器:

fxd keepLive auth --auth_url="https://m.weibo.cn"

手动登录微博以后,关闭浏览器。这时候再运行 fxd checkChan --url="https://m.weibo.cn/..." ,获取到的页面就是已经登录状态的了。

  1. 注意登录后一定时间后会过期,需要重新按上述步骤登录
  2. 定时刷新页面,可以延迟过期时间,可以使用 refresh 命令+Crontab来实现
  3. 如果你希望保持多个不同用户的登录,可以将 --user 设置为不同的值。并在使用 fxd checkChan 时传入同样的参数。