注意
关于备份奖励领取失败的情况说明:目前没有抓包去自动达到领取备份奖励的条件
所以如果需要领取备份奖励。需要你的手机/电脑开启自动备份 且当天 登录成功一次。【手机可以开启后台自启动】
如果你手机都不启动阿里云盘 他自然今天没法备份 自然就没法领取备份奖励。
关于 pusplus推送失败的情况说明:运行的时候调用的是金山云的服务器IP 。可能由于部分IP调用过多,被pusplus推送的官方拉黑IP了
所以导致了可能提示(XXX禁止访问 )导致推送失败 但是每天都是正常签到的 。这点无需担心
功能以及优点
不需要服务器部署、直接一个wps云文档即可使用。
理论上实现了token的自动更新 目前测试没问题 (只需要获取token一次、无需后续抓包)。
利用自己想到的避开了检测【随机时间延迟、不同时间签到】(IP没改,因为很多人不会用)。
根据随机值决定签到的时间。避开了每天都是那个时间签到的检测。
增加了手机开启自动备份的签到奖励【需要手机开启备份功能 并且开启自启动 不然当天不登录阿里云盘则无法领取】
不需要开电脑、不需要任何成本,都是云运行, 一次获取,理论上可以用很久,具体多久就得到时候测试看了。
使用方法
1.首先 打开wps云文档的连接 并且另存为 保存成你自己的!
【金山文档】 阿里云签到模版-另存为:https://kdocs.cn/l/coSH7LfVJjNt
2.点击【效率】-【高级开发】-【AirScript脚本编辑器】 查看 【阿里云盘签到】的 是否存在(如不存在请复制最下方的代码 放进去)
3. 打开阿里云盘 :https://www.aliyundrive.com/ 登录后 连续按两次右键 选择 检查/审查元素 看不同浏览器的配置 或者更简单的 按F12 即可
4.输入以下代码 将命令粘贴到【控制台】-【回车】
copy(JSON.parse(localStorage.token).refresh_token); console.log(JSON.parse(localStorage.token).refresh_token);
5.将获取到的token粘贴到【A1】单元格顺便将token获取时间填入,不填当token大于20天时无法更换
6.获取pushplus和Serverchan的token
两个选择一个即可,两个选择一个即可,推荐pushplus
公主号:pushplus推送加 关注后 发送“token” 即可获得token 复制 token 粘贴到推送(PushPlus) 的那一栏里(D列)
Serverchan-扫码登录
Serverchan:https://sct.ftqq.com/ 右上角 登入 登入后 拿到如下图的sendkey 粘贴到推送(ServerChan)的那一栏里(C列)
如果你到了这里 就90%大功告成了!
7.接下来就是 测试!
如果推送成功/日志提示 签到成功 就说明你已经成功了
【如果提示:随机值不为1 不签到】【如果提示:随机值不为1 不签到】
请再次点击运行!请再次点击运行!请再次点击运行!
8。创建定时任务 【可以创建多个 可以一个 建议多个】
你们自己可以修改的地方:
1.代码第3行:var dengdai = 1 即:1是延迟0-1分钟内 取一个秒数 就是0到60秒取一个随机数 不建议修改
2.代码第6行:var renwu = 2 即:你加了几个定时任务 然后-1 就是你定时2个任务 就写2 定时3个 就写2 定时4、5个建议也写3 建议最大到2或者3
简言之:比如你定时任务X个 然后每一次执行都会从1 到 你设置的数 之间取一个随机值 是1 才签到
PS:如果你只需要一个定时任务 renwu 请写1。
3.代码第7行:var zong = 10 即: 一共执行10个任务 如果你需要多增 那就在前10行内随意一行 :插入行 就可以了(保持原作者的第11 行一直在所有token最下面)
4.最重要的,如果你手机没有开启 自动备份功能 不需要领取自动备份的奖励的话!
第11行的 var backups = true true 改成 false 如果你需要领取 就不动!
配置过程中可能遇到的问题
1.问:配置完成,运行脚本出现{“code”:999,”msg”:”所在IP:120.92.xx.xxx禁止访问”,”data”:null}
答:切换网络再次运行或过会在尝试
以下是代码
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
var date = `${new Date().getMonth() + 1}-${new Date().getDate().toString().padStart(2, '0')}`
//需要修改的地方
var dengdai = 2
//意思是 等待多少分钟去登录 等待多少分钟去签到 默认1-15分钟之间 改了15就是1-X分钟之间 取随机的
var renwu = 2 //建议定时2个任务 就写1 定时3个任务就写2 定时任务-1或者-2都可以 他是从1到renwu之间 取一个随机数
var zong = 10 //总任务 就是你有几个号你就写几 就行 默认10 也可以 如果多10行 就在10行以内 右键 插入行
var backups = true //是否领取备份奖励 是写true 不领取写false
function sleep(d) {
for (var t = Date.now(); Date.now() - t <= d;); // 使程序暂停执行一段时间
}
function log(message) {
console.log(message); // 打印消息到控制台
// TODO: 将日志写入文件
}
var tokenColumn = "A"; // 设置列号变量为 "A"
var qiandaoColumn = "B"; // 设置列号变量为 "B"
var serverchanColumn = "C"; // 设置列号变量为 "C"
var pushplusColumn = "D"; // 设置列号变量为 "D"
var pushColumn = "E"; // 设置列号变量为 "E"
var logindateColumn = "F"; // 设置列号变量为 "F"
var signinresult = "G"//签到的结果 设置列号变量为 "G"
for (let row = 1; row <= zong; row++) { // 循环遍历从第 1 行到第 10 行的数据
var refresh_token = Application.Range(tokenColumn + row).Text; // 获取指定单元格的值
var qiandao = Application.Range(qiandaoColumn + row).Text; // 获取指定单元格的值
var servertoken = Application.Range(serverchanColumn + row).Text; // 获取指定单元格的值
var pushtoken = Application.Range(pushplusColumn + row).Text; // 获取指定单元格的值
var push = Application.Range(pushColumn + row).Text; // 获取指定单元格的值
var ldate = Application.Range(logindateColumn + row).Text; // 获取指定单元格的值
var signin = Application.Range(signinresult + row).Text; // 获取签到结果
if (refresh_token != "") { // 如果刷新令牌不为空
if (qiandao == "是") {//签到&领奖开关
if (signin !== date + '已签到') {
var randomInt = Math.floor(Math.random() * renwu) + 1
//randomInt 中的3 可以修改 写3就是 从1到3取一个随机整数 比如2 当他 = 1 的时候 签到才会执行
if (randomInt === 1) {//等于1 就开始签到 不等于1 都不签到
//获取Bearer-token
var mtid = parseInt(Math.floor(Math.random() * 60000 * dengdai)) + 6000
var loginresult = "登录延迟" + parseFloat((mtid / 120000).toFixed(2)) + "分,即" + + parseFloat((mtid / 2000).toFixed(2)) + "秒"
console.log("登录延迟" + parseFloat((mtid / 120000).toFixed(2)) + "分,即" + + parseFloat((mtid / 2000).toFixed(2)) + "秒")
Time.sleep(mtid / 2)
let data = HTTP.post("https://auth.aliyundrive.com/v2/account/token",
JSON.stringify({
"grant_type": "refresh_token",
"refresh_token": refresh_token
})
)
data = data.json()
var access_token = data['access_token']
var phone = data["user_name"]
if (access_token == undefined) { // 如果报错
console.log("单元格【" + tokenColumn + row + "】token执行出错,请检查token或者API接口");
continue; // 跳过当前行的后续操作()
}
var mtid = parseInt(Math.floor(Math.random() * 60000 * dengdai / 2)) + 6000
var signresult = "签到延迟" + parseFloat((mtid / 60000).toFixed(2)) + "分,即" + + parseFloat((mtid / 1000).toFixed(2)) + "秒"
console.log("签到延迟" + parseFloat((mtid / 60000).toFixed(2)) + "分,即" + + parseFloat((mtid / 1000).toFixed(2)) + "秒")
Time.sleep(mtid)
try {
// 签到
var access_token2 = 'Bearer ' + access_token; // 构建包含访问令牌的请求头
let data2 = HTTP.post("https://member.aliyundrive.com/v1/activity/sign_in_list",
JSON.stringify({ "_rx-s": "mobile" }),
{ headers: { "Authorization": access_token2 } }
);
data2 = data2.json(); // 将响应数据解析为 JSON 格式
var signin_count = data2['result']['signInCount']; // 获取签到次数
var result1 = "账号:" + phone + " - 签到成功";
var result2 = "本月累计签到 " + signin_count + " 天";
console.log(result1)
} catch (error) {
console.log("单元格【" + tokenColumn + row + "】签到出错,请检查API接口");
continue; // 跳过当前行的后续操作()
}
Time.sleep(3000)
try {
// 领取奖励
let data3 = HTTP.post(
"https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile",
JSON.stringify({ "signInDay": signin_count }),
{ headers: { "Authorization": access_token2 } }
);
data3 = data3.json(); // 将响应数据解析为 JSON 格式
var result3 = data3["result"]["name"]; // 获取奖励名称
var result4 = data3["result"]["notice"]; // 获取奖励描述
Application.Range(signinresult + row).Value = date + '已签到'
//把签到结果 写入文档内
console.log(result4)
} catch (error) {
console.log("单元格【" + tokenColumn + row + "】领奖出错,请手动确认");
continue; // 跳过当前行的后续操作()
}
if (backups === true) {
// try {
// 备份的奖励
var access_token2 = 'Bearer ' + access_token; // 构建包含访问令牌的请求头
let data5 = HTTP.post("https://member.aliyundrive.com/v2/activity/sign_in_task_reward",
JSON.stringify({ "signInDay": signin_count }),
{ headers: { "Authorization": access_token2 } }
);
data5 = data5.json(); // 将响应数据解析为 JSON 格式
// console.log('备份奖励', data5)
var success = data5['success']
if (success == true) {
var result5 = data5["result"]["notice"]; // 获取奖励名称
} else {
var result5 = data5["message"] // 失败原因
}
console.log(result5)
// } catch (error) {
// console.log("单元格【" + tokenColumn + row + "】领取备份出错,请检查API接口");
// continue; // 跳过当前行的后续操作()
// }
} else {
console.log('不领取备份奖励')
}
var loginnotice = "" //20天后自动刷新refresh_token
var ldate = Application.Range(logindateColumn + row).Text; // 获取指定单元格的值
if (ldate !== '') {
Application.Range(logindateColumn + row).NumberFormat = 'yyyy-mm-dd;@'
var formatlogindate = Application.Range(logindateColumn + row).Text
console.log(formatlogindate)
function formatDateTime(date) {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
return `${year}-${pad(month)}-${pad(day)} `;
}
function pad(num) {
return num.toString().padStart(2, '0');
}
const currentDate = new Date();
var formacurrentdate = formatDateTime(currentDate);
console.log(formacurrentdate)
function getDate(strDate) {
if (strDate == null || strDate === undefined) return null;
var date = new Date();
try {
if (strDate == undefined) {
date = null;
} else if (typeof strDate == 'string') {
strDate = strDate.replace(/:/g, '-');
strDate = strDate.replace(/ /g, '-');
var dtArr = strDate.split("-");
if (dtArr.length >= 3 && dtArr.length < 6) {
date = new Date(dtArr[0], dtArr[1], dtArr[2]);
} else if (date.length > 8) {
date = new Date(Date.UTC(dtArr[0], dtArr[1] - 1, dtArr[2], dtArr[3] - 8, dtArr[4], dtArr[5]));
}
} else {
date = null;
}
return date;
} catch (e) {
alert('格式化日期出现异常:' + e.message);
}
}
var timeslong = getDate(formacurrentdate).getTime() - getDate(formatlogindate).getTime();
console.log(timeslong)
if (timeslong > 1728000000) {//时间差单位毫秒
var loginnotice = "登录已超20天自动刷新refresh_token";
let my_token = HTTP.post("https://auth.aliyundrive.com/v2/account/token",
JSON.stringify({
"grant_type": "refresh_token",
"refresh_token": refresh_token
}));
my_token = my_token.json()["refresh_token"]
if (my_token) {
console.log("当前账号refresh_token刷新为", my_token);
Application.Range(tokenColumn + row).Value = my_token;
console.log("当前账号登录日期刷新为", formacurrentdate);
Application.Range(logindateColumn + row).Value = formacurrentdate
}
}
}
//推送
if (servertoken !== '' && push == "Serverchan") {//serverchan通道推送
const urls = "https://sctapi.ftqq.com/" + servertoken + ".send"
let response = HTTP.post(
urls,
{
title: result1,
desp: loginresult + '\n\n' + signresult + '\n\n' + '' + result2 + '\n\n' + result4 + '\n\n' + result5 + '\n\n' + loginnotice + '',
},
{
headers: {
"Content-Type": "application/json",
},
timeout: 60000, // 设置超时时间
}
);
// 打印推送结果
console.log(response.text());
}
if (pushtoken !== '' && push == "Pushplus") {//pushplus通道推送
const urlp = "https://www.pushplus.plus/send"
let response = HTTP.post(
urlp,
{
"token": pushtoken,
"title": "阿里云盘-签到通知",
"content": loginresult + '\n' + signresult + '\n' + '' + result1 + '\n' + result2 + '\n' + result4 + '\n' + result5 + '\n' + loginnotice + '',
"channel": "wechat",
"template": "html"
},
{
headers: {
"Content-Type": "application/json",
},
timeout: 60000, // 设置超时时间
}
);
// 打印推送结果
console.log(response.text());
}
} else {//randomInt 不等于1 不签到
console.log('取得随机值不是1,不签到')
}
} else {//签到了
console.log(date + '已签到')
}
}//不需要签到
}//令牌为空
//无有效token
}