import schedule from "node-schedule"; import common from "../../../lib/common/common.js"; import axios from "axios"; import fs from "node:fs"; /** * 请求模板 */ class jFeatch { async get(url) { const r = await fetch(url); return await r.json(); } async post(url, params) { const r = await fetch(url, { ...params, method: "POST" }); return await r.json(); } } /** * 每日推送函数 * @param func 回调函数 * @param time cron * @param isAutoPush 是否推送(开关) */ function autoTask(func, time, groupList, isAutoPush = false) { if (isAutoPush) { schedule.scheduleJob(time, () => { // 正常传输 if (groupList instanceof Array) { for (let i = 0; i < groupList.length; i++) { const group = Bot.pickGroup(groupList[i]); func(group); common.sleep(1000); } // 防止恶意破坏函数 } else if (groupList instanceof String) { const group = Bot.pickGroup(groupList[i]); func(group); common.sleep(1000); } else { throw Error("错误传入每日推送参数!"); } }); } } /** * 重试函数(暂时只用于抖音的api) * @param func * @param maxRetries * @param delay * @returns {Promise} */ function retry(func, maxRetries = 3, delay = 1000) { return new Promise((resolve, reject) => { const attempt = (remainingTries) => { func() .then(resolve) .catch(error => { if (remainingTries === 1) { reject(error); } else { console.log(`错误: ${error}. 重试将在 ${delay/1000} 秒...`); setTimeout(() => attempt(remainingTries - 1), delay); } }); }; attempt(maxRetries); }); } /** * 工具:下载pdf文件 * @param url * @param filename * @returns {Promise} */ function downloadPDF (url, filename) { return axios({ url: url, responseType: "stream", headers: { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", }, }).then(response => { const writer = fs.createWriteStream(filename); response.data.pipe(writer); return new Promise((resolve, reject) => { writer.on("finish", resolve); writer.on("error", reject); }); }); } export { jFeatch, autoTask, retry };