跳转至

开源阅读源制作登陆示例

预计阅读时长 : 4 分钟

默认登录逻辑

需要登录的书源,默认使用内置 webView 访问 URL 登录网站,获取 Cookie 后可以再后续的网络访问中调用。

自定义登陆界面

如果需要自定义登陆界面,则需要配合使用以下两个配置项,通过 JS 代码实现登录逻辑。

登陆界面/登录 UI (loginUi)

使用 loginUi 定义登陆界面,包括输入框和按钮两种类型。

[
    {
        "name": "telephone",
        "type": "text"
    },
    {
        "name": "password",
        "type": "password"
    },
    {
        "name": "获取验证码",
        "type": "button",
        "action": "getVerificationCode()"
    }
    {
        "name": "注册",
        "type": "button",
        "action": "http://www.yooike.com/xiaoshuo/#/register?title=%E6%B3%A8%E5%86%8C"
    }
]

在登录弹出窗口的右上角,点击 将调用 login 函数。

登陆地址/登录 URL (loginUrl)

自定义登录界面时,必须实现 login 函数,以于获取包含登录信息的 Header,并再后续的网络请求中使用。

getVerificationCode() 函数则对应了登录界面中的 获取验证码 按钮,用于获取验证码。(需要实现)

function login() {
  var loginInfo = source.getLoginInfo();
  var json = java
    .connect(
      'https://www.kaixin7days.com/login,{"method":"POST","body":' +
        loginInfo +
        "}"
    )
    .body();
  var loginRes = JSON.parse(json);
  var header = null;
  if (loginRes.statusCode == 200) {
    var accessToken = {
      Authorization: "Bearer " + loginRes.content.accessToken,
    };
    header = JSON.stringify(accessToken);
    source.putLoginHeader(header);
  }
}

function getVerificationCode() {
  java.log("登录UI按钮:获取到手机号码" + result.get("telephone"));
}

使用登录信息

在后续的网络请求中,可以通过 source.getLoginHeader() 获取包含了登录信息的 header,并作为参数实现登录状态访问。

@js:
let header = JSON.parse(source.getLoginHeader())
let json = ''
let j = null
if (header != null) {
    json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{"method":"POST","body":{}}', header).body()
    j = JSON.parse(json)
 }
if(j == null || j.statusCode != 200) {
    source.login()
    java.getHeaderMap().putAll(source.getHeaderMap(true))
    json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{"method":"POST","body":{} }', header).body()
    j = JSON.parse(json)
 }
let fls = j.content
let fx = []
for(let i = 0; i < fls.length; i++) {
    fx.push({
        title: fls[i].categoryName,
        url: '/book-service/bookMgt/getAllBookByCategroyId,{"method":"POST","body":{"categoryIds": "' + fls[i].associationCategoryIDs + '","pageNum": {{page}},"pageSize": 100}}'
 })
 }
result = JSON.stringify(fx)

登陆检测 (loginCheckJs)

登录检测脚本的主要作用是对当前页面的返回值进行判断,确定是否符合登录后返回值的预期,并根据返回值进行相应的处理。

如下代码中,如果返回值不符合预期,则重新执行登录流程,如果符合预期,则返回 result 代表的 responseBody 对象供后续规则使用。

let response = result;
let body = JSON.parse(result.body());
if (body.statusCode == 301) {
  source.login();
  java.getHeaderMap().putAll(source.getHeaderMap(true));
  response = java.getStrResponse();
} else if (body.statusCode == 200) {
  return response;
} else {
  throw body.message;
}
result = response;