最近看到其他博主发布了定时签到相关的功能,结合别人的内容,抓包了邻里邦的相关接口数据,记一下邻里邦APP的自动签到功能实现。
首先需要获取到登录token,再用token定时调用签到接口每天签到,同时为了防止token过期,需要定期刷新token,自动化脚本的运行可以采用青龙面板来执行。

  1. 打开青龙面板-脚本管理,创建一个名为times_script的文件夹,在此文件夹下定义如下几个文件

1.1、config.json,用于存在获取的token

{
  "token": "",
  "refreshToken": ""
}

1.2、times_get_token.js,获取登录token的脚本(需要替换请求入参里面的username和password,对应手机号和验证码)

const fs = require("fs")
const path = require("path")
const axios = require("axios")

// 定义config.json文件的路径,假设它与脚本在同一目录下
const configPath = path.join(__dirname, "config.json")

// 读取文件
function readConfigFile() {
  let existingData = JSON.parse(fs.readFileSync(configPath, "utf8"))
  console.log("读取config.json数据:", existingData)
  return existingData
}

// 写入数据
function writeConfigFile(data) {
  try {
    let { token, refreshToken } = data
    console.log("token", token, refreshToken)
    let configData = readConfigFile()
    if (token !== "") {
      configData.token = token
    }
    if (refreshToken !== "") {
      configData.refreshToken = refreshToken
    }
    fs.writeFileSync(configPath, JSON.stringify(configData, null, 2), "utf8")
    console.log("修改后的config.json数据:", readConfigFile())
  } catch (error) {
    console.log("修改config.json时出错:", error.message)
  }
}

// 通过验证码获取token
async function getNewToken() {
  let params = {
    grant_type: "sms_code",
    scope: "all",
    client_id: "mini_charge",
    client_secret: "times",
    username: "13212312312",
    password: "123456",
    areaCode: "86",
  }

  let { data } = await axios.post(
    "https://m-center-prod-linli.timesgroup.cn/times/times-bff/bff/api-c/v1/oauth/token",
    params,
    {}
  )
  console.log("获取token结果:", data)
  if (data.code === 200) {
    writeConfigFile({
      token: data.data.authUserDTO.token,
      refreshToken: data.data.authUserDTO.refreshToken,
    })
  } else {
    console.log("获取token时出错:", data.message)
  }
}
// 获取token
getNewToken()

1.3、times_refresh_token.js,定义刷新token的脚本,保持token不失效

const fs = require("fs")
const path = require("path")
const axios = require("axios")
const FormData = require("form-data")
// 定义config.json文件的路径,与脚本在同一目录下
const configPath = path.join(__dirname, "config.json")

// 读取文件
function readConfigFile() {
  let existingData = JSON.parse(fs.readFileSync(configPath, "utf8"))
  console.log("读取config.json数据:", existingData)
  return existingData
}

// 写入数据
function writeConfigFile(data) {
  try {
    let { token, refreshToken } = data
    console.log("token", token, refreshToken)
    let configData = readConfigFile()
    if (token !== "") {
      configData.token = token
    }
    if (refreshToken !== "") {
      configData.refreshToken = refreshToken
    }
    fs.writeFileSync(configPath, JSON.stringify(configData, null, 2), "utf8")
    console.log("修改后的config.json数据:", readConfigFile())
  } catch (error) {
    console.log("读取或修改config.json时出错:", error.message)
  }
}

// 刷新token
async function startRefreshToken() {
  let configData = readConfigFile()
  console.log("获取configData:", configData)
  if (configData.token) {
    let formData = new FormData()
    formData.append("grant_type", "refresh_token")
    formData.append("client_secret", "times")
    formData.append("client_id", "app_c")
    formData.append("scope", "all")
    formData.append("refresh_token", configData.refreshToken)
    let config = {
      headers: {
        "Content-type": "multipart/form-data",
      },
    }
    console.log("请求参数:", formData)
    let { data } = await axios.post(
      "https://m-center-prod-linli.timesgroup.cn/times/auth/oauth/token",
      formData,
      config
    )
    console.log("刷新token结果:", data)
    if (data.code === 200) {
      writeConfigFile({
        token: data.data.token,
        refreshToken: data.data.refreshToken,
      })
    } else {
      console.log("刷新tokenn时出错:", data.message)
    }
  }
}
// 刷新token
startRefreshToken()

1.4、times_signin.js,签到脚本,需要替换会员id

const fs = require("fs")
const path = require("path")
const axios = require("axios")
// 定义config.json文件的路径,假设它与脚本在同一目录下
const configPath = path.join(__dirname, "config.json")

// 读取文件
function readConfigFile() {
  let existingData = JSON.parse(fs.readFileSync(configPath, "utf8"))
  console.log("读取config.json数据:", existingData)
  return existingData
}

function getFormattedDateTime() {
  const now = new Date()
  const year = now.getFullYear()
  const month = (now.getMonth() + 1).toString().padStart(2, "0")
  const day = now.getDate().toString().padStart(2, "0")
  const hour = now.getHours().toString().padStart(2, "0")
  const minute = now.getMinutes().toString().padStart(2, "0")
  const second = now.getSeconds().toString().padStart(2, "0")
  return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}

// 签到
async function startSignin() {
  let configData = readConfigFile()
  let currentTime = getFormattedDateTime()
  console.log(currentTime)
  if (configData.token) {
    let params = {
      behaviourId: 10,
      clientCode: "sys_linlibang",
      createTime: currentTime,
      mapPamater: {
        sign: currentTime,
      },
      memberId: "", //会员id,需要替换
    }
    let config = {
      headers: {
        Authorization: "Bearer " + configData.token,
        "Content-type": "application/json",
      },
    }
    try {
      console.log("请求参数:", params)
      let { data } = await axios.post(
        "https://m-center-prod-linli.timesgroup.cn/times/member-bff/user-behaviour//api-c/v1/user-behaviour/collect",
        params,
        config
      )
      console.log("签到结果:", data)
      if (data.code === 200) {
        console.log("签到成功!")
      } else {
        console.log("签到n时出错:", data.message)
      }
    } catch (err) {
      console.log("err", err)
    }
  }
}
// 签到
startSignin()
  1. 青龙面板-定时任务,添加如下几个定时任务
  • 任务一

    • 名称:邻里邦获取token
    • 命令/脚本:task times_script/times_get_token.js
    • 定时规则: 0 0 1 1 *
  • 任务二

    • 名称:邻里邦刷新token(每二小时执行一次)
    • 命令/脚本:task times_script/times_refresh_token.js
    • 定时规则: 0 */2 * * *
  • 任务三

    • 名称:邻里邦签到
    • 命令/脚本:task times_script/times_signin.js
    • 定时规则: 12 12 * * *
  1. 如此便配置OK了,具体使用步骤如下。
    3.1、先从APP点击获取短信验证码,再把手机号和验证码写入times_get_token.js的脚本中替换如此。
    3.2、运行任务一,获取登录token,会自动把token写入config.json中
    3.3、运行任务二,刷新token,每两个小时会自动执行一下
    3.4、运行任务四,签到,每天中午十二点十二分完成签到