├── README.md ├── polymerizations ├── PUSH.js ├── TEMPLATE.js ├── TEMPLATE_ql.js ├── UPDATE.js ├── aliyun.js ├── bwcj.js ├── chinadsl.js ├── ciba.js ├── ddmc_ddyt.js ├── eswxlt.js ├── golo.js ├── hdl.js ├── hfweather.js ├── huluxia.js ├── mi.js ├── noteyoudao.js ├── parsdata.js ├── qcs.js ├── ql_70games.js ├── ql_acfun.js ├── ql_bilibili.js ├── ql_ddai.js ├── ql_easinote.js ├── ql_fwxs.js ├── ql_hxek.js ├── ql_hzh.js ├── ql_kanxue.js ├── ql_kyt.js ├── ql_mi.js ├── ql_only_mi.py ├── ql_quark.js ├── ql_smzdm.js ├── ql_toollu.js ├── ql_wps_daka.js ├── ql_xmc.js ├── ql_xmly.js ├── ql_yhsh.js ├── ql_ztebbs.js ├── quarksave.js ├── rainyun.js ├── sendNotify.js ├── steamtools.js ├── syns.js ├── tieba.js ├── vivo.js ├── wnflb.js ├── xmdl.js ├── xpnc.js └── ztemall.js └── sign_script-main.zip /README.md: -------------------------------------------------------------------------------- 1 | # WPS_Script-Collection 2 | WPS签到定时重放脚本框架,兼容青龙,夸克网盘|永辉生活|霸王茶姬|所有女生|兴攀农场|屈臣氏|华住会|天气预报|和风天气|steamtools|恩山论坛|熊猫代理|达美乐比萨|LinkAi|海底捞|鸿星尔克|词霸每日一句|金山词霸|钉钉AI|阿里云盘|百度贴吧|WPS(打卡版) |哔哩哔哩|什么值得买|叮咚买菜|喜马拉雅|希沃白板|葫芦侠3楼|中兴社区|小米商城|vivo社区|宽带技术网|中兴商城|万能福利吧|废文|小木虫|科研通|雨云|在线工具|AcFun|看雪论坛|golo汽修大师|70games|ParsData|夸克转存|有道云笔记 3 | 4 | 5 | ## **🍨 教程** 6 | 7 | 📖 [艾默库教程](https://jewel-pullover-9d0.notion.site/dfec17946a164658bb77e9682df954a2?pvs=4) 8 | 9 | ## **📌 特别声明** 10 | 11 | * 本仓库发布的脚本仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 12 | * 本人对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害。 13 | * 间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本人对于由此引起的任何隐私泄漏或其他后果概不负责。 14 | * 请勿将本仓库的任何内容用于商业或非法目的,否则后果自负。 15 | * 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关脚本。 16 | * 任何以任何方式查看此项目的人或直接或间接使用该项目的任何脚本的使用者都应仔细阅读此声明。本人保留随时更改或补充此免责声明的权利。一旦使用并复制了任何相关脚本或Script项目的规则,则视为您已接受此免责声明。 17 | 18 | **您必须在下载后的24小时内从计算机或手机中完全删除以上内容** 19 | 20 | > ***您使用或者复制了本仓库且本人制作的任何脚本,则视为***​*​ ​*​***`已接受`***​*​ ​*​***此声明,请仔细阅读*** 21 | 22 | 23 | ##📖 [B站教程](https://www.bilibili.com/video/BV18j411r79G) 24 | -------------------------------------------------------------------------------- /polymerizations/TEMPLATE.js: -------------------------------------------------------------------------------- 1 | // 某雪自动签到(修改这里,这里填是什么签到) 2 | // 20240512 (修改这里) 3 | 4 | var sheetNameSubConfig = "mouxue"; // 分配置表名称(修改这里,这里填表的名称,需要和UPDATE文件中的一致,自定义的) 5 | var pushHeader = "【某雪论坛】"; //(修改这里,这里给自己看的,随便填) 6 | var sheetNameConfig = "CONFIG"; // 总配置表 7 | var sheetNamePush = "PUSH"; // 推送表名称 8 | var sheetNameEmail = "EMAIL"; // 邮箱表 9 | var flagSubConfig = 0; // 激活分配置工作表标志 10 | var flagConfig = 0; // 激活主配置工作表标志 11 | var flagPush = 0; // 激活推送工作表标志 12 | var line = 21; // 指定读取从第2行到第line行的内容 13 | var message = ""; // 待发送的消息 14 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 15 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 16 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 17 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 18 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 19 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 20 | 21 | var jsonPush = [ 22 | { name: "bark", key: "xxxxxx", flag: "0" }, 23 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 24 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 25 | { name: "email", key: "xxxxxx", flag: "0" }, 26 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 27 | { name: "discord", key: "xxxxxx", flag: "0" }, 28 | ]; // 推送数据,flag=1则推送 29 | var jsonEmail = { 30 | server: "", 31 | port: "", 32 | sender: "", 33 | authorizationCode: "", 34 | }; // 有效邮箱配置 35 | 36 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 37 | // 主配置工作表存在 38 | if (flagConfig == 1) { 39 | console.log("开始读取主配置表"); 40 | let name; // 名称 41 | let onlyError; 42 | let nickname; 43 | for (let i = 2; i <= 100; i++) { 44 | // 从工作表中读取推送数据 45 | name = Application.Range("A" + i).Text; 46 | onlyError = Application.Range("C" + i).Text; 47 | nickname = Application.Range("D" + i).Text; 48 | if (name == "") { 49 | // 如果为空行,则提前结束读取 50 | break; // 提前退出,提高效率 51 | } 52 | if (name == sheetNameSubConfig) { 53 | if (onlyError == "是") { 54 | messageOnlyError = 1; 55 | console.log("只推送错误消息"); 56 | } 57 | 58 | if (nickname == "是") { 59 | messageNickname = 1; 60 | console.log("单元格用昵称替代"); 61 | } 62 | 63 | break; // 提前退出,提高效率 64 | } 65 | } 66 | } 67 | 68 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 69 | // 推送工作表存在 70 | if (flagPush == 1) { 71 | console.log("开始读取推送工作表"); 72 | let pushName; // 推送类型 73 | let pushKey; 74 | let pushFlag; // 是否推送标志 75 | for (let i = 2; i <= line; i++) { 76 | // 从工作表中读取推送数据 77 | pushName = Application.Range("A" + i).Text; 78 | pushKey = Application.Range("B" + i).Text; 79 | pushFlag = Application.Range("C" + i).Text; 80 | if (pushName == "") { 81 | // 如果为空行,则提前结束读取 82 | break; 83 | } 84 | jsonPushHandle(pushName, pushFlag, pushKey); 85 | } 86 | // console.log(jsonPush) 87 | } 88 | 89 | // 邮箱配置函数 90 | emailConfig(); 91 | 92 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 93 | if (flagSubConfig == 1) { 94 | console.log("开始读取分配置表"); 95 | for (let i = 2; i <= line; i++) { 96 | var cookie = Application.Range("A" + i).Text; 97 | var exec = Application.Range("B" + i).Text; 98 | if (cookie == "") { 99 | // 如果为空行,则提前结束读取 100 | break; 101 | } 102 | if (exec == "是") { 103 | execHandle(cookie, i); 104 | } 105 | } 106 | 107 | message = messageMerge()// 将消息数组融合为一条总消息 108 | push(message); // 推送消息 109 | } 110 | 111 | // 将消息数组融合为一条总消息 112 | function messageMerge(){ 113 | for(i=0; i", 218 | to: sender, 219 | subject: pushHeader + " - " + data_time, 220 | text: message, 221 | }); 222 | // console.log("已发送邮件至:" + sender); 223 | console.log("已发送邮件"); 224 | sleep(5000); 225 | } 226 | 227 | // 邮箱配置 228 | function emailConfig() { 229 | console.log("开始读取邮箱配置"); 230 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 231 | let name; 232 | for (let i = 0; i < length; i++) { 233 | name = jsonPush[i].name; 234 | if (name == "email") { 235 | if (jsonPush[i].flag == 1) { 236 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 237 | // 邮箱表存在 238 | // var email = { 239 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 240 | // } // 有效配置 241 | if (flag == 1) { 242 | console.log("开始读取邮箱表"); 243 | for (let i = 2; i <= 2; i++) { 244 | // 从工作表中读取推送数据 245 | jsonEmail.server = Application.Range("A" + i).Text; 246 | jsonEmail.port = Application.Range("B" + i).Text; 247 | jsonEmail.sender = Application.Range("C" + i).Text; 248 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 249 | if (Application.Range("A" + i).Text == "") { 250 | // 如果为空行,则提前结束读取 251 | break; 252 | } 253 | } 254 | // console.log(jsonEmail) 255 | } 256 | break; 257 | } 258 | } 259 | } 260 | } 261 | 262 | // 推送钉钉机器人 263 | function dingtalk(message, key) { 264 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 265 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 266 | // console.log(resp.text()) 267 | sleep(5000); 268 | } 269 | // 推送Discord机器人 270 | function discord(message, key) { 271 | let url = key; 272 | let resp = HTTP.post(url, { content: message }); 273 | //console.log(resp.text()) 274 | sleep(5000); 275 | } 276 | function sleep(d) { 277 | for (var t = Date.now(); Date.now() - t <= d; ); 278 | } 279 | 280 | // 激活工作表函数 281 | function ActivateSheet(sheetName) { 282 | let flag = 0; 283 | try { 284 | // 激活工作表 285 | let sheet = Application.Sheets.Item(sheetName); 286 | sheet.Activate(); 287 | console.log("激活工作表:" + sheet.Name); 288 | flag = 1; 289 | } catch { 290 | flag = 0; 291 | console.log("无法激活工作表,工作表可能不存在"); 292 | } 293 | return flag; 294 | } 295 | 296 | // 对推送数据进行处理 297 | function jsonPushHandle(pushName, pushFlag, pushKey) { 298 | let length = jsonPush.length; 299 | for (let i = 0; i < length; i++) { 300 | if (jsonPush[i].name == pushName) { 301 | if (pushFlag == "是") { 302 | jsonPush[i].flag = 1; 303 | jsonPush[i].key = pushKey; 304 | } 305 | } 306 | } 307 | } 308 | 309 | // cookie字符串转json格式 310 | function cookie_to_json(cookies) { 311 | var cookie_text = cookies; 312 | var arr = []; 313 | var text_to_split = cookie_text.split(";"); 314 | for (var i in text_to_split) { 315 | var tmp = text_to_split[i].split("="); 316 | arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"'); 317 | } 318 | var res = "{\n" + arr.join(",\n") + "\n}"; 319 | return JSON.parse(res); 320 | } 321 | 322 | // 获取10 位时间戳 323 | function getts10() { 324 | var ts = Math.round(new Date().getTime() / 1000).toString(); 325 | return ts; 326 | } 327 | 328 | // 获取13位时间戳 329 | function getts13(){ 330 | // var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳 331 | let ts = new Date().getTime() 332 | return ts 333 | } 334 | 335 | // 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9 336 | function generateUUID() { 337 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 338 | var r = Math.random() * 16 | 0, 339 | v = c === 'x' ? r : (r & 0x3 | 0x8); 340 | return v.toString(16); 341 | }); 342 | } 343 | 344 | function getUUIDDigits(length) { 345 | var uuid = generateUUID(); 346 | return uuid.replace(/-/g, '').substr(16, length); 347 | } 348 | 349 | 350 | 351 | // 获取sign,返回小写 352 | function getsign(data) { 353 | var sign = Crypto.createHash("md5") 354 | .update(data, "utf8") 355 | .digest("hex") 356 | // .toUpperCase() // 大写 357 | .toString(); 358 | return sign; 359 | } 360 | 361 | 362 | // 具体的执行函数 363 | function execHandle(cookie, pos) { 364 | let messageSuccess = ""; 365 | let messageFail = ""; 366 | let messageName = ""; 367 | // 推送昵称或单元格,还是不推送位置标识 368 | if (messageNickname == 1) { 369 | // 推送昵称或单元格 370 | messageName = Application.Range("C" + pos).Text; 371 | if(messageName == "") 372 | { 373 | messageName = "单元格A" + pos + ""; 374 | } 375 | } 376 | 377 | posLabel = pos-2 ; // 存放下标,从0开始 378 | messageHeader[posLabel] = messageName 379 | 380 | // =================修改这块区域,区域开始================= 381 | 382 | url1 = "https://bbs.mouxue.com/user-signin.htm"; // 签到url(修改这里,这里填抓包获取到的地址) 383 | 384 | // (修改这里,这里填抓包获取header,全部抄进来就可以了,按照如下用引号包裹的格式,其中小写的cookie是从表格中读取到的值。) 385 | headers= { 386 | "Cookie": cookie, 387 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70", 388 | } 389 | 390 | // (修改这里,这里填抓包获取data,全部抄进来就可以了,按照如下用引号包裹的格式。POST请求才需要这个,GET请求就不用它了) 391 | data = { 392 | "csrf_token":"", 393 | } 394 | 395 | // (修改这里,以下请求方式三选一即可) 396 | // 请求方式1:POST请求,抓包的data数据格式是 {"aaa":"xxx","bbb":"xxx"} 。则用这个 397 | resp = HTTP.post( 398 | url1, 399 | JSON.stringify(data), 400 | { headers: headers } 401 | ); 402 | 403 | // // 请求方式2:POST请求,抓包的data数据格式是 aaa=xxx&bbb=xxx 。则用这个 404 | // resp = HTTP.post( 405 | // url1, 406 | // data, 407 | // { headers: headers } 408 | // ); 409 | 410 | // // 请求方式3:GET请求,无data数据。则用这个 411 | // resp = HTTP.get( 412 | // url1, 413 | // { headers: headers } 414 | // ); 415 | 416 | if (resp.status == 200) { 417 | resp = resp.json(); 418 | console.log(resp) 419 | 420 | // (修改这里,这里就是自己写了,根据抓包的响应自行修改) 421 | 422 | // 接收到的响应数据是json格式,如下,假设有2种情况 423 | // 情况1:{"code": "0","message": "签到成功"} 424 | // 情况2:{"code":"-1","message":"签到失败"} 425 | respcode = resp["code"] // 通过resp["键名"]的方式获取值.假设响应数据是情况1,则读取到数字“0” 426 | // respmsg = resp["message"] // 通过resp["键名"]的方式获取值,假设响应数据是情况1,这里取到的值就是“签到成功” 427 | if(respcode == 0) // 通过code值来判断是不是签到成功,由抓包的情况1知道,0代表签到成功了,所以让code与0比较 428 | { 429 | // 这里是签到成功 430 | content = "签到成功 " // // 给自己看的,双引号内可以随便写 431 | 432 | messageSuccess += content; 433 | console.log(content) 434 | } 435 | else 436 | { 437 | // 这里是签到失败 438 | msg = "签到失败 " // 给自己看的,可以随便写,如 msg = "失败啦! " 。 439 | 440 | content = msg + " " 441 | messageFail += content; 442 | console.log(content) 443 | } 444 | 445 | } else { 446 | content = "签到失败 " 447 | messageFail += content; 448 | console.log(content); 449 | } 450 | 451 | // =================修改这块区域,区域结束================= 452 | 453 | sleep(2000); 454 | if (messageOnlyError == 1) { 455 | messageArray[posLabel] = messageFail; 456 | } else { 457 | messageArray[posLabel] = messageFail + " " + messageSuccess; 458 | } 459 | 460 | if(messageArray[posLabel] != "") 461 | { 462 | console.log(messageArray[posLabel]); 463 | } 464 | } 465 | -------------------------------------------------------------------------------- /polymerizations/UPDATE.js: -------------------------------------------------------------------------------- 1 | /* 2 | 脚本名称:UPDATE.js 3 | 脚本兼容: airsript 1.0、airscript 2.0 4 | 更新时间:20241226 5 | 备注:更新脚本。用于自动生成表格,以及追加表格数据 6 | 适配airsript 1.0版本及airscript 2.0版本 7 | 其他:若想添加新内容,请搜索(修改这里),按照格式修改 8 | */ 9 | 10 | var confiWorkbook = 'CONFIG' // 主配置表名称 11 | var pushWorkbook = 'PUSH' // 推送表的名称 12 | var emailWorkbook = 'EMAIL' // 邮箱表的名称 13 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 14 | 15 | // 表中激活的区域的行数和列数 16 | var workbook = [] // 存储已存在表数组 17 | var row = 0; 18 | var col = 0; 19 | var maxRow = 100; // 规定最大行 20 | var maxCol = 22; // 规定最大列 21 | var colNum = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'] 22 | 23 | // CONFIG表内容 24 | // 推送昵称(推送位置标识)选项:若“是”则推送“账户名称”,若账户名称为空则推送“单元格Ax”,这两种统称为位置标识。若“否”,则不推送位置标识 25 | // 存放CONFIG表内容,标题+标题下内容 26 | var configContent = []; 27 | // 实际写入CONFIG表的值 28 | // CONFIG表标题 29 | configTitle = ['工作表的名称', '备注', '只推送失败消息(是/否)', '推送昵称(是/否)', '是否存活', '程序结束时间', '消息', '推送时间', '推送方式', '是否通知', '加入消息池', '推送优先级', '当日可推送次数', '当日剩余推送次数'] 30 | // 定义CONFIG表标题下内容的默认值 31 | var configBodyDefault = ['xxx', '', '否', '是', '是', '', '', '', '@all', '是', '否', '0', '1', '']; 32 | // CONFIG表标题下内容 33 | var configBody = [ 34 | { name: 'xxx', note: '', isAlive: '否',}, 35 | { name: 'xxx', note: '', isAlive: '否',}, 36 | { name: 'noteyoudao', note: '有道云笔记',}, 37 | { name: 'tieba', note: '百度贴吧',}, 38 | { name: 'xxx', note: '', isAlive: '否',}, 39 | { name: 'xxx', note: '', isAlive: '否',}, 40 | { name: 'xxx', note: '', isAlive: '否',}, 41 | { name: 'xxx', note: '', isAlive: '否',}, 42 | { name: 'smzdm', note: '什么值得买抽奖',}, 43 | { name: 'toollu', note: '在线工具',}, 44 | { name: 'xxx', note: '', isAlive: '否',}, 45 | { name: 'xxx', note: '', isAlive: '否',}, 46 | { name: 'xxx', note: '', isAlive: '否',}, 47 | { name: 'xxx', note: '', isAlive: '否',}, 48 | { name: 'ddmc_ddyt', note: '叮咚买菜-叮咚鱼塘',}, 49 | { name: 'xxx', note: '', isAlive: '否',}, 50 | { name: 'xxx', note: '', isAlive: '否',}, 51 | { name: 'acfun', note: 'AcFun',}, 52 | { name: 'xmly', note: '喜马拉雅',}, 53 | { name: 'xxx', note: '', isAlive: '否',}, 54 | { name: 'en', note: '希沃白板',}, 55 | { name: 'xmc', note: '小木虫',}, 56 | { name: 'quark', note: '夸克网盘',}, 57 | { name: 'huluxia', note: '葫芦侠3楼',}, 58 | { name: 'xxx', note: '', isAlive: '否',}, 59 | { name: 'xxx', note: '', isAlive: '否',}, 60 | { name: 'ztebbs', note: '中兴社区',}, 61 | { name: 'mi', note: '小米商城',}, 62 | { name: 'kanxue', note: '看雪论坛',}, 63 | { name: 'bilibili', note: '哔哩哔哩',}, 64 | { name: 'vivo', note: 'vivo社区',}, 65 | { name: 'xxx', note: '', isAlive: '否',}, 66 | { name: 'wps_daka', note: 'wps(打卡版)',}, 67 | { name: 'golo', note: 'golo汽修大师',}, 68 | { name: 'xxx', note: '', isAlive: '否',}, 69 | { name: 'aliyun', note: '阿里云盘(自动更新token版)',}, 70 | { name: 'chinadsl', note: '宽带技术网',}, 71 | { name: 'xxx', note: '', isAlive: '否',}, 72 | { name: 'xxx', note: '', isAlive: '否',}, 73 | { name: 'ztemall', note: '中兴商城',}, 74 | { name: 'wnflb', note: '万能福利吧',}, 75 | { name: 'xxx', note: '', isAlive: '否',}, 76 | { name: 'xxx', note: '', isAlive: '否',}, 77 | { name: 'fwxs', note: '废文小说',}, 78 | { name: 'hxek', note: '鸿星尔克',}, 79 | { name: 'xxx', note: '', isAlive: '否',}, 80 | { name: 'xxx', note: '', isAlive: '否',}, 81 | { name: 'xxx', note: '', isAlive: '否',}, 82 | { name: 'ddai', note: '钉钉AI',}, 83 | { name: 'xxx', note: '', isAlive: '否',}, 84 | { name: 'xxx', note: '', isAlive: '否',}, 85 | { name: 'kyt', note: '科研通',}, 86 | { name: 'parsdata', note: '伊朗域名注册优惠码',}, 87 | { name: 'quarksave', note: '夸克订阅更新自动转存',}, 88 | { name: 'games70', note: '70games',}, 89 | { name: 'xxx', note: '', isAlive: '否',}, 90 | { name: 'xxx', note: '', isAlive: '否',}, 91 | { name: 'yhsh', note: '永辉生活',}, 92 | { name: 'xpnc', note: '兴攀农场',}, 93 | { name: 'bwcj', note: '霸王茶姬',}, 94 | { name: 'syns', note: '所有女生',}, 95 | { name: 'qcs', note: '屈臣氏',}, 96 | { name: 'hdl', note: '海底捞',}, 97 | { name: 'hzh', note: '华住会',}, 98 | { name: 'eswxlt', note: '恩山无线论坛',}, 99 | { name: 'steamtools', note: 'steamtools',}, 100 | { name: 'xmdl', note: '熊猫代理',}, 101 | { name: 'linkai', note: 'LinkAi',}, 102 | { name: 'hfweather', note: '和风天气', pushPriority: '1',}, 103 | { name: 'dml', note: '达美乐',}, 104 | { name: 'ciba', note: '词霸每日一句',}, 105 | 106 | // { name: '(修改这里)', note: '(修改这里)',}, // 添加新增内容 107 | ]; 108 | 109 | 110 | // 定义字段映射关系,标题和键的对应关系,用于动态个性化处理 111 | var configTitleMapping = { 112 | '工作表的名称': 'name', 113 | '备注': 'note', 114 | '只推送失败消息(是/否)': 'pushFailureOnly', 115 | '推送昵称(是/否)': 'pushNickname', 116 | '是否存活': 'isAlive', 117 | '更新时间': 'updateTime', 118 | '消息': 'message', 119 | '推送时间': 'pushTime', 120 | '推送方式': 'pushMethod', 121 | '是否通知': 'notify', 122 | '加入消息池': 'addToMessagePool', 123 | '推送优先级': 'pushPriority', 124 | '当日可推送次数': 'dailyPushLimit', 125 | '当日剩余推送次数': 'remainingDailyPushes', 126 | }; 127 | 128 | // PUSH表内容 129 | var pushContent = [ 130 | ['推送类型', '推送识别号(如:token、key)', '是否推送(是/否)'], 131 | ['bark', 'xxxxxxxx', '否'], 132 | ['pushplus', 'xxxxxxxx', '否'], 133 | ['ServerChan', 'xxxxxxxx', '否'], 134 | ['email', '若要邮箱发送,请配置EMAIL表', '否'], 135 | ['dingtalk', 'xxxxxxxx', '否'], 136 | ['discord', '请填入镜像webhook链接,自行处理Query参数', '否'], 137 | ['qywx', 'xxxxxxxx', '否'], 138 | ['xizhi', 'xxxxxxxx', '否'], 139 | ['jishida', 'xxxxxxxx', '否'], 140 | ['wxpusher', 'appToken|uid', '否'], 141 | ] 142 | 143 | // email表内容 144 | var emailContent = [ 145 | ['SMTP服务器域名', '端口', '发送邮箱', '授权码'], 146 | ['smtp.qq.com', '465', 'xxxxxxxx@qq.com', 'xxxxxxxx'] 147 | ] 148 | 149 | // 分配置表内容 150 | var subConfigContent = [ 151 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)'], 152 | ['xxxxxxxx1', '是', '昵称1'], 153 | ['xxxxxxxx2', '否', '昵称2'] 154 | ] 155 | 156 | // 定制化分配置表内容,叮咚买菜 157 | var subConfigDdmc = [ 158 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'seedId_ddgy', 'propsId_ddgy', 'seedId_ddyt', 'propsId_ddty'], 159 | ['xxxxxxxx1', '是', '昵称1', '填果园seedId', '填果园propsId', '填鱼塘seedId', '填鱼塘propsId'], 160 | ['xxxxxxxx2', '否', '昵称2', '填果园seedId', '填果园propsId', '填鱼塘seedId', '填鱼塘propsId'] 161 | ] 162 | 163 | // 定制化分配置表内容,WPS 164 | var subConfigWps = [ 165 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '转存PPT(是/否)', '是否渠道1打卡(是/否)', '是否渠道2打卡(是/否)', 'Signature(渠道2)'], 166 | ['xxxxxxxx1', '是', '昵称1', '否', '是', '否' , 'xxxxxxxx' ,], 167 | ['xxxxxxxx2', '否', '昵称2', '否', '是', '否' , 'xxxxxxxx' ,] 168 | ] 169 | 170 | // 定制化分配置表内容,小米商城 171 | var subConfigMi = [ 172 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'mishop-client-id'], 173 | ['xxxxxxxx1', '是', '昵称1', '100'], 174 | ['xxxxxxxx2', '否', '昵称2', '100'] 175 | ] 176 | 177 | // 定制化分配置表内容,golo汽修大师 178 | var subConfigGolo = [ 179 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'username', 'password'], 180 | ['xxxxxxxx1', '是', '昵称1', '此格填用户名', '此格填密码'], 181 | ['xxxxxxxx2', '否', '昵称2', '此格填用户名', '此格填密码'] 182 | ] 183 | 184 | // 定制化分配置表内容,阿里云盘(自动更新token) 185 | var subConfigAliyunToken = [ 186 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '是否领取自动备份的奖励(是/否)', 'token登陆时间', '签到结果'], 187 | ['xxxxxxxx1', '是', '昵称1', '否', '无', '无'], 188 | ['xxxxxxxx2', '否', '昵称2', '否', '无', '无'] 189 | ] 190 | 191 | // 定制化分配置表内容,hxek 192 | var subConfigHxek = [ 193 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', "memberId", "enterpriseId"], 194 | ['xxxxxxxx1', '是', '昵称1', 'xxx', 'xxx'], 195 | ['xxxxxxxx2', '否', '昵称2', 'xxx', 'xxx'] 196 | ] 197 | 198 | // 定制化分配置表内容,parsdata 199 | var subConfigParsdata = [ 200 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '优惠码'], 201 | ['xxxxxxxx1', '是', '昵称1', ''], 202 | ['xxxxxxxx2', '否', '昵称2', ''] 203 | ] 204 | 205 | // 定制化分配置表内容,雨云 206 | var subConfigRainyun = [ 207 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '账号', '密码'], 208 | ['xxxxxxxx1', '是', '昵称1', '', ''], 209 | ['xxxxxxxx2', '否', '昵称2', '', ''] 210 | ] 211 | 212 | // 定制化分配置表内容,霸王茶姬 213 | var subConfigBwcj = [ 214 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'userid'], 215 | ['xxxxxxxx1', '是', '昵称1', ''], 216 | ['xxxxxxxx2', '否', '昵称2', ''] 217 | ] 218 | 219 | // 定制化分配置表内容,海底捞 220 | var subConfigHdl = [ 221 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'uid'], 222 | ['xxxxxxxx1', '是', '昵称1', ''], 223 | ['xxxxxxxx2', '否', '昵称2', ''] 224 | ] 225 | 226 | // 定制化分配置表内容,屈臣氏 227 | var subConfigQcs = [ 228 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'openId', 'unionId'], 229 | ['xxxxxxxx1', '是', '昵称1', '', ''], 230 | ['xxxxxxxx2', '否', '昵称2', '', ''] 231 | ] 232 | 233 | // 定制化分配置表内容,恩山无线论坛 234 | var subConfigEswxlt = [ 235 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'openId', 'unionId'], 236 | ['xxxxxxxx1', '是', '昵称1', '', ''], 237 | ['xxxxxxxx2', '否', '昵称2', '', ''] 238 | ] 239 | 240 | // 定制化分配置表内容,xmdl熊猫代理 241 | var subConfigXmdl = [ 242 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'username', 'password'], 243 | ['xxxxxxxx1', '是', '昵称1', '此格填用户名', '此格填密码'], 244 | ['xxxxxxxx2', '否', '昵称2', '此格填用户名', '此格填密码'] 245 | ] 246 | 247 | // 定制化分配置表内容,hfweather和风天气 248 | var subConfigHfweather = [ 249 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '省份/城市/区/经纬度/ID(手动输入)', '今日天气预报', '实时天气预报', '当天生活指数', '天气灾害预警', '逐小时天气预报', '分钟级降水','其他模式(可选)','消息过滤器(可选)','高级配置(可选)','实际定位(自动生成)','地区ID(自动生成)','经纬度(自动生成)','一致性校验(自动生成)','冗余观测站(自动生成)'], 250 | ['xxxxxxxx1', '是', '昵称1', '朝阳区', '是', '否', '否', '否', '否', '否', '', '', '', '', '', '', '', ''], 251 | // ['xxxxxxxx2', '否', '昵称2', '是', '否', '否', '否', '否', '否', '', '', '', '', '', '', '', ''] 252 | ] 253 | 254 | // 定制化分配置表内容,ciba词霸每日一句 255 | var subConfigCiba = [ 256 | ['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '中文每日一句', '英文每日一句'], 257 | ['xxxxxxxx1', '是', '昵称1', '是', '是'], 258 | ['xxxxxxxx2', '否', '昵称2', '是', '是'] 259 | ] 260 | 261 | // 定制化表 262 | var subConfig = { 263 | "ddmc" : subConfigDdmc, 264 | "wps" : subConfigWps, 265 | "golo" : subConfigGolo, 266 | "aliyun" : subConfigAliyunToken, 267 | "hxek" : subConfigHxek, 268 | "parsdata":subConfigParsdata, 269 | "rainyun":subConfigRainyun, 270 | "bwcj":subConfigBwcj, 271 | "hdl":subConfigHdl, 272 | "qcs":subConfigQcs, 273 | "eswxlt":subConfigEswxlt, 274 | "xmdl":subConfigXmdl, 275 | "hfweather":subConfigHfweather, 276 | "ciba":subConfigCiba, 277 | } 278 | // var mosaic = "xxxxxxxx" // 马赛克 279 | // var strFail = "否" 280 | // var strTrue = "是" 281 | 282 | main() // 入口 283 | 284 | // CONFIG表添加超链接 285 | function hypeLink(){ 286 | // console.log("添加超链接") 287 | let workSheet= Application.Sheets(confiWorkbook) //配置表 288 | // let workUsedRowEnd = workSheet.UsedRange.RowEnd //用户使用表格的最后一行 289 | let rowcol = getRowCol() 290 | let workUsedRowEnd = rowcol[0] // 行 291 | // console.log(workUsedRowEnd) 292 | for(let row = 2; row <= workUsedRowEnd; row++){ 293 | link_name=workSheet.Range("A" + row).Text 294 | if (link_name == "") { 295 | break; // 如果为空行,则提前结束读取 296 | } 297 | link_name ='=HYPERLINK("#'+link_name+'!$A$1","'+link_name+'")' //设置超链接 298 | // console.log(link_name) // HYPERLINK("#PUSH!$A$1","PUSH") 299 | if(version == 1){ 300 | // airscipt 1.0 301 | workSheet.Range("A" + row).Value =link_name 302 | }else{ 303 | // airscipt 2.0 304 | workSheet.Range("A" + row).Value2 =link_name 305 | } 306 | 307 | } 308 | } 309 | 310 | // 判断表格行列数,并记录目前已写入的表格行列数。目的是为了不覆盖原有数据,便于更新 311 | function determineRowCol() { 312 | for (let i = 1; i < maxRow; i++) { 313 | let content = Application.Range("A" + i).Text 314 | if (content == "") // 如果为空行,则提前结束读取 315 | { 316 | row = i - 1; // 记录的是存在数据所在的行 317 | break; 318 | } 319 | } 320 | // 超过最大行了,认为row为0,从头开始 321 | let length = colNum.length 322 | for (let i = 1; i <= length; i++) { 323 | content = Application.Range(colNum[i - 1] + "1").Text 324 | if (content == "") // 如果为空行,则提前结束读取 325 | { 326 | col = i - 1; // 记录的是存在数据所在的行 327 | break; 328 | } 329 | } 330 | // 超过最大行了,认为col为0,从头开始 331 | // console.log("✨ 当前激活表已存在:" + row + "行," + col + "列") 332 | } 333 | 334 | // 获取当前激活表的表的行列 335 | function getRowCol() { 336 | let row = 0 337 | let col = 0 338 | for (let i = 1; i < maxRow; i++) { 339 | let content = Application.Range("A" + i).Text 340 | if (content == "") // 如果为空行,则提前结束读取 341 | { 342 | row = i - 1; // 记录的是存在数据所在的行 343 | break; 344 | } 345 | } 346 | // 超过最大行了,认为row为0,从头开始 347 | let length = colNum.length 348 | for (let i = 1; i <= length; i++) { 349 | content = Application.Range(colNum[i - 1] + "1").Text 350 | if (content == "") // 如果为空行,则提前结束读取 351 | { 352 | col = i - 1; // 记录的是存在数据所在的行 353 | break; 354 | } 355 | } 356 | // 超过最大行了,认为col为0,从头开始 357 | 358 | // console.log("✨ 当前激活表已存在:" + row + "行," + col + "列") 359 | return [row, col] 360 | } 361 | 362 | // 激活工作表函数 363 | function ActivateSheet(sheetName) { 364 | let flag = 0; 365 | try { 366 | let sheet = Application.Sheets.Item(sheetName) 367 | sheet.Activate() 368 | // console.log("🍾 激活工作表:" + sheet.Name) 369 | flag = 1; 370 | } catch { 371 | flag = 0; 372 | // console.log("📢 无法激活工作表,工作表可能不存在") 373 | console.log("🪄 创建工作表:" + sheetName) 374 | createSheet(sheetName) 375 | } 376 | return flag; 377 | } 378 | 379 | // 统一编辑表函数 380 | function editConfigSheet(content) { 381 | determineRowCol(); 382 | let lengthRow = content.length 383 | let lengthCol = content[0].length 384 | if (row == 0) { // 如果行数为0,认为是空表,开始写表头 385 | for (let i = 0; i < lengthCol; i++) { 386 | if(version == 1){ 387 | // airscipt 1.0 388 | Application.Range(colNum[i] + 1).Value = content[0][i] 389 | }else{ 390 | // airscript 2.0(Beta) 391 | Application.Range(colNum[i] + 1).Value2 = content[0][i] 392 | } 393 | 394 | } 395 | 396 | row += 1; // 让行数加1,代表写入了表头。 397 | } 398 | 399 | // 从已写入的行的后一行开始逐行写入数据 400 | // 先写行 401 | for (let i = 1 + row; i <= lengthRow; i++) { // 从未写入区域开始写 402 | for (let j = 0; j < lengthCol; j++) { 403 | if(version == 1){ 404 | // airscipt 1.0 405 | Application.Range(colNum[j] + i).Value = content[i - 1][j] 406 | }else{ 407 | // airscript 2.0(Beta) 408 | Application.Range(colNum[j] + i).Value2 = content[i - 1][j] 409 | } 410 | } 411 | } 412 | // 再写列 413 | for (let j = col; j < lengthCol; j++) { 414 | for (let i = 1; i <= lengthRow; i++) { // 从未写入区域开始写 415 | if(version == 1){ 416 | // airscipt 1.0 417 | Application.Range(colNum[j] + i).Value = content[i - 1][j] 418 | }else{ 419 | // airscript 2.0(Beta) 420 | Application.Range(colNum[j] + i).Value2 = content[i - 1][j] 421 | } 422 | } 423 | } 424 | } 425 | 426 | // 存储已存在的表 427 | function storeWorkbook() { 428 | // 工作簿(Workbook)中所有工作表(Sheet)的集合,下面两种写法是一样的 429 | let sheets = Application.ActiveWorkbook.Sheets 430 | sheets = Application.Sheets 431 | 432 | // 打印所有工作表的名称 433 | for (let i = 1; i <= sheets.Count; i++) { 434 | workbook[i - 1] = (sheets.Item(i).Name) 435 | // console.log(workbook[i-1]) 436 | } 437 | } 438 | 439 | // 判断表是否已存在 440 | function workbookComp(name) { 441 | let flag = 0; 442 | let length = workbook.length 443 | for (let i = 0; i < length; i++) { 444 | if (workbook[i] == name) { 445 | flag = 1; 446 | console.log("✨ " + name + "表已存在") 447 | break 448 | } 449 | } 450 | return flag 451 | } 452 | 453 | // 创建表,若表已存在则不创建,直接写入数据 454 | function createSheet(sheetname) { 455 | // const defaultName = Application.Sheets.DefaultNewSheetName 456 | // 工作表对象 457 | if (!workbookComp(sheetname)) { 458 | console.log("🪄 创建工作表:" + sheetname) 459 | try{ 460 | Application.Sheets.Add( 461 | null, 462 | Application.ActiveSheet.Name, 463 | 1, 464 | Application.Enum.XlSheetType.xlWorksheet, 465 | sheetname 466 | ) 467 | 468 | }catch{ 469 | // console.log("😶‍🌫️ 适配airscript 2.0版本") 470 | version = 2 // 设置版本为2.0 471 | let newSheet = Application.Sheets.Add(undefined, undefined, undefined, xlWorksheet) 472 | // let newSheet = Application.Worksheets.Add() 473 | newSheet.Name = sheetname 474 | } 475 | 476 | } 477 | } 478 | 479 | // airscript检测版本 480 | function checkVesion(){ 481 | try{ 482 | let temp = Application.Range("A1").Text; 483 | Application.Range("A1").Value = temp 484 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 485 | }catch{ 486 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 487 | version = 2 488 | } 489 | } 490 | 491 | // 主函数执行流程 492 | function main(){ 493 | checkVesion() // 版本检测,以进行不同版本的适配 494 | 495 | // 动态写入CONFIG表数组数据操作 496 | // 加入标题 497 | configContent[0] = configTitle 498 | // 写入标题下内容 499 | for (let i = 0; i < configBody.length; i++) { 500 | let row = []; 501 | for (let j = 0; j < configContent[0].length; j++) { 502 | let fieldName = configContent[0][j]; 503 | let fieldValue = configBody[i][configTitleMapping[fieldName]]; 504 | if (fieldValue === undefined) { 505 | fieldValue = configBodyDefault[j]; // 如果字段不存在,使用默认值 506 | } 507 | row.push(fieldValue); 508 | } 509 | configContent.push(row); 510 | } 511 | 512 | storeWorkbook() 513 | // console.log("🪄 创建主分配表") 514 | // const sheet = Application.ActiveSheet // 激活当前表 515 | // sheet.Name = confiWorkbook // 将当前工作表的名称改为 CONFIG 516 | createSheet(confiWorkbook) 517 | ActivateSheet(confiWorkbook) 518 | editConfigSheet(configContent) // editConfig() 519 | 520 | // 加入跳转超链接 521 | hypeLink() 522 | 523 | // console.log("🪄 创建推送表") 524 | createSheet(pushWorkbook) 525 | ActivateSheet(pushWorkbook) 526 | editConfigSheet(pushContent) // editPush() 527 | 528 | // console.log("🪄 创建邮箱表") 529 | createSheet(emailWorkbook) 530 | ActivateSheet(emailWorkbook) 531 | editConfigSheet(emailContent) 532 | 533 | let length = configContent.length - 1 534 | // console.log(length) 535 | console.log("🍳 正在检索分配置表进行创建") 536 | for (let i = 0; i < length; i++) { 537 | let workbook = "" 538 | let subworkbook = "" 539 | // console.log(configContent[i+1][4]) 540 | if(configContent[i+1][4] == "是"){ // 存活的才生成表 541 | // 部分表合并,如ddmc_ddgy,则以_为分割,生成ddmc表 542 | workbook = configContent[i+1][0].split("_")[0] // 使用下划线作为分隔符,取第一个部分) 543 | ActivateSheet(workbook) // 根据CONFIG表来生成 544 | editConfigSheet(subConfigContent) 545 | 546 | // 检查是否有定制化内容,有则生成 547 | try{ 548 | subworkbook = subConfig[workbook] 549 | // console.log(subworkbook) 550 | if(subworkbook != undefined){ 551 | ActivateSheet(workbook) // 激活分配置表 552 | editConfigSheet(subworkbook) 553 | // console.log("存在定制化内容") 554 | } 555 | }catch{ 556 | // 无定制化内容 557 | // console.log("无定制化内容") 558 | } 559 | } 560 | } 561 | 562 | console.log("🎉 更新完成") 563 | 564 | } -------------------------------------------------------------------------------- /polymerizations/chinadsl.js: -------------------------------------------------------------------------------- 1 | /* 2 | name: "宽带技术网" 3 | cron: 45 0 9 * * * 4 | 脚本兼容: 金山文档(1.0),金山文档(2.0) 5 | 更新时间:20241226 6 | 环境变量名:无 7 | 环境变量值:无 8 | 备注:自动签到得积分、做任务、领取猫粮 9 | cookie填写宽带技术网网页版中获取的refresh_token。F12 -> NetWork(中文名叫"网络") ->https://www.chinadsl.net -> cookie 10 | 宽带技术网网址:https://www.chinadsl.net 11 | */ 12 | 13 | var sheetNameSubConfig = "chinadsl"; // 分配置表名称 14 | var pushHeader = "【宽带技术网】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i(.*?)<\/a>/i, 470 | // /showmenu">积分: (.*?)<\/a>/i, 471 | ] 472 | valueName = [ 473 | "用户", //"当前积分", 474 | ] 475 | valueArry = [] 476 | 477 | html = resp.text(); 478 | // console.log(html) 479 | 480 | for(i=0; i< Reg.length; i++) 481 | { 482 | flagTrue = Reg[i].test(html); // 判断是否存在字符串 483 | if (flagTrue == true) { 484 | let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 485 | // result = result[0]; 486 | result = result[1]; 487 | valueArry[i] = result 488 | content = valueName[i] + ":" + valueArry[i] + " " 489 | messageSuccess += content; 490 | console.log(content) 491 | } else { 492 | valueArry[i] = "获取失败" 493 | content = "❌ " + valueName[i] + "获取失败\n" 494 | messageFail += content; 495 | } 496 | } 497 | messageSuccess += "🎉 " + "获得登录奖励\n" 498 | 499 | sleep(2000) 500 | 501 | url = "https://www.chinadsl.net/home.php?mod=task&do=apply&id=1" 502 | 503 | // 做任务 504 | // resp = HTTP.fetch(url, { 505 | // method: "get", 506 | // headers: headers, 507 | // }); 508 | resp = HTTP.get(url, {headers: headers,}); 509 | 510 | sleep(2000) 511 | // 领取奖励 512 | url = "https://www.chinadsl.net/home.php?mod=task&do=draw&id=1" 513 | // resp = HTTP.fetch(url, { 514 | // method: "get", 515 | // headers: headers, 516 | // }); 517 | resp = HTTP.get(url, {headers: headers,}); 518 | sleep(2000) 519 | 520 | // 查询奖励积分 521 | url = "https://www.chinadsl.net/home.php?mod=task&item=done" 522 | // resp = HTTP.fetch(url, { 523 | // method: "get", 524 | // headers: headers, 525 | // }); 526 | resp = HTTP.get(url, {headers: headers,}); 527 | 528 | // 积分 猫粮 10 529 | // 正则匹配 530 | Reg = [ 531 | /积分 猫粮 (.*?) <\/td>/i, 532 | ] 533 | valueName = [ 534 | "做任务获得积分", 535 | ] 536 | valueArry = [] 537 | 538 | html = resp.text(); 539 | // console.log(html) 540 | 541 | for(i=0; i< Reg.length; i++) 542 | { 543 | flagTrue = Reg[i].test(html); // 判断是否存在字符串 544 | if (flagTrue == true) { 545 | let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 546 | // result = result[0]; 547 | result = result[1]; 548 | valueArry[i] = result 549 | content = "🎉 " + valueName[i] + ":" + valueArry[i] + "\n" 550 | messageSuccess += content; 551 | console.log(content) 552 | } else { 553 | valueArry[i] = "获取失败" 554 | content = "❌ " + valueName[i] + "获取失败\n" 555 | messageFail += content; 556 | } 557 | } 558 | 559 | 560 | sleep(2000) 561 | // 登录,获取积分 562 | // resp = HTTP.fetch(url1, { 563 | // method: "get", 564 | // headers: headers, 565 | // }); 566 | resp = HTTP.get(url1, {headers: headers,}); 567 | 568 | // 显示积分 569 | // 正则匹配 570 | Reg = [ 571 | // /title="访问我的空间">(.*?)<\/a>/i, 572 | /showmenu">积分: (.*?)<\/a>/i, 573 | ] 574 | valueName = [ 575 | //"用户", 576 | "当前积分", 577 | ] 578 | valueArry = [] 579 | 580 | html = resp.text(); 581 | // console.log(html) 582 | 583 | for(i=0; i< Reg.length; i++) 584 | { 585 | flagTrue = Reg[i].test(html); // 判断是否存在字符串 586 | if (flagTrue == true) { 587 | let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 588 | // result = result[0]; 589 | result = result[1]; 590 | valueArry[i] = result 591 | content = "🎉 " + valueName[i] + ":" + valueArry[i] + "\n" 592 | messageSuccess += content; 593 | console.log(content) 594 | } else { 595 | valueArry[i] = "获取失败" 596 | content = "❌ " + valueName[i] + "获取失败\n" 597 | messageFail += content; 598 | } 599 | } 600 | 601 | 602 | 603 | // // 将数据写入表格中 604 | // writeColoums = ["D", "E", "F", "G"] // 写入的列 605 | // for(i=0; i", 206 | to: sender, 207 | subject: pushHeader + " - " + data_time, 208 | text: message, 209 | }); 210 | // console.log("🍳 已发送邮件至:" + sender); 211 | console.log("🍳 已发送邮件"); 212 | sleep(5000); 213 | } 214 | 215 | // 邮箱配置 216 | function emailConfig() { 217 | console.log("🍳 开始读取邮箱配置"); 218 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 219 | let name; 220 | for (let i = 0; i < length; i++) { 221 | name = jsonPush[i].name; 222 | if (name == "email") { 223 | if (jsonPush[i].flag == 1) { 224 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 225 | // 邮箱表存在 226 | // var email = { 227 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 228 | // } // 有效配置 229 | if (flag == 1) { 230 | console.log("🍳 开始读取邮箱表"); 231 | for (let i = 2; i <= 2; i++) { 232 | // 从工作表中读取推送数据 233 | jsonEmail.server = Application.Range("A" + i).Text; 234 | jsonEmail.port = Application.Range("B" + i).Text; 235 | jsonEmail.sender = Application.Range("C" + i).Text; 236 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 237 | if (Application.Range("A" + i).Text == "") { 238 | // 如果为空行,则提前结束读取 239 | break; 240 | } 241 | } 242 | // console.log(jsonEmail) 243 | } 244 | break; 245 | } 246 | } 247 | } 248 | } 249 | 250 | // 推送钉钉机器人 251 | function dingtalk(message, key) { 252 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 253 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 254 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 255 | // console.log(resp.text()) 256 | sleep(5000); 257 | } 258 | 259 | // 推送Discord机器人 260 | function discord(message, key) { 261 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 262 | let url = key; 263 | let resp = HTTP.post(url, { content: message }); 264 | //console.log(resp.text()) 265 | sleep(5000); 266 | } 267 | 268 | // =================金山适配结束=================== 269 | // =================共用开始=================== 270 | // main() // 入口 271 | 272 | // function main(){ 273 | checkVesion() // 版本检测,以进行不同版本的适配 274 | 275 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 276 | // 主配置工作表存在 277 | if (flagConfig == 1) { 278 | console.log("🍳 开始读取主配置表"); 279 | let name; // 名称 280 | let onlyError; 281 | let nickname; 282 | for (let i = 2; i <= 100; i++) { 283 | // 从工作表中读取推送数据 284 | name = Application.Range("A" + i).Text; 285 | onlyError = Application.Range("C" + i).Text; 286 | nickname = Application.Range("D" + i).Text; 287 | if (name == "") { 288 | // 如果为空行,则提前结束读取 289 | break; // 提前退出,提高效率 290 | } 291 | if (name == sheetNameSubConfig) { 292 | if (onlyError == "是") { 293 | messageOnlyError = 1; 294 | console.log("🍳 只推送错误消息"); 295 | } 296 | 297 | if (nickname == "是") { 298 | messageNickname = 1; 299 | console.log("🍳 单元格用昵称替代"); 300 | } 301 | 302 | break; // 提前退出,提高效率 303 | } 304 | } 305 | } 306 | 307 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 308 | // 推送工作表存在 309 | if (flagPush == 1) { 310 | console.log("🍳 开始读取推送工作表"); 311 | let pushName; // 推送类型 312 | let pushKey; 313 | let pushFlag; // 是否推送标志 314 | for (let i = 2; i <= line; i++) { 315 | // 从工作表中读取推送数据 316 | pushName = Application.Range("A" + i).Text; 317 | pushKey = Application.Range("B" + i).Text; 318 | pushFlag = Application.Range("C" + i).Text; 319 | if (pushName == "") { 320 | // 如果为空行,则提前结束读取 321 | break; 322 | } 323 | jsonPushHandle(pushName, pushFlag, pushKey); 324 | } 325 | // console.log(jsonPush) 326 | } 327 | 328 | // 邮箱配置函数 329 | emailConfig(); 330 | 331 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 332 | if (flagSubConfig == 1) { 333 | console.log("🍳 开始读取分配置表"); 334 | 335 | if(qlSwitch != 1){ // 金山文档 336 | for (let i = 2; i <= line; i++) { 337 | var cookie = Application.Range("A" + i).Text; 338 | var exec = Application.Range("B" + i).Text; 339 | if (cookie == "") { 340 | // 如果为空行,则提前结束读取 341 | break; 342 | } 343 | if (exec == "是") { 344 | execHandle(cookie, i); 345 | } 346 | } 347 | message = messageMerge()// 将消息数组融合为一条总消息 348 | push(message); // 推送消息 349 | }else{ 350 | for (let i = 2; i <= line; i++) { 351 | var cookie = Application.Range("A" + i).Text; 352 | var exec = Application.Range("B" + i).Text; 353 | if (cookie == "") { 354 | // 如果为空行,则提前结束读取 355 | break; 356 | } 357 | if (exec == "是") { 358 | console.log("🧑 开始执行用户:" + "1" ) 359 | execHandle(cookie, i); 360 | break; // 只取一个 361 | } 362 | } 363 | } 364 | 365 | } 366 | 367 | // } 368 | 369 | // 激活工作表函数 370 | function ActivateSheet(sheetName) { 371 | let flag = 0; 372 | try { 373 | // 激活工作表 374 | let sheet = Application.Sheets.Item(sheetName); 375 | sheet.Activate(); 376 | console.log("🥚 激活工作表:" + sheet.Name); 377 | flag = 1; 378 | } catch { 379 | flag = 0; 380 | console.log("🍳 无法激活工作表,工作表可能不存在"); 381 | } 382 | return flag; 383 | } 384 | 385 | // 对推送数据进行处理 386 | function jsonPushHandle(pushName, pushFlag, pushKey) { 387 | let length = jsonPush.length; 388 | for (let i = 0; i < length; i++) { 389 | if (jsonPush[i].name == pushName) { 390 | if (pushFlag == "是") { 391 | jsonPush[i].flag = 1; 392 | jsonPush[i].key = pushKey; 393 | } 394 | } 395 | } 396 | } 397 | 398 | // 将消息数组融合为一条总消息 399 | function messageMerge(){ 400 | // console.log(messageArray) 401 | let message = "" 402 | for(i=0; i", 207 | to: sender, 208 | subject: pushHeader + " - " + data_time, 209 | text: message, 210 | }); 211 | // console.log("🍳 已发送邮件至:" + sender); 212 | console.log("🍳 已发送邮件"); 213 | sleep(5000); 214 | } 215 | 216 | // 邮箱配置 217 | function emailConfig() { 218 | console.log("🍳 开始读取邮箱配置"); 219 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 220 | let name; 221 | for (let i = 0; i < length; i++) { 222 | name = jsonPush[i].name; 223 | if (name == "email") { 224 | if (jsonPush[i].flag == 1) { 225 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 226 | // 邮箱表存在 227 | // var email = { 228 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 229 | // } // 有效配置 230 | if (flag == 1) { 231 | console.log("🍳 开始读取邮箱表"); 232 | for (let i = 2; i <= 2; i++) { 233 | // 从工作表中读取推送数据 234 | jsonEmail.server = Application.Range("A" + i).Text; 235 | jsonEmail.port = Application.Range("B" + i).Text; 236 | jsonEmail.sender = Application.Range("C" + i).Text; 237 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 238 | if (Application.Range("A" + i).Text == "") { 239 | // 如果为空行,则提前结束读取 240 | break; 241 | } 242 | } 243 | // console.log(jsonEmail) 244 | } 245 | break; 246 | } 247 | } 248 | } 249 | } 250 | 251 | // 推送钉钉机器人 252 | function dingtalk(message, key) { 253 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 254 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 255 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 256 | // console.log(resp.text()) 257 | sleep(5000); 258 | } 259 | 260 | // 推送Discord机器人 261 | function discord(message, key) { 262 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 263 | let url = key; 264 | let resp = HTTP.post(url, { content: message }); 265 | //console.log(resp.text()) 266 | sleep(5000); 267 | } 268 | 269 | // =================金山适配结束=================== 270 | // =================共用开始=================== 271 | // main() // 入口 272 | 273 | // function main(){ 274 | checkVesion() // 版本检测,以进行不同版本的适配 275 | 276 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 277 | // 主配置工作表存在 278 | if (flagConfig == 1) { 279 | console.log("🍳 开始读取主配置表"); 280 | let name; // 名称 281 | let onlyError; 282 | let nickname; 283 | for (let i = 2; i <= 100; i++) { 284 | // 从工作表中读取推送数据 285 | name = Application.Range("A" + i).Text; 286 | onlyError = Application.Range("C" + i).Text; 287 | nickname = Application.Range("D" + i).Text; 288 | if (name == "") { 289 | // 如果为空行,则提前结束读取 290 | break; // 提前退出,提高效率 291 | } 292 | if (name == sheetNameSubConfig) { 293 | if (onlyError == "是") { 294 | messageOnlyError = 1; 295 | console.log("🍳 只推送错误消息"); 296 | } 297 | 298 | if (nickname == "是") { 299 | messageNickname = 1; 300 | console.log("🍳 单元格用昵称替代"); 301 | } 302 | 303 | break; // 提前退出,提高效率 304 | } 305 | } 306 | } 307 | 308 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 309 | // 推送工作表存在 310 | if (flagPush == 1) { 311 | console.log("🍳 开始读取推送工作表"); 312 | let pushName; // 推送类型 313 | let pushKey; 314 | let pushFlag; // 是否推送标志 315 | for (let i = 2; i <= line; i++) { 316 | // 从工作表中读取推送数据 317 | pushName = Application.Range("A" + i).Text; 318 | pushKey = Application.Range("B" + i).Text; 319 | pushFlag = Application.Range("C" + i).Text; 320 | if (pushName == "") { 321 | // 如果为空行,则提前结束读取 322 | break; 323 | } 324 | jsonPushHandle(pushName, pushFlag, pushKey); 325 | } 326 | // console.log(jsonPush) 327 | } 328 | 329 | // 邮箱配置函数 330 | emailConfig(); 331 | 332 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 333 | if (flagSubConfig == 1) { 334 | console.log("🍳 开始读取分配置表"); 335 | 336 | if(qlSwitch != 1){ // 金山文档 337 | for (let i = 2; i <= line; i++) { 338 | var cookie = Application.Range("A" + i).Text; 339 | var exec = Application.Range("B" + i).Text; 340 | if (cookie == "") { 341 | // 如果为空行,则提前结束读取 342 | break; 343 | } 344 | if (exec == "是") { 345 | execHandle(cookie, i); 346 | } 347 | } 348 | message = messageMerge()// 将消息数组融合为一条总消息 349 | push(message); // 推送消息 350 | }else{ 351 | for (let i = 2; i <= line; i++) { 352 | var cookie = Application.Range("A" + i).Text; 353 | var exec = Application.Range("B" + i).Text; 354 | if (cookie == "") { 355 | // 如果为空行,则提前结束读取 356 | break; 357 | } 358 | if (exec == "是") { 359 | console.log("🧑 开始执行用户:" + "1" ) 360 | execHandle(cookie, i); 361 | break; // 只取一个 362 | } 363 | } 364 | } 365 | 366 | } 367 | 368 | // } 369 | 370 | // 激活工作表函数 371 | function ActivateSheet(sheetName) { 372 | let flag = 0; 373 | try { 374 | // 激活工作表 375 | let sheet = Application.Sheets.Item(sheetName); 376 | sheet.Activate(); 377 | console.log("🥚 激活工作表:" + sheet.Name); 378 | flag = 1; 379 | } catch { 380 | flag = 0; 381 | console.log("🍳 无法激活工作表,工作表可能不存在"); 382 | } 383 | return flag; 384 | } 385 | 386 | // 对推送数据进行处理 387 | function jsonPushHandle(pushName, pushFlag, pushKey) { 388 | let length = jsonPush.length; 389 | for (let i = 0; i < length; i++) { 390 | if (jsonPush[i].name == pushName) { 391 | if (pushFlag == "是") { 392 | jsonPush[i].flag = 1; 393 | jsonPush[i].key = pushKey; 394 | } 395 | } 396 | } 397 | } 398 | 399 | // 将消息数组融合为一条总消息 400 | function messageMerge(){ 401 | // console.log(messageArray) 402 | let message = "" 403 | for(i=0; i NetWork(中文名叫"网络") -> 按一下Ctrl+R -> web/ -> Cookie 10 | 有道云笔记网址:https://note.youdao.com/web/ 11 | */ 12 | 13 | var sheetNameSubConfig = "noteyoudao"; // 分配置表名称 14 | var pushHeader = "【有道云笔记】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i Application(中文名叫"应用程序") -> Cookie -> BDUSS 10 | 百度贴吧网址:https://tieba.baidu.com/ 11 | */ 12 | 13 | var sheetNameSubConfig = "tieba"; // 分配置表名称 14 | var pushHeader = "【百度贴吧】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i NetWork(中文名叫"网络") -> 按一下Ctrl+R -> newbbs/ -> cookie 10 | vivo社区网址:https://bbs.vivo.com.cn/newbbs/ 11 | */ 12 | 13 | var sheetNameSubConfig = "vivo"; // 分配置表名称 14 | var pushHeader = "【vivo社区】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i "NetWork"(中文名叫"网络") -> 按一下Ctrl+R -> www.wnflb2023.com -> cookie 9 | 有门槛,没账号的不用折腾。 10 | 万能福利吧网址:https://www.wnflb2023.com 11 | */ 12 | 13 | var sheetNameSubConfig = "wnflb"; // 分配置表名称 14 | var pushHeader = "【万能福利吧】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i积分: (.+?)<\/a>/i, 513 | ] 514 | 515 | valueName = [ 516 | "formhash", "签到前积分", 517 | ] 518 | 519 | html = resp.text(); 520 | // console.log(html) 521 | for(i=0; i< Reg.length; i++) 522 | { 523 | flagTrue = Reg[i].test(html); // 判断是否存在字符串 524 | if (flagTrue == true) { 525 | let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 526 | // result = result[0]; 527 | result = result[1]; 528 | if(i == 1){ 529 | content = "🎉 " + valueName[i] + ":" + result + " " 530 | messageSuccess += content; 531 | }else 532 | { 533 | formhash = result 534 | content = "🍳 formhash:" + result + " " 535 | } 536 | console.log(content) 537 | } else { 538 | content = "❌ " + "formhash获取失败 " 539 | messageFail += content; 540 | } 541 | } 542 | 543 | // 签到 544 | headers={ 545 | "Host": "www.wnflb2023.com", 546 | "Accept-Encoding": "gzip, deflate, br", 547 | "Accept-Language": "zh-CN,zh;q=0.9", 548 | // "Content-Type": "application/x-www-form-urlencoded", 549 | "X-Requested-With":"XMLHttpRequest", 550 | "Cookie":cookie, 551 | "Referer":"https://www.wnflb2023.com/", 552 | "DNT":1, 553 | } 554 | params = "&formhash=" + formhash + "&" + formhash 555 | url2 = url2 + params 556 | // console.log(url2) 557 | 558 | resp = HTTP.get( 559 | url2, 560 | { headers: headers } 561 | ); 562 | 563 | // console.log(resp.text()) 564 | 565 | // 566 | // 提示信息关闭 567 | //
568 | //
569 | //
570 | //

571 | // 572 | // 573 | //

574 | // ]]>
575 | 576 | // 577 | // 提示信息关闭 578 | //
579 | //
580 | //
581 | //

582 | // 583 | // 584 | //

585 | // ]]>
586 | 587 | // 获取签到天数数据、获取积分 588 | headers={ 589 | "Host": "www.wnflb2023.com", 590 | // "Content-Type": "application/x-www-form-urlencoded", 591 | "Cookie":cookie, 592 | // "Cookie":"" 593 | } 594 | 595 | resp = HTTP.get( 596 | url1, 597 | { headers: headers } 598 | ); 599 | // console.log(resp.text()) 600 | // 正则匹配 601 | // const Reg = /你已经连续签到(.*?)天,再接再厉!/i; 602 | Reg = [ 603 | /累计签到:(.+?)<\/i>天/i, 604 | /已连续签到:(.+?)<\/i>天/i, 605 | /showmenu">积分: (.+?)<\/a>/i, 606 | ] 607 | 608 | valueName = [ 609 | "累计签天数", "已连签天数","当前积分", 610 | ] 611 | 612 | html = resp.text(); 613 | // console.log(html) 614 | resultall = "" 615 | for(i=0; i< Reg.length; i++) 616 | { 617 | flagTrue = Reg[i].test(html); // 判断是否存在字符串 618 | if (flagTrue == true) { 619 | let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 620 | // result = result[0]; 621 | result = result[1]; 622 | if(result == "{days}" || result == "{constant}" ){ 623 | 624 | }else{ 625 | content = "🎉 " + valueName[i] + ":" + result + " " 626 | messageSuccess += content; 627 | console.log(content) 628 | } 629 | 630 | } else { 631 | content = "❌ " +"签到数据获取失败 " 632 | messageFail += content; 633 | } 634 | } 635 | 636 | // // 获取积分 637 | // // 正则匹配,获取formhash 638 | // formhash = "" 639 | // // const Reg = /你已经连续签到(.*?)天,再接再厉!/i; 640 | // Reg = [ 641 | // /formhash=(.+?)&/i, 642 | // /showmenu">积分: (.+?)<\/a>/i, 643 | 644 | // ] 645 | 646 | // valueName = [ 647 | // "formhash", "当前积分", 648 | // ] 649 | 650 | // // html = resp.text(); 651 | // // console.log(html) 652 | // for(i=0; i< Reg.length; i++) 653 | // { 654 | // flagTrue = Reg[i].test(html); // 判断是否存在字符串 655 | // if (flagTrue == true) { 656 | // let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "] 657 | // // result = result[0]; 658 | // result = result[1]; 659 | // formhash = result 660 | // if(i == 1){ 661 | // content = valueName[i] + ":" + result + " " 662 | // messageSuccess += content; 663 | // }else 664 | // { 665 | // content = "formhash:" + result + " " 666 | // } 667 | 668 | // console.log(content) 669 | // } else { 670 | // content = "formhash获取失败 " 671 | // messageFail += content; 672 | // } 673 | // } 674 | 675 | // } catch { 676 | // messageFail += messageName + "失败"; 677 | // } 678 | 679 | sleep(2000); 680 | if (messageOnlyError == 1) { 681 | messageArray[posLabel] = messageFail; 682 | } else { 683 | if(messageFail != ""){ 684 | messageArray[posLabel] = messageFail + " " + messageSuccess; 685 | }else{ 686 | messageArray[posLabel] = messageSuccess; 687 | } 688 | } 689 | 690 | if(messageArray[posLabel] != "") 691 | { 692 | console.log(messageArray[posLabel]); 693 | } 694 | } 695 | -------------------------------------------------------------------------------- /polymerizations/xmdl.js: -------------------------------------------------------------------------------- 1 | /* 2 | name: "熊猫代理" 3 | cron: 45 0 9 * * * 4 | 脚本兼容: 金山文档(2.0) 5 | 更新时间:20241106 6 | 环境变量名:xmdl 7 | 环境变量值:http://www.xiongmaodaili.com?invitationCode=1368A6DA-2960-4070-9F9B-4ABACC8D678D 需要用户名和密码 8 | */ 9 | 10 | var sheetNameSubConfig = "xmdl"; // 分配置表名称 11 | var pushHeader = "【熊猫代理】"; 12 | var sheetNameConfig = "CONFIG"; // 总配置表 13 | var sheetNamePush = "PUSH"; // 推送表名称 14 | var sheetNameEmail = "EMAIL"; // 邮箱表 15 | var flagSubConfig = 0; // 激活分配置工作表标志 16 | var flagConfig = 0; // 激活主配置工作表标志 17 | var flagPush = 0; // 激活推送工作表标志 18 | var line = 21; // 指定读取从第2行到第line行的内容 19 | var message = ""; // 待发送的消息 20 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 21 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 22 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 23 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 24 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 25 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 26 | 27 | var jsonPush = [ 28 | { name: "bark", key: "xxxxxx", flag: "0" }, 29 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 30 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 31 | { name: "email", key: "xxxxxx", flag: "0" }, 32 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 33 | { name: "discord", key: "xxxxxx", flag: "0" }, 34 | ]; // 推送数据,flag=1则推送 35 | var jsonEmail = { 36 | server: "", 37 | port: "", 38 | sender: "", 39 | authorizationCode: "", 40 | }; // 有效邮箱配置 41 | 42 | // =================青龙适配开始=================== 43 | 44 | qlSwitch = 0 45 | 46 | // =================青龙适配结束=================== 47 | 48 | // =================金山适配开始=================== 49 | // airscript检测版本 50 | function checkVesion(){ 51 | try{ 52 | let temp = Application.Range("A1").Text; 53 | Application.Range("A1").Value = temp 54 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 55 | }catch{ 56 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 57 | version = 2 58 | } 59 | } 60 | 61 | // 推送相关 62 | // 获取时间 63 | function getDate() { 64 | let currentDate = new Date(); 65 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 66 | return currentDate 67 | } 68 | 69 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 70 | function writeMessageQueue(message) { 71 | // 当天时间 72 | let todayDate = getDate() 73 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 74 | // 主配置工作表存在 75 | if (flagConfig == 1) { 76 | console.log("✨ 开始将结果写入主配置表"); 77 | for (let i = 2; i <= 100; i++) { 78 | // 找到指定的表行 79 | if (Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig) { 80 | // 写入更新的时间 81 | Application.Range("F" + (i + 2)).Value2 = todayDate 82 | // 写入消息 83 | Application.Range("G" + (i + 2)).Value2 = message 84 | console.log("✨ 写入结果完成"); 85 | break; 86 | } 87 | } 88 | } 89 | 90 | } 91 | 92 | // 总推送 93 | function push(message) { 94 | writeMessageQueue(message) // 将消息写入CONFIG表中 95 | // if (message != "") { 96 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 97 | // let length = jsonPush.length; 98 | // let name; 99 | // let key; 100 | // for (let i = 0; i < length; i++) { 101 | // if (jsonPush[i].flag == 1) { 102 | // name = jsonPush[i].name; 103 | // key = jsonPush[i].key; 104 | // if (name == "bark") { 105 | // bark(message, key); 106 | // } else if (name == "pushplus") { 107 | // pushplus(message, key); 108 | // } else if (name == "ServerChan") { 109 | // serverchan(message, key); 110 | // } else if (name == "email") { 111 | // email(message); 112 | // } else if (name == "dingtalk") { 113 | // dingtalk(message, key); 114 | // } else if (name == "discord") { 115 | // discord(message, key); 116 | // } 117 | // } 118 | // } 119 | // } else { 120 | // console.log("🍳 消息为空不推送"); 121 | // } 122 | } 123 | 124 | // 推送bark消息 125 | function bark(message, key) { 126 | if (key != "") { 127 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 128 | message = encodeURIComponent(message) 129 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 130 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 131 | // 若需要修改推送的分组,则将上面一行改为如下的形式 132 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 133 | let resp = HTTP.get(url, { 134 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 135 | }); 136 | sleep(5000); 137 | } 138 | } 139 | 140 | // 推送pushplus消息 141 | function pushplus(message, key) { 142 | if (key != "") { 143 | message = encodeURIComponent(message) 144 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 145 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 146 | let resp = HTTP.fetch(url, { 147 | method: "get", 148 | }); 149 | sleep(5000); 150 | } 151 | } 152 | 153 | // 推送serverchan消息 154 | function serverchan(message, key) { 155 | if (key != "") { 156 | url = 157 | "https://sctapi.ftqq.com/" + 158 | key + 159 | ".send" + 160 | "?title=" + messagePushHeader + 161 | "&desp=" + 162 | message; 163 | let resp = HTTP.fetch(url, { 164 | method: "get", 165 | }); 166 | sleep(5000); 167 | } 168 | } 169 | 170 | // email邮箱推送 171 | function email(message) { 172 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 173 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 174 | let server = jsonEmail.server; 175 | let port = parseInt(jsonEmail.port); // 转成整形 176 | let sender = jsonEmail.sender; 177 | let authorizationCode = jsonEmail.authorizationCode; 178 | 179 | let mailer; 180 | mailer = SMTP.login({ 181 | host: server, 182 | port: port, 183 | username: sender, 184 | password: authorizationCode, 185 | secure: true, 186 | }); 187 | mailer.send({ 188 | from: pushHeader + "<" + sender + ">", 189 | to: sender, 190 | subject: pushHeader + " - " + data_time, 191 | text: message, 192 | }); 193 | // console.log("🍳 已发送邮件至:" + sender); 194 | console.log("🍳 已发送邮件"); 195 | sleep(5000); 196 | } 197 | 198 | // 邮箱配置 199 | function emailConfig() { 200 | console.log("🍳 开始读取邮箱配置"); 201 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 202 | let name; 203 | for (let i = 0; i < length; i++) { 204 | name = jsonPush[i].name; 205 | if (name == "email") { 206 | if (jsonPush[i].flag == 1) { 207 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 208 | // 邮箱表存在 209 | // var email = { 210 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 211 | // } // 有效配置 212 | if (flag == 1) { 213 | console.log("🍳 开始读取邮箱表"); 214 | for (let i = 2; i <= 2; i++) { 215 | // 从工作表中读取推送数据 216 | jsonEmail.server = Application.Range("A" + i).Text; 217 | jsonEmail.port = Application.Range("B" + i).Text; 218 | jsonEmail.sender = Application.Range("C" + i).Text; 219 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 220 | if (Application.Range("A" + i).Text == "") { 221 | // 如果为空行,则提前结束读取 222 | break; 223 | } 224 | } 225 | // console.log(jsonEmail) 226 | } 227 | break; 228 | } 229 | } 230 | } 231 | } 232 | 233 | // 推送钉钉机器人 234 | function dingtalk(message, key) { 235 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 236 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 237 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 238 | // console.log(resp.text()) 239 | sleep(5000); 240 | } 241 | 242 | // 推送Discord机器人 243 | function discord(message, key) { 244 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 245 | let url = key; 246 | let resp = HTTP.post(url, { content: message }); 247 | //console.log(resp.text()) 248 | sleep(5000); 249 | } 250 | 251 | // =================金山适配结束=================== 252 | // =================共用开始=================== 253 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 254 | // 主配置工作表存在 255 | if (flagConfig == 1) { 256 | console.log("🍳 开始读取主配置表"); 257 | let name; // 名称 258 | let onlyError; 259 | let nickname; 260 | for (let i = 2; i <= 100; i++) { 261 | // 从工作表中读取推送数据 262 | name = Application.Range("A" + i).Text; 263 | onlyError = Application.Range("C" + i).Text; 264 | nickname = Application.Range("D" + i).Text; 265 | if (name == "") { 266 | // 如果为空行,则提前结束读取 267 | break; // 提前退出,提高效率 268 | } 269 | if (name == sheetNameSubConfig) { 270 | if (onlyError == "是") { 271 | messageOnlyError = 1; 272 | console.log("🍳 只推送错误消息"); 273 | } 274 | 275 | if (nickname == "是") { 276 | messageNickname = 1; 277 | console.log("🍳 单元格用昵称替代"); 278 | } 279 | 280 | break; // 提前退出,提高效率 281 | } 282 | } 283 | } 284 | 285 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 286 | // 推送工作表存在 287 | if (flagPush == 1) { 288 | console.log("🍳 开始读取推送工作表"); 289 | let pushName; // 推送类型 290 | let pushKey; 291 | let pushFlag; // 是否推送标志 292 | for (let i = 2; i <= line; i++) { 293 | // 从工作表中读取推送数据 294 | pushName = Application.Range("A" + i).Text; 295 | pushKey = Application.Range("B" + i).Text; 296 | pushFlag = Application.Range("C" + i).Text; 297 | if (pushName == "") { 298 | // 如果为空行,则提前结束读取 299 | break; 300 | } 301 | jsonPushHandle(pushName, pushFlag, pushKey); 302 | } 303 | // console.log(jsonPush) 304 | } 305 | 306 | // 邮箱配置函数 307 | emailConfig(); 308 | 309 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 310 | if (flagSubConfig == 1) { 311 | console.log("🍳 开始读取分配置表"); 312 | 313 | if (qlSwitch != 1) { // 金山文档 314 | for (let i = 2; i <= line; i++) { 315 | var cookie = Application.Range("A" + i).Text; 316 | var exec = Application.Range("B" + i).Text; 317 | if (cookie == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | if (exec == "是") { 322 | execHandle(cookie, i); 323 | } 324 | } 325 | message = messageMerge()// 将消息数组融合为一条总消息 326 | push(message); // 推送消息 327 | } else { 328 | for (let i = 2; i <= line; i++) { 329 | var cookie = Application.Range("A" + i).Text; 330 | var exec = Application.Range("B" + i).Text; 331 | if (cookie == "") { 332 | // 如果为空行,则提前结束读取 333 | break; 334 | } 335 | if (exec == "是") { 336 | console.log("🧑 开始执行用户:" + "1") 337 | execHandle(cookie, i); 338 | break; // 只取一个 339 | } 340 | } 341 | } 342 | 343 | } 344 | 345 | // 激活工作表函数 346 | function ActivateSheet(sheetName) { 347 | let flag = 0; 348 | try { 349 | // 激活工作表 350 | let sheet = Application.Sheets.Item(sheetName); 351 | sheet.Activate(); 352 | console.log("🥚 激活工作表:" + sheet.Name); 353 | flag = 1; 354 | } catch { 355 | flag = 0; 356 | console.log("🍳 无法激活工作表,工作表可能不存在"); 357 | } 358 | return flag; 359 | } 360 | 361 | // 对推送数据进行处理 362 | function jsonPushHandle(pushName, pushFlag, pushKey) { 363 | let length = jsonPush.length; 364 | for (let i = 0; i < length; i++) { 365 | if (jsonPush[i].name == pushName) { 366 | if (pushFlag == "是") { 367 | jsonPush[i].flag = 1; 368 | jsonPush[i].key = pushKey; 369 | } 370 | } 371 | } 372 | } 373 | 374 | // 将消息数组融合为一条总消息 375 | function messageMerge() { 376 | // console.log(messageArray) 377 | let message = "" 378 | for (i = 0; i < messageArray.length; i++) { 379 | if (messageArray[i] != "" && messageArray[i] != null) { 380 | message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头 381 | } 382 | } 383 | if (message != "") { 384 | console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨") 385 | console.log(message + "\n") // 打印总消息 386 | console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨") 387 | } 388 | return message 389 | } 390 | 391 | function sleep(d) { 392 | for (var t = Date.now(); Date.now() - t <= d;); 393 | } 394 | 395 | // 获取sign,返回小写 396 | function getsign(data) { 397 | var sign = Crypto.createHash("md5") 398 | .update(data, "utf8") 399 | .digest("hex") 400 | // .toUpperCase() // 大写 401 | .toString(); 402 | return sign; 403 | } 404 | 405 | // =================共用结束=================== 406 | 407 | // cookie字符串转json格式 408 | function cookie_to_json(cookies) { 409 | var cookie_text = cookies; 410 | var arr = []; 411 | var text_to_split = cookie_text.split(";"); 412 | for (var i in text_to_split) { 413 | var tmp = text_to_split[i].split("="); 414 | arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"'); 415 | } 416 | var res = "{\n" + arr.join(",\n") + "\n}"; 417 | return JSON.parse(res); 418 | } 419 | 420 | // 获取10 位时间戳 421 | function getts10() { 422 | var ts = Math.round(new Date().getTime() / 1000).toString(); 423 | return ts; 424 | } 425 | 426 | // 获取13位时间戳 427 | function getts13() { 428 | // var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳 429 | let ts = new Date().getTime() 430 | return ts 431 | } 432 | 433 | // 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9 434 | function generateUUID() { 435 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 436 | var r = Math.random() * 16 | 0, 437 | v = c === 'x' ? r : (r & 0x3 | 0x8); 438 | return v.toString(16); 439 | }); 440 | } 441 | 442 | function getUUIDDigits(length) { 443 | var uuid = generateUUID(); 444 | return uuid.replace(/-/g, '').substr(16, length); 445 | } 446 | 447 | function login(_0x2fbd38,_0xc0d2c5,_0x42817e){messageSuccess="".split("").reverse().join("");messageFail="".split("").reverse().join("");token="".split("").reverse().join("");resp=HTTP["\u0070\u006f\u0073\u0074"](_0x2fbd38,_0x42817e,{"\u0068\u0065\u0061\u0064\u0065\u0072\u0073":_0xc0d2c5,"\u0076\u0065\u0072\u0069\u0066\u0079":"\u0046\u0061\u006c\u0073\u0065"});console["\u006c\u006f\u0067"](resp);if(resp["\u0073\u0074\u0061\u0074\u0075\u0073"]==(0xc01b3^0xc017b)){respj=resp["\u006a\u0073\u006f\u006e"]();console["\u006c\u006f\u0067"](respj);code=respj["\u0063\u006f\u0064\u0065"];console["\u006c\u006f\u0067"](code);if(code==(0x7a616^0x7a616)){token=resp['msg']['headers']["\u0053\u0065\u0074\u002d\u0043\u006f\u006f\u006b\u0069\u0065"];console["\u006c\u006f\u0067"](token);cookies=token['toString']()["\u0073\u0070\u006c\u0069\u0074"](';');token=cookies[0x3835b^0x3835b];console['log'](token);content='📢\x20'+"\n\u529F\u6210\u5F55\u767B".split("").reverse().join("");messageSuccess+=content;console["\u006c\u006f\u0067"](content);}else{respmsg=respj["\u006d\u0073\u0067"];content='📢\x20'+respmsg+'\x0a';messageFail+=content;console["\u006c\u006f\u0067"](content);}}else{content=" \u274C".split("").reverse().join("")+"\n\u8D25\u5931\u5F55\u767B".split("").reverse().join("");messageFail+=content;console["\u006c\u006f\u0067"](content);}msg=[messageSuccess,messageFail,token];return msg;}function sign(_0x382352,_0xa987ea,_0x1cc39c){messageSuccess="".split("").reverse().join("");messageFail="";flagstatus=0xa3870^0xa3870;headers1={"\u0055\u0073\u0065\u0072\u002d\u0041\u0067\u0065\u006e\u0074":'Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/122.0.6261.95\x20Safari/537.36',"\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u002d\u0054\u0079\u0070\u0065":"\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u002f\u0078\u002d\u0077\u0077\u0077\u002d\u0066\u006f\u0072\u006d\u002d\u0075\u0072\u006c\u0065\u006e\u0063\u006f\u0064\u0065\u0064",'Cookie':_0x1cc39c};resp=HTTP['get']("emiTyaDnIngiSteg/stniop/bew-oamgnoix/moc.iliadoamgnoix.www//:ptth".split("").reverse().join(""),{'headers':headers1});console['log'](resp);respj=resp["\u006a\u0073\u006f\u006e"]();console['log'](respj);console['log'](respj['msg']);if(respj["\u0063\u006f\u0064\u0065"]!=(0x31ee9^0x31ee9)){content='❌\x20'+"\n\u8D25\u5931\u5230\u7B7E".split("").reverse().join("");messageFail+=content;console['log'](content);msg=[messageSuccess,messageFail,flagstatus];return msg;}resp=HTTP["\u0067\u0065\u0074"](_0x382352+(respj["\u006f\u0062\u006a"]+(0xc9be8^0xc9be9))['toString'](),{"\u0068\u0065\u0061\u0064\u0065\u0072\u0073":headers1});console["\u006c\u006f\u0067"](resp);console['log'](resp['msg']);if(resp['status']==(0x95688^0x95640)){resp=resp['json']();console["\u006c\u006f\u0067"](resp);code=resp["\u0063\u006f\u0064\u0065"];resp1=HTTP["\u0067\u0065\u0074"]("stnioPresUteg/stniop/bew-oamgnoix/moc.iliadoamgnoix.www//:ptth".split("").reverse().join(""),{'headers':headers1});resp1=resp1['json']();console['log'](resp1);console["\u006c\u006f\u0067"](resp1['obj']);if(code==(0xc2cb4^0xc2cb4)){respmsg=resp['msg'];score=resp1['obj'];content='🎉\x20'+respmsg+"\u5F97\u83B7".split("").reverse().join("")+score+'积分\x0a';messageSuccess+=content;console["\u006c\u006f\u0067"](content);flagstatus=0x4b0ee^0x4b0ef;}else{respmsg=resp['msg'];if(respmsg=='今日已签到!'){content='📢\x20'+respmsg+'\x0a';messageSuccess+=content;console["\u006c\u006f\u0067"](content);flagstatus=0x6b164^0x6b165;}else{content='📢\x20'+respmsg+'\x0a';messageFail+=content;console['log'](content);}}}else{content='❌\x20'+"\n\u8D25\u5931\u5230\u7B7E".split("").reverse().join("");messageFail+=content;console['log'](content);}msg=[messageSuccess,messageFail,flagstatus];return msg;}function execHandle(_0xe9bbb2,_0x21c1c2){let _0xe7398f='';let _0x36dd22="";let _0x4ed9bd='';if(messageNickname==(0x24907^0x24906)){_0x4ed9bd=Application["\u0052\u0061\u006e\u0067\u0065"]("\u0043"+_0x21c1c2)["\u0054\u0065\u0078\u0074"];if(_0x4ed9bd==''){_0x4ed9bd="A\u683C\u5143\u5355".split("").reverse().join("")+_0x21c1c2+"".split("").reverse().join("");}}posLabel=_0x21c1c2-0x2;messageHeader[posLabel]='👨‍🚀\x20'+_0x4ed9bd;var _0x19231c="nigol/resu/bew-oamgnoix/moc.iliadoamgnoix.www//:ptth".split("").reverse().join("");var _0x40e07f="=yaDnIngis?stnioPeviecer/stniop/bew-oamgnoix/moc.iliadoamgnoix.www//:ptth".split("").reverse().join("");token=_0xe9bbb2;username=Application['Range']('D'+_0x21c1c2)["\u0054\u0065\u0078\u0074"];password=Application['Range']('E'+_0x21c1c2)['Text'];headers={"\u0055\u0073\u0065\u0072\u002d\u0041\u0067\u0065\u006e\u0074":'Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/122.0.6261.95\x20Safari/537.36','Content-Type':"\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u002f\u0078\u002d\u0077\u0077\u0077\u002d\u0066\u006f\u0072\u006d\u002d\u0075\u0072\u006c\u0065\u006e\u0063\u006f\u0064\u0065\u0064"};flagstatus=0x5d8b7^0x5d8b7;if(token!=''){data={'SESSION':"\u0033\u0031\u0066\u0034\u0066\u0030\u0033\u0062\u002d\u0037\u0033\u0035\u0032\u002d\u0034\u0065\u0030\u0038\u002d\u0039\u0062\u0061\u0030\u002d\u0037\u0061\u0031\u0036\u0064\u0062\u0038\u0038\u0035\u0061\u0065\u0062"};msg=sign(_0x40e07f,headers,token);if(msg[0xa4252^0xa4250]==0x1){flagstatus=0x1;content=msg[0x0];_0xe7398f+=content;console['log'](content);}else{console['log']('🍳\x20此token签到失败,尝试登录获取新token');}}else{console['log']('🍳\x20token为空,开始进行登录获取token');}if(flagstatus!=(0x44211^0x44210)){data={'account':username,"\u0070\u0061\u0073\u0073\u0077\u006f\u0072\u0064":password,'originType':'1'};msg=login(_0x19231c,headers,data);if(msg[0x2]!=''){token=msg[0xa2fd0^0xa2fd2];console["\u006c\u006f\u0067"]('🍳\x20登录成功,已获得最新token:'+token);Application["\u0052\u0061\u006e\u0067\u0065"]('A'+_0x21c1c2)['Value2']=token;data={'SESSION':token};msg=sign(_0x40e07f,headers,token);if(msg[0x5aebe^0x5aebc]==(0x99c56^0x99c57)){content=msg[0x0];_0xe7398f+=content;console["\u006c\u006f\u0067"](content);}else{content=msg[0x65027^0x65026];_0x36dd22+=content;console["\u006c\u006f\u0067"](content);}}else{console["\u006c\u006f\u0067"]('❌\x20获取最新token为空');content=msg[0x41a6e^0x41a6f];_0x36dd22+=content;console["\u006c\u006f\u0067"](content);}}sleep(0x9ecd0^0x9eb00);if(messageOnlyError==(0xed41a^0xed41b)){messageArray[posLabel]=_0x36dd22;}else{if(_0x36dd22!=''){messageArray[posLabel]=_0x36dd22+'\x20'+_0xe7398f;}else{messageArray[posLabel]=_0xe7398f;}}if(messageArray[posLabel]!=""){console['log'](messageArray[posLabel]);}} -------------------------------------------------------------------------------- /polymerizations/ztemall.js: -------------------------------------------------------------------------------- 1 | /* 2 | name: "中兴商城自动签到、做任务" 3 | cron: 45 0 9 * * * 4 | 脚本兼容: 金山文档(1.0),金山文档(2.0) 5 | 更新时间:20241226 6 | 环境变量名:无 7 | 环境变量值:无 8 | 备注:需要Cookie。 9 | 抓包工具抓取所需的值或者网页端获取所需的值。浏览器访问网页版中兴社区,F12 -> "NetWork"(中文名叫"网络") -> 按一下Ctrl+R -> /cn -> cookie 10 | 中兴商城网址:https://www.ztemall.com/cn/ 11 | */ 12 | 13 | var sheetNameSubConfig = "ztemall"; // 分配置表名称 14 | var pushHeader = "【中兴商城】"; 15 | var sheetNameConfig = "CONFIG"; // 总配置表 16 | var sheetNamePush = "PUSH"; // 推送表名称 17 | var sheetNameEmail = "EMAIL"; // 邮箱表 18 | var flagSubConfig = 0; // 激活分配置工作表标志 19 | var flagConfig = 0; // 激活主配置工作表标志 20 | var flagPush = 0; // 激活推送工作表标志 21 | var line = 21; // 指定读取从第2行到第line行的内容 22 | var message = ""; // 待发送的消息 23 | var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置 24 | var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。 25 | var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识 26 | var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息 27 | var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】 28 | var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta) 29 | 30 | var jsonPush = [ 31 | { name: "bark", key: "xxxxxx", flag: "0" }, 32 | { name: "pushplus", key: "xxxxxx", flag: "0" }, 33 | { name: "ServerChan", key: "xxxxxx", flag: "0" }, 34 | { name: "email", key: "xxxxxx", flag: "0" }, 35 | { name: "dingtalk", key: "xxxxxx", flag: "0" }, 36 | { name: "discord", key: "xxxxxx", flag: "0" }, 37 | ]; // 推送数据,flag=1则推送 38 | var jsonEmail = { 39 | server: "", 40 | port: "", 41 | sender: "", 42 | authorizationCode: "", 43 | }; // 有效邮箱配置 44 | 45 | // =================青龙适配开始=================== 46 | 47 | qlSwitch = 0 48 | 49 | // =================青龙适配结束=================== 50 | 51 | // =================金山适配开始=================== 52 | // airscript检测版本 53 | function checkVesion(){ 54 | try{ 55 | let temp = Application.Range("A1").Text; 56 | Application.Range("A1").Value = temp 57 | console.log("😶‍🌫️ 检测到当前airscript版本为1.0,进行1.0适配") 58 | }catch{ 59 | console.log("😶‍🌫️ 检测到当前airscript版本为2.0,进行2.0适配") 60 | version = 2 61 | } 62 | } 63 | 64 | // 推送相关 65 | // 获取时间 66 | function getDate(){ 67 | let currentDate = new Date(); 68 | currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString(); 69 | return currentDate 70 | } 71 | 72 | // 将消息写入CONFIG表中作为消息队列,之后统一发送 73 | function writeMessageQueue(message){ 74 | // 当天时间 75 | let todayDate = getDate() 76 | flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表 77 | // 主配置工作表存在 78 | if (flagConfig == 1) { 79 | console.log("✨ 开始将结果写入主配置表"); 80 | for (let i = 2; i <= 100; i++) { 81 | if(version == 1){ 82 | // 找到指定的表行 83 | if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){ 84 | // 写入更新的时间 85 | Application.Range("F" + (i + 2)).Value = todayDate 86 | // 写入消息 87 | Application.Range("G" + (i + 2)).Value = message 88 | console.log("✨ 写入结果完成"); 89 | break; 90 | } 91 | }else{ 92 | // 找到指定的表行 93 | if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){ 94 | // 写入更新的时间 95 | Application.Range("F" + (i + 2)).Value2 = todayDate 96 | // 写入消息 97 | Application.Range("G" + (i + 2)).Value2 = message 98 | console.log("✨ 写入结果完成"); 99 | break; 100 | } 101 | } 102 | 103 | } 104 | } 105 | } 106 | 107 | // 总推送 108 | function push(message) { 109 | writeMessageQueue(message) // 将消息写入CONFIG表中 110 | // if (message != "") { 111 | // // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 112 | // let length = jsonPush.length; 113 | // let name; 114 | // let key; 115 | // for (let i = 0; i < length; i++) { 116 | // if (jsonPush[i].flag == 1) { 117 | // name = jsonPush[i].name; 118 | // key = jsonPush[i].key; 119 | // if (name == "bark") { 120 | // bark(message, key); 121 | // } else if (name == "pushplus") { 122 | // pushplus(message, key); 123 | // } else if (name == "ServerChan") { 124 | // serverchan(message, key); 125 | // } else if (name == "email") { 126 | // email(message); 127 | // } else if (name == "dingtalk") { 128 | // dingtalk(message, key); 129 | // } else if (name == "discord") { 130 | // discord(message, key); 131 | // } 132 | // } 133 | // } 134 | // } else { 135 | // console.log("🍳 消息为空不推送"); 136 | // } 137 | } 138 | 139 | // 推送bark消息 140 | function bark(message, key) { 141 | if (key != "") { 142 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 143 | message = encodeURIComponent(message) 144 | BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png" 145 | let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON; 146 | // 若需要修改推送的分组,则将上面一行改为如下的形式 147 | // let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名"; 148 | let resp = HTTP.get(url, { 149 | headers: { "Content-Type": "application/x-www-form-urlencoded" }, 150 | }); 151 | sleep(5000); 152 | } 153 | } 154 | 155 | // 推送pushplus消息 156 | function pushplus(message, key) { 157 | if (key != "") { 158 | message = encodeURIComponent(message) 159 | // url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message; 160 | url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题 161 | let resp = HTTP.fetch(url, { 162 | method: "get", 163 | }); 164 | sleep(5000); 165 | } 166 | } 167 | 168 | // 推送serverchan消息 169 | function serverchan(message, key) { 170 | if (key != "") { 171 | url = 172 | "https://sctapi.ftqq.com/" + 173 | key + 174 | ".send" + 175 | "?title=" + messagePushHeader + 176 | "&desp=" + 177 | message; 178 | let resp = HTTP.fetch(url, { 179 | method: "get", 180 | }); 181 | sleep(5000); 182 | } 183 | } 184 | 185 | // email邮箱推送 186 | function email(message) { 187 | var myDate = new Date(); // 创建一个表示当前时间的 Date 对象 188 | var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示 189 | let server = jsonEmail.server; 190 | let port = parseInt(jsonEmail.port); // 转成整形 191 | let sender = jsonEmail.sender; 192 | let authorizationCode = jsonEmail.authorizationCode; 193 | 194 | let mailer; 195 | mailer = SMTP.login({ 196 | host: server, 197 | port: port, 198 | username: sender, 199 | password: authorizationCode, 200 | secure: true, 201 | }); 202 | mailer.send({ 203 | from: pushHeader + "<" + sender + ">", 204 | to: sender, 205 | subject: pushHeader + " - " + data_time, 206 | text: message, 207 | }); 208 | // console.log("🍳 已发送邮件至:" + sender); 209 | console.log("🍳 已发送邮件"); 210 | sleep(5000); 211 | } 212 | 213 | // 邮箱配置 214 | function emailConfig() { 215 | console.log("🍳 开始读取邮箱配置"); 216 | let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历 217 | let name; 218 | for (let i = 0; i < length; i++) { 219 | name = jsonPush[i].name; 220 | if (name == "email") { 221 | if (jsonPush[i].flag == 1) { 222 | let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表 223 | // 邮箱表存在 224 | // var email = { 225 | // 'email':'', 'port':'', 'sender':'', 'authorizationCode':'' 226 | // } // 有效配置 227 | if (flag == 1) { 228 | console.log("🍳 开始读取邮箱表"); 229 | for (let i = 2; i <= 2; i++) { 230 | // 从工作表中读取推送数据 231 | jsonEmail.server = Application.Range("A" + i).Text; 232 | jsonEmail.port = Application.Range("B" + i).Text; 233 | jsonEmail.sender = Application.Range("C" + i).Text; 234 | jsonEmail.authorizationCode = Application.Range("D" + i).Text; 235 | if (Application.Range("A" + i).Text == "") { 236 | // 如果为空行,则提前结束读取 237 | break; 238 | } 239 | } 240 | // console.log(jsonEmail) 241 | } 242 | break; 243 | } 244 | } 245 | } 246 | } 247 | 248 | // 推送钉钉机器人 249 | function dingtalk(message, key) { 250 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 251 | let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key; 252 | let resp = HTTP.post(url, { msgtype: "text", text: { content: message } }); 253 | // console.log(resp.text()) 254 | sleep(5000); 255 | } 256 | 257 | // 推送Discord机器人 258 | function discord(message, key) { 259 | message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】 260 | let url = key; 261 | let resp = HTTP.post(url, { content: message }); 262 | //console.log(resp.text()) 263 | sleep(5000); 264 | } 265 | 266 | // =================金山适配结束=================== 267 | // =================共用开始=================== 268 | // main() // 入口 269 | 270 | // function main(){ 271 | checkVesion() // 版本检测,以进行不同版本的适配 272 | 273 | flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表 274 | // 主配置工作表存在 275 | if (flagConfig == 1) { 276 | console.log("🍳 开始读取主配置表"); 277 | let name; // 名称 278 | let onlyError; 279 | let nickname; 280 | for (let i = 2; i <= 100; i++) { 281 | // 从工作表中读取推送数据 282 | name = Application.Range("A" + i).Text; 283 | onlyError = Application.Range("C" + i).Text; 284 | nickname = Application.Range("D" + i).Text; 285 | if (name == "") { 286 | // 如果为空行,则提前结束读取 287 | break; // 提前退出,提高效率 288 | } 289 | if (name == sheetNameSubConfig) { 290 | if (onlyError == "是") { 291 | messageOnlyError = 1; 292 | console.log("🍳 只推送错误消息"); 293 | } 294 | 295 | if (nickname == "是") { 296 | messageNickname = 1; 297 | console.log("🍳 单元格用昵称替代"); 298 | } 299 | 300 | break; // 提前退出,提高效率 301 | } 302 | } 303 | } 304 | 305 | flagPush = ActivateSheet(sheetNamePush); // 激活推送表 306 | // 推送工作表存在 307 | if (flagPush == 1) { 308 | console.log("🍳 开始读取推送工作表"); 309 | let pushName; // 推送类型 310 | let pushKey; 311 | let pushFlag; // 是否推送标志 312 | for (let i = 2; i <= line; i++) { 313 | // 从工作表中读取推送数据 314 | pushName = Application.Range("A" + i).Text; 315 | pushKey = Application.Range("B" + i).Text; 316 | pushFlag = Application.Range("C" + i).Text; 317 | if (pushName == "") { 318 | // 如果为空行,则提前结束读取 319 | break; 320 | } 321 | jsonPushHandle(pushName, pushFlag, pushKey); 322 | } 323 | // console.log(jsonPush) 324 | } 325 | 326 | // 邮箱配置函数 327 | emailConfig(); 328 | 329 | flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表 330 | if (flagSubConfig == 1) { 331 | console.log("🍳 开始读取分配置表"); 332 | 333 | if(qlSwitch != 1){ // 金山文档 334 | for (let i = 2; i <= line; i++) { 335 | var cookie = Application.Range("A" + i).Text; 336 | var exec = Application.Range("B" + i).Text; 337 | if (cookie == "") { 338 | // 如果为空行,则提前结束读取 339 | break; 340 | } 341 | if (exec == "是") { 342 | execHandle(cookie, i); 343 | } 344 | } 345 | message = messageMerge()// 将消息数组融合为一条总消息 346 | push(message); // 推送消息 347 | }else{ 348 | for (let i = 2; i <= line; i++) { 349 | var cookie = Application.Range("A" + i).Text; 350 | var exec = Application.Range("B" + i).Text; 351 | if (cookie == "") { 352 | // 如果为空行,则提前结束读取 353 | break; 354 | } 355 | if (exec == "是") { 356 | console.log("🧑 开始执行用户:" + "1" ) 357 | execHandle(cookie, i); 358 | break; // 只取一个 359 | } 360 | } 361 | } 362 | 363 | } 364 | 365 | // } 366 | 367 | // 激活工作表函数 368 | function ActivateSheet(sheetName) { 369 | let flag = 0; 370 | try { 371 | // 激活工作表 372 | let sheet = Application.Sheets.Item(sheetName); 373 | sheet.Activate(); 374 | console.log("🥚 激活工作表:" + sheet.Name); 375 | flag = 1; 376 | } catch { 377 | flag = 0; 378 | console.log("🍳 无法激活工作表,工作表可能不存在"); 379 | } 380 | return flag; 381 | } 382 | 383 | // 对推送数据进行处理 384 | function jsonPushHandle(pushName, pushFlag, pushKey) { 385 | let length = jsonPush.length; 386 | for (let i = 0; i < length; i++) { 387 | if (jsonPush[i].name == pushName) { 388 | if (pushFlag == "是") { 389 | jsonPush[i].flag = 1; 390 | jsonPush[i].key = pushKey; 391 | } 392 | } 393 | } 394 | } 395 | 396 | // 将消息数组融合为一条总消息 397 | function messageMerge(){ 398 | // console.log(messageArray) 399 | let message = "" 400 | for(i=0; i