fxd-app-keep-live2:账号保活APP

为什么

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官方手册中相关章节

如果对文章内容有疑问或者有经验分享,请在评论中留言,我们会及时回复。
2 comments
  1. fxd-app-weibo-live check方法中 opts[‘check_selector’]=‘span.m-text-cut’ 这样获取的就是微博用户名了 format 默认返回json会不会更好 现在默认返回的是text

发表回复