凌帝。 发表于 2023-12-16 10:51

阿里云盘自动签到-自动更新token免部署-2023.12.16

本帖最后由 凌帝。 于 2024-5-31 16:01 编辑

首先。感谢@qike2391 提供的大部分代码以及 @侃遍天下无二人 提供的token自动更新例子

结合自己的一部分防检测的思路总结出了这个模板   
再次声明。此模板是结合上面两位大佬的代码以及我自己获取的备份奖励的进行编写的如有bug 请及时留言

【1.17说明:可以实现token的自动更新。一次获取就可以】
【5.31已失效!!勿用!】


12.20 关于备份奖励领取失败的情况说明:目前没有抓包去自动达到领取备份奖励的条件
所以如果需要领取备份奖励。需要你的手机/电脑开启自动备份且当天登录成功一次。【手机可以开启后台自启动】
如果你手机都不启动阿里云盘他自然今天没法备份自然就没法领取备份奖励。
12.20关于 pusplus推送失败的情况说明:运行的时候调用的是金山云的服务器IP 。可能由于部分IP调用过多,被pusplus推送的官方拉黑IP了
所以导致了可能提示(XXX禁止访问)导致推送失败   但是每天都是正常签到的 。这点无需担心

功能以及优点:

[*]不需要服务器部署、直接一个wps云文档即可使用
[*]利用自己想到的避开了检测【随机时间延迟、不同时间签到】(IP没改,因为很多人不会用)
[*]根据随机值决定签到的时间。避开了每天都是那个时间签到的检测
[*]增加了手机开启自动备份的签到奖励【需要手机开启备份功能 并且开启自启动不然当天不登录阿里云盘则无法领取】
[*]不需要开电脑、不需要任何成本!   都是云运行! 一次获取,理论上可以用很久。具体多久就得到时候测试看了



https://static.52pojie.cn/static/image/hrline/4.gifhttps://static.52pojie.cn/static/image/hrline/4.gif


使用方法:
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。创建定时任务【可以创建多个可以一个建议多个】




https://static.52pojie.cn/static/image/hrline/4.gif

你们自己可以修改的地方:
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, dtArr, dtArr);
                                    } else if (date.length > 8) {
                                        date = new Date(Date.UTC(dtArr, dtArr - 1, dtArr, dtArr - 8, dtArr, dtArr));
                                    }
                              } 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
}

凌帝。 发表于 2023-12-18 13:36

本帖最后由 凌帝。 于 2023-12-18 13:38 编辑

本方法仅用于 实在看不懂上面得操作。或者懒得做的。 个人建议还是尽可能得去自己操作下 很简单得


1.https://alist.nn.ci/zh/guide/dri ... 0%E4%BB%A4%E7%89%8C
打开这个网站。点【获取token】   扫码然后就可以拿到阿里云盘得token了


2. 微信关注:pusplus推送加   对着公众号发送:token   就可以拿到pusplus得推送token了


拿到后。把这两个token私信发给我(备注好哪个是哪个)然后等着每天签到就可以了

anson1599 发表于 2024-5-22 09:19

今天阿里云盘取消了网页签到的功能,只能在PC或者手机客户端进行签到了

jyqcz 发表于 2023-12-25 13:39

本帖最后由 jyqcz 于 2023-12-25 15:55 编辑

zhou小白猪 发表于 2023-12-22 09:41
为什么要加一行随机数不等于1就不执行呢?
为了让每天的签到时间有较大的不同,而不是集中在某个时间左右。
看了下有不少人遇到设定的几个时间随机都不为1所以没执行的情况,之前虽然想到这可能性还以为楼主会加上处理,感觉可以在最后一次执行的时候还没签到就强制执行
对js不熟,去看看代码也不知道自己动手能不能改的起来

去看了下代码,发现上面的判断最后一次执行的想法想当然了,考虑设置个最后执行时间,手动赋值自己设置的多个定时任务里最晚的时间,在现有的randomint赋值随机数前加个判断假如是最后一次定时任务了就直接赋1。
去尝试改发现上面一句还是不太对,定时任务的时间不在代码里,没法判断相等,只能判断当前时间和设置的最后一次定时时间时间差小于2个dengdai时间
仔细看发现由于randomint定义在多账号的循环里,被备注的“不等于1都不签到”误导了以为多个账号只判断一次,实际是一个账号判断一次,另外等待时间是在判断随机数之后才等待,所以应该是第row个账号应该判断当前时间差小于等于(row - 1) * 2 个等待时间才是

脑子糊涂了,直接判当前时间小于设定的最后次任务时间就是不是最后一次,否则就最后一次,随机数置一强制执行就完了,管它第几个账号等了多久呢
目前修改了2处地方,一处可修改参数的位置增加最后任务时间的设置
var lasttime_h = 15   //设定的最后一次定时任务时间的小时数,用于判断最后一次执行时如何还未签到则必定执行
var lasttime_m = 30   //最后一次定时任务时间的分钟数

var lasttime = new Date(myDate.getFullYear(), myDate.getMonth(), myDate.getDate(), lasttime_h, lasttime_m, 0, 0)
原先进行随机数赋值的地方增加了是否最后一次执行的判断
var randomInt
                if ( Date.now() < lasttime) {
                  //非最后一次, 取随机数
                  randomInt = Math.floor(Math.random() * renwu) + 1
                }
                else {
                  //最后一次,直接赋值1
                  randomInt = 1
                }

yansf 发表于 2024-1-19 15:01

出现“获取随机值不是1,不签到”是什么原因呢?

fu520 发表于 2023-12-20 15:11

244888888 发表于 2023-12-20 14:09
javascript
Copy code
if (randomInt === 1) {


这段没看出来什么用,我直接把if改成了 if(1===1)

凌帝。 发表于 2023-12-16 11:10

NCGZS 发表于 2023-12-16 11:03
希望加一个企业微信自建应用的推送

{:1_896:}99%的人都用不到企业微信的

挥泪踏红尘 发表于 2023-12-22 11:06

subfire 发表于 2023-12-22 10:05
{"code":999,"msg":"所在IP:120.92.55.192禁止访问","data":null}

试了好几天, 都是报这个

IP被推送软件拉黑了,主要看日志是否成功

凌帝。 发表于 2023-12-21 09:34

hpzka 发表于 2023-12-21 08:45
第二个图是 到公司了 手动运行了 签到成功   TOKEN没有动过请问楼主 怎么解决

是有什么问题呢这不都成功了嘛

一璐有你 发表于 2024-4-24 17:48

显示签到成功,怎么不推送消息?

小楼昨夜东风 发表于 2023-12-16 10:55

代替人工,灰常不错。

NCGZS 发表于 2023-12-16 11:03

希望加一个企业微信自建应用的推送

z1991627 发表于 2023-12-16 11:09

试用一下目前签到正常 明天在看结果

guilinggggg 发表于 2023-12-16 11:24

下载试用一下,感谢分享

ShangJiu 发表于 2023-12-16 11:28

填入token并选择pushplus没有推送,怎么解决?

zshq1 发表于 2023-12-16 11:39

感谢楼主分享,学习了{:1_893:}

勤快的懒虫 发表于 2023-12-16 11:40

谢谢楼主这个更加方便了

凌帝。 发表于 2023-12-16 11:57

ShangJiu 发表于 2023-12-16 11:28
填入token并选择pushplus没有推送,怎么解决?

提供下日志的截图呢
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 阿里云盘自动签到-自动更新token免部署-2023.12.16