为什么
fxd的很多应用(比如 网页监测应用 fxd-checkchan )底层都使用了无头浏览器,通过指定用户目录(即 –user 参数)我们可以将浏览器的状态持久化。但是,一个账号如果长时间不刷新页面,它的Cookie或者其他状态数据就可能过期。
是什么
为了帮助无头浏览器能长期保持状态,我们开发了 fxd-app-keep-live2 ,它可以弹出一个界面供你登录(auth方法),然后再定时刷新页面来保持登录态(refresh方法)。
需要注意以下两点:
- fxd-app-keep-live 已经弃用,请使用 fxd-app-keep-live2
- 定时功能并不是 fxd-app-keep-live2 自带的,你需要把它加入 cron 或者 FlowDeer 客户端
如何使用
fxd-app-keep-live2 是一个 fxd app,你可以通过 fxd-cli 或者 FlowDeer 运行它。
在安装完成 fxd-cli 之后,你可以通过以下命令直接安装 fxd-app-keep-live2
fxd _install fxd-app-keep-live2
然后运行帮助命令,可以查看它的方法和对应的参数:
fxd keepLive2 help
Version:
1.0.3
Usage:
fxd keep-live2 [command] [options]
Command - main|auth|check|refresh:
--user <string> 浏览器使用的用户目录 (default: default)
--timeout <number> 状态检测页面加载超时时间,单位毫秒 (default: 5000)
--headless <boolean> 是否使用后台模式 (default: true)
--format <string> 返回的数据格式 (default: text)
--browser <string> 浏览器类型 (default: chrome)
Command - auth:
--auth_url <string> 登录页面URL,用于前台打开给用户手动登录
Command - check:
--check_url <string> 状态检测页面URL,设置后会检测页面状态是否过期
--check_selector <string> 状态检测页面待检测元素的selector (default: body)
--check_text <string> 状态检测页面待检测元素应该包含的文本,如果为空,则只判断元素是否存在
Command - refresh:
--refresh_url <string> 刷新页面URL,设置后每次运行命令时会刷新一次,用来维护状态
可以看到,keepLive2 包含了三个方法,用途分别如下:
- auth:弹出浏览器界面,供用户手动登录使用
- refresh:刷新指定url,用来给登录态续期
- check:检查登录态是否过期
使用实例
以维持微博的登录态为例,我们首先通过 auth 方法打开浏览器:
fxd keepLive2 auth --authUrl="https://m.weibo.cn"
在我们手动登录后,关闭浏览器。短期内,无头浏览器会保持登录态。如果你想区分不同的用户,可以手动指定 user 参数。
然后我们可以通过 refresh 方法来定时刷新登录态:
fxd keepLive2 refresh --refreshUrl="https://m.weibo.cn" --format="json"
会返回:
{
"action": "refresh",
"message": "done",
"output": "refreshed"
}
注意这里我们直接刷新了微博的首页,不同的网站对应的页面不同。
理想状态下,只要定时间隔不太长,这个登录态就能一直保持下去。
但总有意外会发生,比如你家里断网了、微博宕机了。这时候,我们就需要用 check 方法来检测浏览器的状态。
check 的原理是用浏览器访问某些只有登录用户才能访问的页面,如果包含预期的信息,我们则认为状态没有过期。以下命令可以检测微博登录态是否过期:
fxd keepLive2 check --checkUrl="https://m.weibo.cn/profile" --checkSe
lector="div.profile-header" --format="json"
成功返回:
{
"url": "https://m.weibo.cn/profile",
"selector": "div.profile-header",
"count": 1,
"selectedText": "\n 设置\n Easy微博认证:互联网科技博主6万微博1153关注64.2万粉丝编辑个人资料",
"ret": true,
"output": "success"
}
失败返回:
{
"url": "https://m.weibo.cn/profile",
"selector": "div.profile-header",
"count": 0,
"ret": false,
"output": "failed"
}
使用 keepLive2 理论上可以检测任意可用浏览器正常访问的网站的登录态。
衍生应用
由于微博登录是一个非常常用的场景,我们可以对 keepLive2 进行封装,将其作为一个单独应用:weiboLive。
fxd weiboLive help
Version:
1.0.0
Usage:
fxd weibo-live [command] [options]
Command - main|auth|check|refresh:
--user <string> 浏览器使用的用户目录 (default: default)
--timeout <number> 状态检测页面加载超时时间,单位毫秒 (default: 5000)
--headless <boolean> 是否使用后台模式 (default: true)
--format <string> 返回的数据格式 (default: text)
--browser <string> 浏览器类型 (default: chrome)
由于预置了相关参数,你只需要指定下方法即可:
fxd weiboLive auth
fxd weiboLive refresh
fxd weiboLive check
这种封装非常简单,fxd-app-weibo-live 的源码只有以下几行:
import { FxdSdk, getPackageInfo } from 'fxd-sdk';
import FxdKeepLive2 from 'fxd-app-keep-live2';
export default class FxdWeiboLive extends FxdKeepLive2 {
constructor() {
super();
this.sdk = new FxdSdk(getPackageInfo(import.meta.url));
}
async main(args, opts, command, cli_path) {
return this.help();
}
async auth(args, opts, command) {
// 指定 authurl
opts['auth_url'] = 'https://m.weibo.cn';
return super.auth(args, opts, command);
}
async refresh(args, opts, command) {
// 指定 refreshurl
opts['refresh_url'] = 'https://m.weibo.cn';
return super.refresh(args, opts, command);
}
async check(args, opts, command) {
// 指定 checkurl
opts['check_url'] = 'https://m.weibo.cn/profile';
opts['check_selector'] = 'div.profile-header';
return super.check(args, opts, command);
}
}
你可以参考它,自行封装其他网站的保活APP。更多关于FxdApp开发的信息,可以阅读Fxd官方手册中相关章节。
fxd-app-weibo-live check方法中 opts[‘check_selector’]=‘span.m-text-cut’ 这样获取的就是微博用户名了 format 默认返回json会不会更好 现在默认返回的是text
默认返回 text 是为了方便 fxd-cli 命令行。不过你可以按自己的喜好封装自己的npm包使用。