命令行使用指南
安装
环境要求
- node.js >= 18 (更低版本也许可以使用,但不在官方测试和支持范围)
安装 fxd-cli
- 首先使用终端进入你想要存放 fxd 代码的目录,没有可以创建一个,记为
FoldA
。 npm install fxd-cli fxd-app-core
安装命令行和核心应用。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
- 进入
FoldA
npm install fxd-app-check-chan
安装Check酱2sudo npx playwright install-deps
安装无头浏览器框架 playwright 依赖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
这个应用,包含了 main
、check
和 watch
三个命令, main
为入口命令,在不指定时命令是作为默认命令使用。
command: main|check|watch
表示以下参数是main
、check
和watch
三个命令都支持的。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
安装
- 进入
FoldA
npm install fxd-app-keep-live
安装 KeepLivefxd 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
包含以下命令:
auth
: 打开浏览器,等待用户登录后关闭refresh
: 用浏览器刷新页面,以保持cookie/session活跃,可以把这个命令加入到crontab,定时执行check
: 用浏览器监测某页面某元素的值,用来判断用户状态是否失效。可以把可以把这个命令加入到crontab,定时执行
auth
命令会打开浏览器,因此只能在配置了桌面的环境运行
打开浏览器:
fxd keepLive auth --auth_url="https://m.weibo.cn"
手动登录微博以后,关闭浏览器。这时候再运行 fxd checkChan --url="https://m.weibo.cn/..."
,获取到的页面就是已经登录状态的了。
- 注意登录后一定时间后会过期,需要重新按上述步骤登录
- 定时刷新页面,可以延迟过期时间,可以使用
refresh
命令+Crontab来实现 - 如果你希望保持多个不同用户的登录,可以将
--user
设置为不同的值。并在使用fxd checkChan
时传入同样的参数。