最近看到其他博主发布了定时签到相关的功能,结合别人的内容,抓包了邻里邦的相关接口数据,记一下邻里邦APP的自动签到功能实现。
首先需要获取到登录token,再用token定时调用签到接口每天签到,同时为了防止token过期,需要定期刷新token,自动化脚本的运行可以采用青龙面板来执行。
- 打开青龙面板-脚本管理,创建一个名为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()
- 青龙面板-定时任务,添加如下几个定时任务
-
任务一
- 名称:
邻里邦获取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 * * *
- 名称:
- 如此便配置OK了,具体使用步骤如下。
3.1、先从APP点击获取短信验证码,再把手机号和验证码写入times_get_token.js的脚本中替换如此。
3.2、运行任务一,获取登录token,会自动把token写入config.json中
3.3、运行任务二,刷新token,每两个小时会自动执行一下
3.4、运行任务四,签到,每天中午十二点十二分完成签到