准备工作

获取阿里云盘refresh_token

阿里云的refresh_token每月会刷新一次,所以在月初进行更新,即可。

阿里云

  • shift+ctrl+i 开发者工具 点击 Application 复制refresh_token对应的值
    • refresh_token

获取QQ邮箱 SMTP

正式开始

金山文档网页版

  • 金山文档网页版

  • 创建一个excel

  • 格式必须一样,头名称随意,但是必须是对应的内容

excel

  • 点击脚本编辑器


签到代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// 获取当前时间
const now = new Date().toLocaleDateString()
/**
* 阿里云签到主体
*/
const sign = () => {
// 发送内容
let value = "";
// 获取excel 内容
let excelContext = getExcelContext();
for (let i = 0; i < excelContext.refresh_tokens.length; i++) {
// 发起网络请求-获取 access_token 和 基本信息
let accountData = HTTP.post("https://auth.aliyundrive.com/v2/account/token",
JSON.stringify({
"grant_type": "refresh_token",
"refresh_token": excelContext.refresh_tokens[i]
})
);
accountData = accountData.json();
let access_token = accountData['access_token']
let user_name = accountData['user_name']
// 如果 access_token为空
if (access_token == undefined) {
console.log("账号" + excelContext.refresh_tokens[i] + "token值错误,程序执行失败,请重新复制正确的token值");
} else {
console.log(user_name+":获取用户基本接口调用完成");
try {
access_token = 'Bearer ' + access_token
// 签到
let signIn = HTTP.post("https://member.aliyundrive.com/v1/activity/sign_in_list",
JSON.stringify({ "_rx-s": "mobile" }),
{ headers: { "Authorization": access_token } }
)
signIn = signIn.json()
var signin_count = signIn['result']['signInCount']
console.log("====签到完成====")
sleep(2000)
if (excelContext.sendEmails.length > 1 ? excelContext.sendEmails[i] : excelContext.sendEmails[0] == '是') {
// 领取奖励
let reward = HTTP.post(
"https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile",
JSON.stringify({ "signInDay": signin_count }),
{ headers: { "Authorization": access_token } }
)
reward = reward.json()
// 领取奖励名称
let name = reward["result"]["name"];
// 领取奖励对应名称解释
let description = reward["result"]["description"];
value = value + "账号:" + user_name + "-签到成功, 本月累计签到" + signin_count + "天" + "\n" + "==本次签到获得" + name + "," + description + "==\n";
value += "====================================\n";
console.log("====领取完毕====")
}else{
console.log("====未领取奖励====")
}
value = value + "账号:" + user_name + "-签到成功, 本月累计签到" + signin_count + "天" + "\n" + "====本次签到未领取奖励====\n";
value += "====================================\n";
// 是否发送邮件 如果发送邮箱大于2就默认单个发送
// 可以按照边界来确定是最好的,按照我的这种判定的话想要单个发送就必须每个阿里令牌都必须对应发送邮箱
// 不然就会报错
// 局限性很大
if (excelContext.sendEmails.length > 1 && excelContext.isEmailInforms[i] == '是') {
sendEmail(
excelContext.receiveEmails[i],
excelContext.passwords[i],
excelContext.sendEmails[i],
value,
)
}
} catch {
value = value + "账号:" + user_name + "-程序出错,请检查代码后重新运行" + "\n";
value += "====================================\n";
}
}
}
console.log(value);
if (excelContext.sendEmails.length == 1) {
sendEmail(
excelContext.receiveEmails[0],
excelContext.passwords[0],
excelContext.sendEmails[0],
value,
)
}else{
console.log("====未发送邮件====")
}
}
/**
* sendEmailType: 1:qq邮箱 2:网易云邮箱 0: 其他
*/
const sendEmail = (
loginEmail = "",
password = "",
sendEmail = "",
sendvalue = "",
emailType = 1,
emailLoginConfig = { host: 0, port: 0, secure: true, timeOut: 10000 },
) => {
switch (emailType) {
case 1: //qq邮箱
emailLoginConfig.host = "smtp.qq.com";
emailLoginConfig.port = 465;
break;
case 2: //网易云邮箱
emailLoginConfig.host = "smtp.163.com";
emailLoginConfig.port = 25;
break;
}
// 配置发送邮箱
let mailer = SMTP.login({
host: emailLoginConfig.host, // SMTP服务器的域名
port: emailLoginConfig.port, // 接口
username: loginEmail, // 邮箱地址
password: password, // 邮箱的SMTP密码,非qq密码
secure: emailLoginConfig.secure, // 是否使用TLS连接服务器
timeout: emailLoginConfig.timeOut // 等待建立连接的时间,单位毫秒(ms)
});
mailer.send({
from: "阿里云盘签到<" + loginEmail + ">", // 发件人
to: sendEmail, // 收件人
subject: "阿里云盘签到通知-" + now, // 主题
text: sendvalue, // 文本
})
}
/**
* 获取excel里的内容
*/
const getExcelContext = () => {
const context = {
receiveEmails: [], //接收邮箱
sendEmails: [],//发送邮箱
refresh_tokens: [],//阿里token
passwords: [],//邮箱SMTP密码
isRewards: [],//是否领取奖励
isEmailInforms: []//是否邮件通知
}
// 接收邮箱
context.receiveEmails = getColumnValues("C");
//发送邮箱
context.sendEmails = getColumnValues("D");
//阿里token
context.refresh_tokens = getColumnValues("E");
//邮箱SMTP密码
context.passwords = getColumnValues("F");
//是否领取奖励
context.isRewards = getColumnValues("G");
//是否邮件通知
context.isEmailInforms = getColumnValues("H");
return context;
}
/**
* 获取指定列内容 返回数组
*/
const getColumnValues = (column = "", i = 2) => {
let columnValues = [];
while (true) {
let columnValue = Application.Range(column + i);
if (columnValue.Value == '') break;
columnValues.push(columnValue.Value);
i++;
}
return columnValues;
}
/**
* 等待 由于不支持setTimeout 只能用循环来模拟
*/
function sleep(d) {
for (var t = Date.now(); Date.now() - t <= d;);
}
/**
* 如果选择不用邮件接收那么将创建新的工作表,在创建的月份工作表中写入数据
* 由于官方api并没有创建工作表的方法,所以要提前创建好对应月份的工作表,实际意义不大,算了
*/
const writeWorkSheet = ()=>{

}
// 开始
sign()

  • 菜鸡代码,可以修改的地方很多,很多地方想扩展性好一点却又写死了,也不想搞了,如果有更好的,可以评论进行交流学习学习。