diff --git a/.gitignore b/.gitignore index 70c58a19..b339a1bc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,4 @@ dist/ # Build *.db -checkVersion.sh +checkVersion.sh \ No newline at end of file diff --git a/src/common/utils/request.ts b/src/common/utils/request.ts index 8cdebd8f..f8977ff6 100644 --- a/src/common/utils/request.ts +++ b/src/common/utils/request.ts @@ -3,32 +3,51 @@ import http from 'node:http'; export class RequestUtil { // 适用于获取服务器下发cookies时获取,仅GET - static async HttpsGetCookies(url: string): Promise> { - return new Promise>((resolve, reject) => { - const protocol = url.startsWith('https://') ? https : http; - protocol.get(url, (res) => { - const cookiesHeader = res.headers['set-cookie']; - if (!cookiesHeader) { - resolve(new Map()); - } else { - const cookiesMap = new Map(); - cookiesHeader.forEach((cookieStr) => { - cookieStr.split(';').forEach((cookiePart) => { - const trimmedPart = cookiePart.trim(); - if (trimmedPart.includes('=')) { - const [key, value] = trimmedPart.split('=').map(part => part.trim()); - cookiesMap.set(key, decodeURIComponent(value)); // 解码cookie值 - } - }); + static async HttpsGetCookies(url: string): Promise<{ [key: string]: string }> { + const client = url.startsWith('https') ? https : http; + return new Promise((resolve, reject) => { + client.get(url, (res) => { + let cookies: { [key: string]: string } = {}; + const handleRedirect = (res: http.IncomingMessage) => { + //console.log(res.headers.location); + if (res.statusCode === 301 || res.statusCode === 302) { + if (res.headers.location) { + const redirectUrl = new URL(res.headers.location, url); + RequestUtil.HttpsGetCookies(redirectUrl.href).then((redirectCookies) => { + // 合并重定向过程中的cookies + cookies = { ...cookies, ...redirectCookies }; + resolve(cookies); + }); + } else { + resolve(cookies); + } + } else { + resolve(cookies); + } + }; + res.on('data', () => { }); // Necessary to consume the stream + res.on('end', () => { + handleRedirect(res); + }); + if (res.headers['set-cookie']) { + //console.log(res.headers['set-cookie']); + res.headers['set-cookie'].forEach((cookie) => { + const parts = cookie.split(';')[0].split('='); + const key = parts[0]; + const value = parts[1]; + if (key && value && key.length > 0 && value.length > 0) { + cookies[key] = value; + } }); - resolve(cookiesMap); } - }).on('error', (error) => { - reject(error); + }).on('error', (err) => { + reject(err); }); }); } + + // 请求和回复都是JSON data传原始内容 自动编码json static async HttpGetJson(url: string, method: string = 'GET', data?: any, headers: Record = {}, isJsonRet: boolean = true, isArgJson: boolean = true): Promise { const option = new URL(url); diff --git a/src/core b/src/core index 55727918..f2eb0fa5 160000 --- a/src/core +++ b/src/core @@ -1 +1 @@ -Subproject commit 55727918696e7173f2a0830c21a17d92b89ff7eb +Subproject commit f2eb0fa596131a39b15cdca71c325314af40265c diff --git a/src/onebot11/action/group/GetGroupMemberList.ts b/src/onebot11/action/group/GetGroupMemberList.ts index 556fd894..3a646bab 100644 --- a/src/onebot11/action/group/GetGroupMemberList.ts +++ b/src/onebot11/action/group/GetGroupMemberList.ts @@ -3,7 +3,7 @@ import { OB11GroupMember } from '../../types'; import { OB11Constructor } from '../../constructor'; import BaseAction from '../BaseAction'; import { ActionName } from '../types'; -import { napCatCore, NTQQGroupApi, NTQQUserApi } from '@/core'; +import { napCatCore, NTQQGroupApi, NTQQUserApi, SignMiniApp } from '@/core'; import { WebApi } from '@/core/apis/webapi'; import { logDebug } from '@/common/utils/log'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; diff --git a/src/onebot11/action/msg/SendMsg/create-send-elements.ts b/src/onebot11/action/msg/SendMsg/create-send-elements.ts index e138b1d2..9e7b3f80 100644 --- a/src/onebot11/action/msg/SendMsg/create-send-elements.ts +++ b/src/onebot11/action/msg/SendMsg/create-send-elements.ts @@ -5,6 +5,7 @@ import { Group, IdMusicSignPostData, NTQQFileApi, + SendArkElement, SendMessageElement, SendMsgElementConstructor } from '@/core'; @@ -132,7 +133,8 @@ const _handlers: { return SendMsgElementConstructor.video(path, fileName, thumb); }, - + [OB11MessageDataType.miniapp]: async ({ data: any }) => (await SendMsgElementConstructor.miniapp()) as SendArkElement, + [OB11MessageDataType.voice]: async (sendMsg, context) => SendMsgElementConstructor.ptt((await handleOb11FileLikeMessage(sendMsg, context)).path), diff --git a/src/onebot11/types/message.ts b/src/onebot11/types/message.ts index 8b709975..552bf05b 100644 --- a/src/onebot11/types/message.ts +++ b/src/onebot11/types/message.ts @@ -58,7 +58,8 @@ export enum OB11MessageDataType { xml = 'xml', poke = 'poke', dice = 'dice', - RPS = 'rps' + RPS = 'rps', + miniapp = 'miniapp'//json类 } export interface OB11MessageMFace {