diff --git a/db/pbClient.ts b/db/pbClient.ts index 5a005d7..11f28d0 100644 --- a/db/pbClient.ts +++ b/db/pbClient.ts @@ -1,5 +1,7 @@ -import PocketBase from 'pocketbase'; +import PocketBase from "pocketbase"; -const pbClient = new PocketBase('https://eggpb.imoaix.cn') +const pbClient = new PocketBase("https://eggpb.imoaix.cn"); + +pbClient.autoCancellation(false); export default pbClient; diff --git a/routes/bot/eventMsg.ts b/routes/bot/eventMsg.ts index 24b7e8b..bcac15d 100644 --- a/routes/bot/eventMsg.ts +++ b/routes/bot/eventMsg.ts @@ -1,3 +1,4 @@ +import sendRank from "../../schedule/rank"; import service from "../../services"; import { LarkEvent } from "../../types"; import { @@ -99,6 +100,10 @@ const manageCMDMsg = (body: LarkEvent.Data) => { service.attach.ciMonitor(chatId); return true; } + if (text === "/rank") { + sendRank(); + return true; + } if (text.includes("share") && text.includes("简报")) { service.attach.reportCollector(body); // 这个用时比较久,先发一条提醒用户收到了请求 diff --git a/schedule/index.ts b/schedule/index.ts index 0f919f1..21e5bfe 100644 --- a/schedule/index.ts +++ b/schedule/index.ts @@ -1,9 +1,13 @@ import { resetAccessToken } from "./accessToken"; -import schedule from 'node-schedule' +import schedule from "node-schedule"; +import sendRank from "./rank"; export const initSchedule = async () => { // 定时任务,每15分钟刷新一次token - schedule.scheduleJob('*/15 * * * *', resetAccessToken); + schedule.scheduleJob("*/15 * * * *", resetAccessToken); + // 每天的早九到晚九点,每小时请求一次 + schedule.scheduleJob("0 9-21 * * *", sendRank); // 立即执行一次 - resetAccessToken() -} + resetAccessToken(); + sendRank(); +}; diff --git a/schedule/rank.ts b/schedule/rank.ts new file mode 100644 index 0000000..50187b3 --- /dev/null +++ b/schedule/rank.ts @@ -0,0 +1,52 @@ +import service from "../services"; + +const sendRank = async () => { + try { + const res = await fetch( + "https://hackathon.tech.xiaomi.com/api/hackathon/2024/vote/list?eventId=33", + { + headers: { + accept: "*/*", + "accept-language": "zh-CN,zh;q=0.9", + baggage: + "sentry-environment=production,sentry-public_key=5b89f1d1d10446f8aca80e4abb1d1024,sentry-trace_id=959f1d5181e3484f841c54042b92ffa2,sentry-sample_rate=1,sentry-sampled=true", + priority: "u=1, i", + "sec-ch-ua": + '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"Windows"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "sentry-trace": "959f1d5181e3484f841c54042b92ffa2-a6a672209bb4b943-1", + cookie: + "_ga=GA1.2.1499426685.1700792693; _ga_7QJJZB70B9=GS1.1.1712110519.9.1.1712110567.0.0.0; _tea_utm_cache_1229=undefined; _aegis_cas=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE3MTgzNzM4NTYsImRlcGlkIjoiK1x1MDAxYkx1JVx1MDAwMWd3aV1WYkNcdTAwMTVcXG9wXHUwMDA0aV1WakRcdTAwMWIyeFx1MDAwM1x1MDAwNGldXmEiLCJhdWQiOiJoYWNrYXRob24udGVjaC54aWFvbWkuY29tIiwiYyI6MCwiZGV0YWlsIjoixuw1XHLVr96TnXR4-es_QGRccrRB6rJcdTAwMTEyNrt3OfOQI-epXHK8x0fJX-NRjtVRUdNPJm_oQ1xm85OLkIA_V9ZQyvGd5u2Hxpp0x7lzcozY0ttZy35cL1wi3v-gXHUwMDFikppyuztEx1x1MDAxZaJcdTAwMWJKXHUwMDFjOi02fjH74sxXXGJcdTAwMTNIeTtpXHUwMDA0sdlcdTAwMTFaTyXIXHUwMDA20Vx1MDAxZVxyw6Y1lm_a8pJccimWXGZcdTAwMTFMXHUwMDBmacBcdTAwMDZl3ZTxuEhL5Vx1MDAxZVx1MDAxOFx1MDAwYofjYIHLh0Ggg3eNbLTv6HBcYlx1MDAxNLmKZd25wEQ5XHUwMDA3Jlx1MDAxOFxyJJSSXCJbdjxcdTAwMDPp3ZKvKHXXXHUwMDE5ei43NHNzS4orXHUwMDFlsJFrra2KllxcTu-ucoRRXCJH_mHqj-wy0ZmRROlcdTAwMGWMpLd8U2W6tyaEcFx1MDAxYapMrTRKqLyHqfJ4dTdcYvYycKt4N1x1MDAwMkSZxlwio9YoR7bmiWKpyOuIXHUwMDAzp9XrQrOJ7Lx4tiNcdTAwMDdcIlx1MDAwYmg0k82Dr__vnbVNdfSEkoL19Ow-LV9DNimXUpW9sEpqwLvbXHUwMDA3V-UzTTNZXHLwtn6iPnfcdjlaoCpN2KRcdTAwMGZcdTAwMWaqk43C4Uh6wmJgUWhmSu9Go33msVx1MDAxMWoyvWPgTfq-h8HzXHUwMDExs1wvRYxvt-09XG6r1_JcZqGUo3j2dVeGXHUwMDdmujb59_xlMaDeToNcdTAwMDE3KrggT4CmifFcdTAwMTKyVVx1MDAxOWFD5Fx1MDAxOIOdTCb17cjTsUh6NofpScrnJ0T7iej0XHUwMDE4mlx1MDAxNuSchHFR5mK31Fx0Vlx1MDAwNMRZpcnI14vfkmfJ3PXe1kSs81x1MDAwYu6z0tW294NH31x1MDAxMv7z0yQ6KetGQP0-4c6A5quU48lcdTAwMDbLSK5cdTAwMTjVg1x1MDAxMMd3co5FQip2bfNaa2fQg37-W1xmi1x1MDAxZsOmb9i1XHUwMDE1oU6O7pRcbtk0TjPLXHUwMDA2REzqXCLW5pra1ilfPpfgZF1KvMdkXHUwMDA3J_ddZutdTLxVlHt0KFW7Plx1MDAwM1x1MDAxNven-_dqIyIsInN1YiI6InpoYW95aW5nYm8iLCJ0IjoiZmFsc2UiLCJ1dCI6Ilx1MDAwMz9cdTAwMDZNXHRCVlEiLCJleHAiOjE3MTg2MzY2NTYsImQiOiI2NTI3OTdhYTZjZTg2ZWI2NzNiN2Y2OTdjYWM0Y2ZkZSIsImlzcyI6Ik1JLUlORk9TRUMiLCJsIjoiJVx1MDAxYThcdTAwMTFWXHUwMDBmIiwidHlwIjoiY2FzIn0.o6vB65DrlSft290e5OM4TPD4mHOI5MXMOZFM-WS1RMdhMTrUfs4meDiBjIBY28dDlQ2ANXVnRDsKvu7zFWacvA", + Referer: "https://hackathon.tech.xiaomi.com/2024", + "Referrer-Policy": "strict-origin-when-cross-origin", + }, + body: null, + method: "GET", + } + ); + const data = (await res.json()) as any; + const list = data.data.votedInfoList as any[]; + // 排序 + list.sort((a: any, b: any) => b.voteCount - a.voteCount); + const index = list.findIndex((v) => v.teamName === "聚光灯"); + const diff = list[0].voteCount - list[index].voteCount; + const content = `当前票数:${list[index].voteCount},排名:${ + index + 1 + },距离第一名:${diff}`; + + service.lark.message.send("egg")( + "chat_id", + "oc_bafb83413e933e25994dd313f5d76c7e", + "text", + content + ); + } catch (e) { + console.error(e); + } +}; + +export default sendRank; diff --git a/services/lark/message.ts b/services/lark/message.ts index 2ec89ec..a1da991 100644 --- a/services/lark/message.ts +++ b/services/lark/message.ts @@ -18,6 +18,9 @@ const send = content: string ) => { const URL = `https://open.f.mioffice.cn/open-apis/im/v1/messages?receive_id_type=${receive_id_type}`; + if (msg_type === "text" && !content.includes("text:")) { + content = JSON.stringify({ text: content }); + } return larkNetTool.post(appName)(URL, { receive_id, msg_type, diff --git a/test/req.ts b/test/req.ts new file mode 100644 index 0000000..d4ea03c --- /dev/null +++ b/test/req.ts @@ -0,0 +1,62 @@ +import { initSchedule } from "../schedule"; +import service from "../services"; + +const req = async () => { + const res = await fetch( + "https://hackathon.tech.xiaomi.com/api/hackathon/2024/vote/list?eventId=33", + { + headers: { + accept: "*/*", + "accept-language": "zh-CN,zh;q=0.9", + baggage: + "sentry-environment=production,sentry-public_key=5b89f1d1d10446f8aca80e4abb1d1024,sentry-trace_id=959f1d5181e3484f841c54042b92ffa2,sentry-sample_rate=1,sentry-sampled=true", + priority: "u=1, i", + "sec-ch-ua": + '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"Windows"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "sentry-trace": "959f1d5181e3484f841c54042b92ffa2-a6a672209bb4b943-1", + cookie: + "_ga=GA1.2.1499426685.1700792693; _ga_7QJJZB70B9=GS1.1.1712110519.9.1.1712110567.0.0.0; _tea_utm_cache_1229=undefined; _aegis_cas=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE3MTgzNzM4NTYsImRlcGlkIjoiK1x1MDAxYkx1JVx1MDAwMWd3aV1WYkNcdTAwMTVcXG9wXHUwMDA0aV1WakRcdTAwMWIyeFx1MDAwM1x1MDAwNGldXmEiLCJhdWQiOiJoYWNrYXRob24udGVjaC54aWFvbWkuY29tIiwiYyI6MCwiZGV0YWlsIjoixuw1XHLVr96TnXR4-es_QGRccrRB6rJcdTAwMTEyNrt3OfOQI-epXHK8x0fJX-NRjtVRUdNPJm_oQ1xm85OLkIA_V9ZQyvGd5u2Hxpp0x7lzcozY0ttZy35cL1wi3v-gXHUwMDFikppyuztEx1x1MDAxZaJcdTAwMWJKXHUwMDFjOi02fjH74sxXXGJcdTAwMTNIeTtpXHUwMDA0sdlcdTAwMTFaTyXIXHUwMDA20Vx1MDAxZVxyw6Y1lm_a8pJccimWXGZcdTAwMTFMXHUwMDBmacBcdTAwMDZl3ZTxuEhL5Vx1MDAxZVx1MDAxOFx1MDAwYofjYIHLh0Ggg3eNbLTv6HBcYlx1MDAxNLmKZd25wEQ5XHUwMDA3Jlx1MDAxOFxyJJSSXCJbdjxcdTAwMDPp3ZKvKHXXXHUwMDE5ei43NHNzS4orXHUwMDFlsJFrra2KllxcTu-ucoRRXCJH_mHqj-wy0ZmRROlcdTAwMGWMpLd8U2W6tyaEcFx1MDAxYapMrTRKqLyHqfJ4dTdcYvYycKt4N1x1MDAwMkSZxlwio9YoR7bmiWKpyOuIXHUwMDAzp9XrQrOJ7Lx4tiNcdTAwMDdcIlx1MDAwYmg0k82Dr__vnbVNdfSEkoL19Ow-LV9DNimXUpW9sEpqwLvbXHUwMDA3V-UzTTNZXHLwtn6iPnfcdjlaoCpN2KRcdTAwMGZcdTAwMWaqk43C4Uh6wmJgUWhmSu9Go33msVx1MDAxMWoyvWPgTfq-h8HzXHUwMDExs1wvRYxvt-09XG6r1_JcZqGUo3j2dVeGXHUwMDdmujb59_xlMaDeToNcdTAwMDE3KrggT4CmifFcdTAwMTKyVVx1MDAxOWFD5Fx1MDAxOIOdTCb17cjTsUh6NofpScrnJ0T7iej0XHUwMDE4mlx1MDAxNuSchHFR5mK31Fx0Vlx1MDAwNMRZpcnI14vfkmfJ3PXe1kSs81x1MDAwYu6z0tW294NH31x1MDAxMv7z0yQ6KetGQP0-4c6A5quU48lcdTAwMDbLSK5cdTAwMTjVg1x1MDAxMMd3co5FQip2bfNaa2fQg37-W1xmi1x1MDAxZsOmb9i1XHUwMDE1oU6O7pRcbtk0TjPLXHUwMDA2REzqXCLW5pra1ilfPpfgZF1KvMdkXHUwMDA3J_ddZutdTLxVlHt0KFW7Plx1MDAwM1x1MDAxNven-_dqIyIsInN1YiI6InpoYW95aW5nYm8iLCJ0IjoiZmFsc2UiLCJ1dCI6Ilx1MDAwMz9cdTAwMDZNXHRCVlEiLCJleHAiOjE3MTg2MzY2NTYsImQiOiI2NTI3OTdhYTZjZTg2ZWI2NzNiN2Y2OTdjYWM0Y2ZkZSIsImlzcyI6Ik1JLUlORk9TRUMiLCJsIjoiJVx1MDAxYThcdTAwMTFWXHUwMDBmIiwidHlwIjoiY2FzIn0.o6vB65DrlSft290e5OM4TPD4mHOI5MXMOZFM-WS1RMdhMTrUfs4meDiBjIBY28dDlQ2ANXVnRDsKvu7zFWacvA", + Referer: "https://hackathon.tech.xiaomi.com/2024", + "Referrer-Policy": "strict-origin-when-cross-origin", + }, + body: null, + method: "GET", + } + ); + return (await res.json()) as any; +}; + +setInterval(async () => { + const res = await req(); + const list = res.data.votedInfoList as any[]; + // 排序 + list.sort((a: any, b: any) => b.voteCount - a.voteCount); + + const index = list.findIndex((v) => v.teamName === "聚光灯"); + const curItem = list[index]; + const firstItem = list[0]; + const voteCount = curItem.voteCount; + const voteCountFirst = firstItem.voteCount; + const diff = voteCountFirst - voteCount; + const content = `当前票数:${voteCount},排名:${ + index + 1 + },距离第一名:${diff}`; + console.log(content); + + // console.log("🚀 ~ finalData:", finalData); + + // if (res !== "配置模块不存在") { + // service.lark.message.send("egg")( + // "user_id", + // "zhaoyingbo", + // "text", + // '{"text":"投票系统可用"}' + // ); + // clearInterval(timer); + // } +}, 2000);