From 235328e4fe645f715c0ee40f219a5e3f52c79689 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Tue, 19 Mar 2024 23:45:56 +0800 Subject: [PATCH 1/6] feat: get pskey & skey --- manifest.json | 4 +-- src/common/utils/file.ts | 25 ++--------------- src/common/utils/index.ts | 3 +- src/common/utils/video.ts | 25 +++++++++++++++++ src/main/main.ts | 2 +- src/main/setConfig.ts | 2 ++ src/ntqqapi/api/group.ts | 21 ++------------ src/ntqqapi/api/user.ts | 1 - src/ntqqapi/api/window.ts | 45 ++++++++++++++++++++++++++++++ src/ntqqapi/hook.ts | 1 + src/ntqqapi/ntcall.ts | 58 +++++++++++++++++++++++++++++++++++++-- 11 files changed, 137 insertions(+), 50 deletions(-) create mode 100644 src/ntqqapi/api/window.ts diff --git a/manifest.json b/manifest.json index c94e72e..e8133ca 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { "manifest_version": 4, "type": "extension", - "name": "LLOneBot v3.16.0", + "name": "LLOneBot v3.17.0", "slug": "LLOneBot", "description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新", - "version": "3.16.0", + "version": "3.17.0", "icon": "./icon.jpg", "authors": [ { diff --git a/src/common/utils/file.ts b/src/common/utils/file.ts index 530cc43..6963191 100644 --- a/src/common/utils/file.ts +++ b/src/common/utils/file.ts @@ -6,11 +6,12 @@ import util from "util"; import {encode, getDuration, isWav} from "silk-wasm"; import path from "node:path"; import {v4 as uuidv4} from "uuid"; -import {DATA_DIR, log, TEMP_DIR} from "./index"; +import {checkFfmpeg, DATA_DIR, log, TEMP_DIR} from "./index"; import {getConfigUtil} from "../config"; import {dbUtil} from "../db"; import * as fileType from "file-type"; import {net} from "electron"; +import config from "../../../electron.vite.config"; export function isGIF(path: string) { @@ -66,28 +67,6 @@ export async function file2base64(path: string) { return result; } -export function checkFfmpeg(newPath: string = null): Promise { - return new Promise((resolve, reject) => { - log("开始检查ffmpeg", newPath); - if (newPath) { - ffmpeg.setFfmpegPath(newPath); - } - try { - ffmpeg.getAvailableFormats((err, formats) => { - if (err) { - log('ffmpeg is not installed or not found in PATH:', err); - resolve(false) - } else { - log('ffmpeg is installed.'); - resolve(true); - } - }) - } catch (e) { - resolve(false); - } - }); -} - export async function encodeSilk(filePath: string) { const fsp = require("fs").promises diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts index 5898e52..04e2937 100644 --- a/src/common/utils/index.ts +++ b/src/common/utils/index.ts @@ -13,4 +13,5 @@ export const PLUGIN_DIR = global.LiteLoader.plugins["LLOneBot"].path.plugin; if (!fs.existsSync(TEMP_DIR)) { fs.mkdirSync(TEMP_DIR); } -export {getVideoInfo} from "./video"; \ No newline at end of file +export {getVideoInfo} from "./video"; +export {checkFfmpeg} from "./video"; \ No newline at end of file diff --git a/src/common/utils/video.ts b/src/common/utils/video.ts index 83a5f20..d2632d0 100644 --- a/src/common/utils/video.ts +++ b/src/common/utils/video.ts @@ -1,6 +1,7 @@ import {log} from "./log"; import ffmpeg from "fluent-ffmpeg"; import fs from "fs"; +import {getConfigUtil} from "../config"; const defaultVideoThumbB64 = "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" @@ -16,6 +17,8 @@ export async function getVideoInfo(filePath: string) { size: number, filePath: string }>((resolve, reject) => { + let ffmpegPath = getConfigUtil().getConfig().ffmpeg + ffmpegPath && ffmpeg.setFfmpegPath(ffmpegPath) ffmpeg(filePath).ffprobe((err, metadata) => { if (err) { reject(err); @@ -60,4 +63,26 @@ export async function encodeMp4(filePath: string) { return await getVideoInfo(newPath) } return videoInfo +} + +export function checkFfmpeg(newPath: string = null): Promise { + return new Promise((resolve, reject) => { + log("开始检查ffmpeg", newPath); + if (newPath) { + ffmpeg.setFfmpegPath(newPath); + } + try { + ffmpeg.getAvailableFormats((err, formats) => { + if (err) { + log('ffmpeg is not installed or not found in PATH:', err); + resolve(false) + } else { + log('ffmpeg is installed.'); + resolve(true); + } + }) + } catch (e) { + resolve(false); + } + }); } \ No newline at end of file diff --git a/src/main/main.ts b/src/main/main.ts index d16b8c1..10e33f8 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -42,9 +42,9 @@ import {NTQQGroupApi} from "../ntqqapi/api/group"; import {registerPokeHandler} from "../ntqqapi/external/ccpoke"; import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent"; import {checkVersion, upgradeLLOneBot} from "../common/utils/upgrade"; -import {checkFfmpeg} from "../common/utils/file"; import {log} from "../common/utils/log"; import {getConfigUtil} from "../common/config"; +import {checkFfmpeg} from "../common/utils/video"; let running = false; diff --git a/src/main/setConfig.ts b/src/main/setConfig.ts index b82af07..b98d2e4 100644 --- a/src/main/setConfig.ts +++ b/src/main/setConfig.ts @@ -4,6 +4,7 @@ import {ob11WebsocketServer} from "../onebot11/server/ws/WebsocketServer"; import {ob11ReverseWebsockets} from "../onebot11/server/ws/ReverseWebsocket"; import {llonebotError} from "../common/data"; import {getConfigUtil} from "../common/config"; +import {checkFfmpeg} from "../common/utils"; export async function setConfig(config: Config) { let oldConfig = getConfigUtil().getConfig(); @@ -51,4 +52,5 @@ export async function setConfig(config: Config) { } } } + checkFfmpeg(config.ffmpeg).then() } \ No newline at end of file diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts index aa30069..f727293 100644 --- a/src/ntqqapi/api/group.ts +++ b/src/ntqqapi/api/group.ts @@ -5,6 +5,7 @@ import {uidMaps} from "../../common/data"; import {BrowserWindow} from "electron"; import {dbUtil} from "../../common/db"; import {log} from "../../common/utils/log"; +import {NTQQWindowApi, NTQQWindows} from "./window"; export class NTQQGroupApi{ static async getGroups(forced = false) { @@ -74,25 +75,7 @@ export class NTQQGroupApi{ } static async getGroupIgnoreNotifies() { await NTQQGroupApi.getGroupNotifies(); - const result = callNTQQApi({ - className: NTQQApiClass.WINDOW_API, - methodName: NTQQApiMethod.OPEN_EXTRA_WINDOW, - cbCmd: ReceiveCmdS.GROUP_NOTIFY, - afterFirstCmd: false, - args: [ - "GroupNotifyFilterWindow" - ] - }) - // 关闭窗口 - setTimeout(() => { - for (const w of BrowserWindow.getAllWindows()) { - // log("close window", w.webContents.getURL()) - if (w.webContents.getURL().indexOf("#/notify-filter/") != -1) { - w.close(); - } - } - }, 2000); - return result; + return await NTQQWindowApi.openWindow(NTQQWindows.GroupNotifyFilterWindow, ReceiveCmdS.GROUP_NOTIFY); } static async handleGroupRequest(seq: string, operateType: GroupRequestOperateTypes, reason?: string) { const notify: GroupNotify = await dbUtil.getGroupNotify(seq) diff --git a/src/ntqqapi/api/user.ts b/src/ntqqapi/api/user.ts index 131d01a..0d00e8b 100644 --- a/src/ntqqapi/api/user.ts +++ b/src/ntqqapi/api/user.ts @@ -53,5 +53,4 @@ export class NTQQUserApi{ return info } - } \ No newline at end of file diff --git a/src/ntqqapi/api/window.ts b/src/ntqqapi/api/window.ts new file mode 100644 index 0000000..4dec26e --- /dev/null +++ b/src/ntqqapi/api/window.ts @@ -0,0 +1,45 @@ +import {callNTQQApi, GeneralCallResult, NTQQApiClass, NTQQApiMethod} from "../ntcall"; +import {ReceiveCmd} from "../hook"; +import {BrowserWindow} from "electron"; + +interface NTQQWindow{ + windowName: string, + windowUrlHash: string, +} + +export class NTQQWindows{ + static GroupHomeWorkWindow: NTQQWindow = { + windowName: "GroupHomeWorkWindow", + windowUrlHash: "#/group-home-work" + } + static GroupNotifyFilterWindow: NTQQWindow = { + windowName: "GroupNotifyFilterWindow", + windowUrlHash: "#/group-notify-filter" + } +} + +export class NTQQWindowApi{ + + // 打开窗口并获取对应的下发事件 + static async openWindow(ntQQWindow: NTQQWindow, args: any[], cbCmd: ReceiveCmd=null, autoCloseSeconds: number=2){ + const result = await callNTQQApi({ + className: NTQQApiClass.WINDOW_API, + methodName: NTQQApiMethod.OPEN_EXTRA_WINDOW, + cbCmd, + afterFirstCmd: false, + args: [ + ntQQWindow.windowName, + ...args + ] + }) + setTimeout(() => { + for (const w of BrowserWindow.getAllWindows()) { + // log("close window", w.webContents.getURL()) + if (w.webContents.getURL().indexOf(ntQQWindow.windowUrlHash) != -1) { + w.close(); + } + } + }, autoCloseSeconds * 1000); + return result; + } +} \ No newline at end of file diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index d9139db..a6ff49a 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -33,6 +33,7 @@ export let ReceiveCmdS = { SELF_STATUS: 'nodeIKernelProfileListener/onSelfStatusChanged', CACHE_SCAN_FINISH: "nodeIKernelStorageCleanListener/onFinishScan", MEDIA_UPLOAD_COMPLETE: "nodeIKernelMsgListener/onRichMediaUploadComplete", + SKEY_UPDATE: "onSkeyUpdate" } export type ReceiveCmd = typeof ReceiveCmdS[keyof typeof ReceiveCmdS] diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index 15b86a2..f326727 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -1,8 +1,9 @@ import {ipcMain} from "electron"; -import {hookApiCallbacks, ReceiveCmd, registerReceiveHook, removeReceiveHook} from "./hook"; +import {hookApiCallbacks, ReceiveCmd, ReceiveCmdS, registerReceiveHook, removeReceiveHook} from "./hook"; import {v4 as uuidv4} from "uuid" import {log} from "../common/utils/log"; +import {NTQQWindowApi, NTQQWindows} from "./api/window"; export enum NTQQApiClass { NT_API = "ns-ntApi", @@ -11,7 +12,9 @@ export enum NTQQApiClass { WINDOW_API = "ns-WindowApi", HOTUPDATE_API = "ns-HotUpdateApi", BUSINESS_API = "ns-BusinessApi", - GLOBAL_DATA = "ns-GlobalDataApi" + GLOBAL_DATA = "ns-GlobalDataApi", + SKEY_API = "ns-SkeyApi", + HOME_WORK = "ns-GroupHomeWork" } export enum NTQQApiMethod { @@ -65,7 +68,9 @@ export enum NTQQApiMethod { OPEN_EXTRA_WINDOW = 'openExternalWindow', - SET_QQ_AVATAR = 'nodeIKernelProfileService/setHeader' + SET_QQ_AVATAR = 'nodeIKernelProfileService/setHeader', + GET_SKEY = "nodeIKernelTipOffService/getPskey", + UPDATE_SKEY = "updatePskey" } enum NTQQApiChannel { @@ -178,4 +183,51 @@ export class NTQQApi { }) } + static async getSkey(groupCode: string, groupName: string) { + await NTQQWindowApi.openWindow(NTQQWindows.GroupHomeWorkWindow, [{ + groupName, + groupCode, + "source": "funcbar" + }], ReceiveCmdS.SKEY_UPDATE, 1); + return await callNTQQApi({ + className: NTQQApiClass.HOME_WORK, + methodName: NTQQApiMethod.UPDATE_SKEY, + args: [ + { + domain: "qun.qq.com" + } + ] + }) + // return await callNTQQApi({ + // methodName: NTQQApiMethod.GET_SKEY, + // args: [ + // { + // "domains": [ + // "qzone.qq.com", + // "qlive.qq.com", + // "qun.qq.com", + // "gamecenter.qq.com", + // "vip.qq.com", + // "qianbao.qq.com", + // "qidian.qq.com" + // ], + // "isForNewPCQQ": false + // }, + // null + // ] + // }) + } + + static async updateSkey() { + return await callNTQQApi({ + className: NTQQApiClass.HOME_WORK, + methodName: NTQQApiMethod.UPDATE_SKEY, + args: [ + { + domain: "qun.qq.com" + } + ] + }) + } + } \ No newline at end of file From 103bf94170d552ddb8724d349f6a4c4700c947a6 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Wed, 20 Mar 2024 11:06:00 +0800 Subject: [PATCH 2/6] test pskey --- src/ntqqapi/api/group.ts | 2 +- src/ntqqapi/api/webapi.ts | 84 +++++++++++++++++++++++++++++++++++++++ src/ntqqapi/api/window.ts | 10 +++-- src/ntqqapi/hook.ts | 24 ++++++++--- src/ntqqapi/ntcall.ts | 44 ++++++++++++-------- 5 files changed, 137 insertions(+), 27 deletions(-) create mode 100644 src/ntqqapi/api/webapi.ts diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts index f727293..fcb45a7 100644 --- a/src/ntqqapi/api/group.ts +++ b/src/ntqqapi/api/group.ts @@ -75,7 +75,7 @@ export class NTQQGroupApi{ } static async getGroupIgnoreNotifies() { await NTQQGroupApi.getGroupNotifies(); - return await NTQQWindowApi.openWindow(NTQQWindows.GroupNotifyFilterWindow, ReceiveCmdS.GROUP_NOTIFY); + return await NTQQWindowApi.openWindow(NTQQWindows.GroupNotifyFilterWindow,[], ReceiveCmdS.GROUP_NOTIFY); } static async handleGroupRequest(seq: string, operateType: GroupRequestOperateTypes, reason?: string) { const notify: GroupNotify = await dbUtil.getGroupNotify(seq) diff --git a/src/ntqqapi/api/webapi.ts b/src/ntqqapi/api/webapi.ts new file mode 100644 index 0000000..c41b573 --- /dev/null +++ b/src/ntqqapi/api/webapi.ts @@ -0,0 +1,84 @@ +import {net, session} from "electron"; +import {NTQQApi} from "../ntcall"; +import {groups} from "../../common/data"; +import {log} from "../../common/utils"; + +export class WebApi{ + private static bkn: string; + private static skey: string; + private static pskey: string; + private static cookie: string + private defaultHeaders: Record = { + "User-Agent": "QQ/8.9.28.635 CFNetwork/1312 Darwin/21.0.0" + } + + constructor() { + + } + + public async addGroupDigest(groupCode: string, msgSeq: string){ + const url = `https://qun.qq.com/cgi-bin/group_digest/cancel_digest?random=665&X-CROSS-ORIGIN=fetch&group_code=${groupCode}&msg_seq=${msgSeq}&msg_random=444021292` + const res = await this.request(url) + return await res.json() + } + + public async getGroupDigest(groupCode: string){ + const url = `https://qun.qq.com/cgi-bin/group_digest/digest_list?random=665&X-CROSS-ORIGIN=fetch&group_code=${groupCode}&page_start=0&page_limit=20` + const res = await this.request(url) + return await res.json() + } + + private genBkn(sKey: string){ + sKey = sKey || ""; + let hash = 5381; + + for (let i = 0; i < sKey.length; i++) { + const code = sKey.charCodeAt(i); + hash = hash + (hash << 5) + code; + } + + return (hash & 0x7FFFFFFF).toString(); + } + private async init(){ + if (!WebApi.bkn) { + const group = groups[0]; + WebApi.skey = (await NTQQApi.getSkey(group.groupName, group.groupCode)).data; + WebApi.bkn = this.genBkn(WebApi.skey); + let cookie = await NTQQApi.getPSkey(); + const pskeyRegex = /p_skey=([^;]+)/; + const match = cookie.match(pskeyRegex); + const pskeyValue = match ? match[1] : null; + WebApi.pskey = pskeyValue; + cookie = cookie.replace(/skey=.*?/, `skey=${WebApi.skey}`); + WebApi.cookie = cookie; + // for(const kv of WebApi.cookie.split(";")){ + // const [key, value] = kv.split("="); + // } + // log("set cookie", key, value) + // await session.defaultSession.cookies.set({ + // url: 'https://qun.qq.com', // 你要请求的域名 + // name: key.trim(), + // value: value.trim(), + // expirationDate: Date.now() / 1000 + 300000, // Cookie 过期时间,例如设置为当前时间之后的300秒 + // }); + // } + } + } + + private async request(url: string, method: "GET" | "POST" = "GET", headers: Record = {}){ + + await this.init(); + url += "&bkn=" + WebApi.bkn; + let _headers: Record = { + ...this.defaultHeaders, ...headers, + "Cookie": WebApi.cookie, + // credentials: 'include' + } + log("request", url, _headers) + const options = { + method: method, + headers: _headers + } + return fetch(url, options) + } +} \ No newline at end of file diff --git a/src/ntqqapi/api/window.ts b/src/ntqqapi/api/window.ts index 4dec26e..6e84bd8 100644 --- a/src/ntqqapi/api/window.ts +++ b/src/ntqqapi/api/window.ts @@ -2,7 +2,7 @@ import {callNTQQApi, GeneralCallResult, NTQQApiClass, NTQQApiMethod} from "../nt import {ReceiveCmd} from "../hook"; import {BrowserWindow} from "electron"; -interface NTQQWindow{ +export interface NTQQWindow{ windowName: string, windowUrlHash: string, } @@ -16,13 +16,17 @@ export class NTQQWindows{ windowName: "GroupNotifyFilterWindow", windowUrlHash: "#/group-notify-filter" } + static GroupEssenceWindow: NTQQWindow = { + windowName: "GroupEssenceWindow", + windowUrlHash: "#/group-essence" + } } export class NTQQWindowApi{ // 打开窗口并获取对应的下发事件 - static async openWindow(ntQQWindow: NTQQWindow, args: any[], cbCmd: ReceiveCmd=null, autoCloseSeconds: number=2){ - const result = await callNTQQApi({ + static async openWindow(ntQQWindow: NTQQWindow, args: any[], cbCmd: ReceiveCmd=null, autoCloseSeconds: number=2){ + const result = await callNTQQApi({ className: NTQQApiClass.WINDOW_API, methodName: NTQQApiMethod.OPEN_EXTRA_WINDOW, cbCmd, diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index a6ff49a..efe9105 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -61,12 +61,18 @@ let receiveHooks: Array<{ export function hookNTQQApiReceive(window: BrowserWindow) { const originalSend = window.webContents.send; const patchSend = (channel: string, ...args: NTQQApiReturnData) => { + let isLogger = false try { - if (!args[0]?.eventName?.startsWith("ns-LoggerApi")) { - HOOK_LOG && log(`received ntqq api message: ${channel}`, JSON.stringify(args)) - } + isLogger = args[0]?.eventName?.startsWith("ns-LoggerApi") } catch (e) { + } + if (!isLogger) { + try { + HOOK_LOG && log(`received ntqq api message: ${channel}`, JSON.stringify(args)) + }catch (e) { + + } } if (args?.[1] instanceof Array) { for (let receiveData of args?.[1]) { @@ -111,12 +117,18 @@ export function hookNTQQApiCall(window: BrowserWindow) { const proxyIpcMsg = new Proxy(ipc_message_proxy, { apply(target, thisArg, args) { + let isLogger = false try { - if (args[3][1][0] !== "info") { - HOOK_LOG && log("call NTQQ api", thisArg, args); - } + isLogger = args[3][0].eventName.startsWith("ns-LoggerApi") } catch (e) { + } + if (!isLogger) { + try{ + HOOK_LOG && log("call NTQQ api", thisArg, args); + }catch (e) { + + } } return target.apply(thisArg, args); }, diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index f326727..c557391 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -3,7 +3,9 @@ import {hookApiCallbacks, ReceiveCmd, ReceiveCmdS, registerReceiveHook, removeRe import {v4 as uuidv4} from "uuid" import {log} from "../common/utils/log"; -import {NTQQWindowApi, NTQQWindows} from "./api/window"; +import {NTQQWindow, NTQQWindowApi, NTQQWindows} from "./api/window"; +import {WebApi} from "./api/webapi"; +import {HOOK_LOG} from "../common/config"; export enum NTQQApiClass { NT_API = "ns-ntApi", @@ -14,7 +16,8 @@ export enum NTQQApiClass { BUSINESS_API = "ns-BusinessApi", GLOBAL_DATA = "ns-GlobalDataApi", SKEY_API = "ns-SkeyApi", - HOME_WORK = "ns-GroupHomeWork" + GROUP_HOME_WORK = "ns-GroupHomeWork", + GROUP_ESSENCE = "ns-GroupEssence", } export enum NTQQApiMethod { @@ -103,7 +106,7 @@ export function callNTQQApi(params: NTQQApiParams) { timeout = timeout ?? 5; afterFirstCmd = afterFirstCmd ?? true; const uuid = uuidv4(); - // log("callNTQQApi", channel, className, methodName, args, uuid) + HOOK_LOG && log("callNTQQApi", channel, className, methodName, args, uuid) return new Promise((resolve: (data: ReturnType) => void, reject) => { // log("callNTQQApiPromise", channel, className, methodName, args, uuid) const _timeout = timeout * 1000 @@ -183,21 +186,21 @@ export class NTQQApi { }) } - static async getSkey(groupCode: string, groupName: string) { - await NTQQWindowApi.openWindow(NTQQWindows.GroupHomeWorkWindow, [{ + static async getSkey(groupName: string, groupCode: string): Promise<{data: string}> { + return await NTQQWindowApi.openWindow<{data: string}>(NTQQWindows.GroupHomeWorkWindow, [{ groupName, groupCode, "source": "funcbar" }], ReceiveCmdS.SKEY_UPDATE, 1); - return await callNTQQApi({ - className: NTQQApiClass.HOME_WORK, - methodName: NTQQApiMethod.UPDATE_SKEY, - args: [ - { - domain: "qun.qq.com" - } - ] - }) + // return await callNTQQApi({ + // className: NTQQApiClass.GROUP_HOME_WORK, + // methodName: NTQQApiMethod.UPDATE_SKEY, + // args: [ + // { + // domain: "qun.qq.com" + // } + // ] + // }) // return await callNTQQApi({ // methodName: NTQQApiMethod.GET_SKEY, // args: [ @@ -218,9 +221,9 @@ export class NTQQApi { // }) } - static async updateSkey() { - return await callNTQQApi({ - className: NTQQApiClass.HOME_WORK, + static async getPSkey() { + return await callNTQQApi({ + className: NTQQApiClass.GROUP_HOME_WORK, methodName: NTQQApiMethod.UPDATE_SKEY, args: [ { @@ -230,4 +233,11 @@ export class NTQQApi { }) } + static async addGroupDigest(groupCode: string, msgSeq: string) { + return await new WebApi().addGroupDigest(groupCode, msgSeq); + } + + static async getGroupDigest(groupCode: string) { + return await new WebApi().getGroupDigest(groupCode); + } } \ No newline at end of file From 7cafbdfae536b7a5aebb08a4fa993dfbd3f94843 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Wed, 20 Mar 2024 11:36:15 +0800 Subject: [PATCH 3/6] fix: set p_skey cookie --- src/ntqqapi/api/webapi.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ntqqapi/api/webapi.ts b/src/ntqqapi/api/webapi.ts index c41b573..97130c0 100644 --- a/src/ntqqapi/api/webapi.ts +++ b/src/ntqqapi/api/webapi.ts @@ -25,6 +25,7 @@ export class WebApi{ public async getGroupDigest(groupCode: string){ const url = `https://qun.qq.com/cgi-bin/group_digest/digest_list?random=665&X-CROSS-ORIGIN=fetch&group_code=${groupCode}&page_start=0&page_limit=20` const res = await this.request(url) + log(res.headers) return await res.json() } @@ -49,7 +50,9 @@ export class WebApi{ const match = cookie.match(pskeyRegex); const pskeyValue = match ? match[1] : null; WebApi.pskey = pskeyValue; - cookie = cookie.replace(/skey=.*?/, `skey=${WebApi.skey}`); + if (cookie.indexOf("skey=;") !== -1) { + cookie = cookie.replace("skey=;", `skey=${WebApi.skey};`); + } WebApi.cookie = cookie; // for(const kv of WebApi.cookie.split(";")){ // const [key, value] = kv.split("="); @@ -72,7 +75,7 @@ export class WebApi{ let _headers: Record = { ...this.defaultHeaders, ...headers, "Cookie": WebApi.cookie, - // credentials: 'include' + credentials: 'include' } log("request", url, _headers) const options = { From d5a3687f2b73af97ee7f40efae5ccbc7f6ac3843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Wed, 20 Mar 2024 12:03:25 +0800 Subject: [PATCH 4/6] fix: checkVersion --- src/common/utils/upgrade.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/common/utils/upgrade.ts b/src/common/utils/upgrade.ts index 76ea39b..af4041d 100644 --- a/src/common/utils/upgrade.ts +++ b/src/common/utils/upgrade.ts @@ -1,7 +1,7 @@ -import {version} from "../../version"; +import { version } from "../../version"; import * as path from "node:path"; import * as fs from "node:fs"; -import {copyFolder, httpDownload, log, PLUGIN_DIR, TEMP_DIR} from "."; +import { copyFolder, httpDownload, log, PLUGIN_DIR, TEMP_DIR } from "."; import compressing from "compressing"; @@ -12,13 +12,13 @@ export async function checkVersion() { const latestVersionText = await getRemoteVersion(); const latestVersion = latestVersionText.split("."); log("llonebot last version", latestVersion); - const currentVersion = version.split("."); - for (let k in [0, 1, 2]) { - if (latestVersion[k] > currentVersion[k]) { - return {result: false, version: latestVersionText}; + const currentVersion: string[] = version.split("."); + for (let k of [0, 1, 2]) { + if (parseInt(latestVersion[k]) > parseInt(currentVersion[k])) { + return { result: false, version: latestVersionText }; } } - return {result: true, version: version}; + return { result: true, version: version }; } export async function upgradeLLOneBot() { @@ -28,17 +28,17 @@ export async function upgradeLLOneBot() { const filePath = path.join(TEMP_DIR, "./update-" + latestVersion + ".zip"); let downloadSuccess = false; // 多镜像下载 - for(const mirrorGithub of downloadMirrorHosts){ - try{ + for (const mirrorGithub of downloadMirrorHosts) { + try { const buffer = await httpDownload(mirrorGithub + downloadUrl); fs.writeFileSync(filePath, buffer) downloadSuccess = true; break; - }catch (e) { + } catch (e) { log("llonebot upgrade error", e); } } - if (!downloadSuccess){ + if (!downloadSuccess) { log("llonebot upgrade error", "download failed"); return false; } From 1307679dae2cfc8386e379513a5348075f2dcfe9 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Wed, 20 Mar 2024 18:25:09 +0800 Subject: [PATCH 5/6] fix: stranger info --- src/common/config.ts | 2 +- src/ntqqapi/api/index.ts | 7 +++ src/ntqqapi/hook.ts | 62 ++++++++++--------- src/ntqqapi/types/user.ts | 49 ++++++++++++++- src/onebot11/action/Debug.ts | 29 --------- .../action/go-cqhttp/GetStrangerInfo.ts | 26 ++------ src/onebot11/action/index.ts | 2 +- src/onebot11/action/llonebot/Debug.ts | 31 ++++++++++ src/onebot11/constructor.ts | 17 ++++- src/onebot11/types.ts | 5 +- 10 files changed, 146 insertions(+), 84 deletions(-) create mode 100644 src/ntqqapi/api/index.ts delete mode 100644 src/onebot11/action/Debug.ts create mode 100644 src/onebot11/action/llonebot/Debug.ts diff --git a/src/common/config.ts b/src/common/config.ts index d8336e2..39269cb 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -6,7 +6,7 @@ import path from "node:path"; import {selfInfo} from "./data"; import {DATA_DIR} from "./utils"; -export const HOOK_LOG = true; +export const HOOK_LOG = false; export const ALLOW_SEND_TEMP_MSG = false; diff --git a/src/ntqqapi/api/index.ts b/src/ntqqapi/api/index.ts new file mode 100644 index 0000000..461f2a7 --- /dev/null +++ b/src/ntqqapi/api/index.ts @@ -0,0 +1,7 @@ +export * from "./file"; +export * from "./friend"; +export * from "./group"; +export * from "./msg"; +export * from "./user"; +export * from "./webapi"; +export * from "./window"; diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index efe9105..e66c292 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -61,6 +61,7 @@ let receiveHooks: Array<{ export function hookNTQQApiReceive(window: BrowserWindow) { const originalSend = window.webContents.send; const patchSend = (channel: string, ...args: NTQQApiReturnData) => { + console.log("hookNTQQApiReceive", channel, args) let isLogger = false try { isLogger = args[0]?.eventName?.startsWith("ns-LoggerApi") @@ -69,43 +70,47 @@ export function hookNTQQApiReceive(window: BrowserWindow) { } if (!isLogger) { try { - HOOK_LOG && log(`received ntqq api message: ${channel}`, JSON.stringify(args)) + HOOK_LOG && log(`received ntqq api message: ${channel}`, args) }catch (e) { - + log("hook log error", e, args) } } - if (args?.[1] instanceof Array) { - for (let receiveData of args?.[1]) { - const ntQQApiMethodName = receiveData.cmdName; - // log(`received ntqq api message: ${channel} ${ntQQApiMethodName}`, JSON.stringify(receiveData)) - for (let hook of receiveHooks) { - if (hook.method.includes(ntQQApiMethodName)) { - new Promise((resolve, reject) => { - try { - let _ = hook.hookFunc(receiveData.payload) - if (hook.hookFunc.constructor.name === "AsyncFunction") { - (_ as Promise).then() + try { + if (args?.[1] instanceof Array) { + for (let receiveData of args?.[1]) { + const ntQQApiMethodName = receiveData.cmdName; + // log(`received ntqq api message: ${channel} ${ntQQApiMethodName}`, JSON.stringify(receiveData)) + for (let hook of receiveHooks) { + if (hook.method.includes(ntQQApiMethodName)) { + new Promise((resolve, reject) => { + try { + let _ = hook.hookFunc(receiveData.payload) + if (hook.hookFunc.constructor.name === "AsyncFunction") { + (_ as Promise).then() + } + } catch (e) { + log("hook error", e, receiveData.payload) } - } catch (e) { - log("hook error", e, receiveData.payload) - } - }).then() + }).then() + } } } } - } - if (args[0]?.callbackId) { - // log("hookApiCallback", hookApiCallbacks, args) - const callbackId = args[0].callbackId; - if (hookApiCallbacks[callbackId]) { - // log("callback found") - new Promise((resolve, reject) => { - hookApiCallbacks[callbackId](args[1]); - }).then() - delete hookApiCallbacks[callbackId]; + if (args[0]?.callbackId) { + // log("hookApiCallback", hookApiCallbacks, args) + const callbackId = args[0].callbackId; + if (hookApiCallbacks[callbackId]) { + // log("callback found") + new Promise((resolve, reject) => { + hookApiCallbacks[callbackId](args[1]); + }).then() + delete hookApiCallbacks[callbackId]; + } } + }catch (e) { + log("hookNTQQApiReceive error", e.stack.toString(), args) } - return originalSend.call(window.webContents, channel, ...args); + originalSend.call(window.webContents, channel, ...args); } window.webContents.send = patchSend; } @@ -117,6 +122,7 @@ export function hookNTQQApiCall(window: BrowserWindow) { const proxyIpcMsg = new Proxy(ipc_message_proxy, { apply(target, thisArg, args) { + console.log(thisArg, args); let isLogger = false try { isLogger = args[3][0].eventName.startsWith("ns-LoggerApi") diff --git a/src/ntqqapi/types/user.ts b/src/ntqqapi/types/user.ts index 891b8a4..d316619 100644 --- a/src/ntqqapi/types/user.ts +++ b/src/ntqqapi/types/user.ts @@ -18,7 +18,54 @@ export interface User { longNick?: string; // 签名 remark?: string; sex?: Sex; - "qqLevel"?: QQLevel + qqLevel?: QQLevel, + qid?: string + "birthday_year"?: number, + "birthday_month"?: number, + "birthday_day"?: number, + "topTime"?: string, + "constellation"?: number, + "shengXiao"?: number, + "kBloodType"?: number, + "homeTown"?: string, //"0-0-0", + "makeFriendCareer"?: number, + "pos"?: string, + "eMail"?: string + "phoneNum"?: string, + "college"?: string, + "country"?: string, + "province"?: string, + "city"?: string, + "postCode"?: string, + "address"?: string, + "isBlock"?: boolean, + "isSpecialCareOpen"?: boolean, + "isSpecialCareZone"?: boolean, + "ringId"?: string, + "regTime"?: number, + interest?: string, + "labels"?: string[], + "isHideQQLevel"?: number, + "privilegeIcon"?: { + "jumpUrl": string, + "openIconList": unknown[], + "closeIconList": unknown[] + }, + "photoWall"?: { + "picList": unknown[] + }, + "vipFlag"?: boolean, + "yearVipFlag"?: boolean, + "svipFlag"?: boolean, + "vipLevel"?: number, + "status"?: number, + "qidianMasterFlag"?: number, + "qidianCrewFlag"?: number, + "qidianCrewFlag2"?: number, + "extStatus"?: number, + "recommendImgFlag"?: number, + "disableEmojiShortCuts"?: number, + "pendantId"?: string, } export interface SelfInfo extends User { diff --git a/src/onebot11/action/Debug.ts b/src/onebot11/action/Debug.ts deleted file mode 100644 index e3064d6..0000000 --- a/src/onebot11/action/Debug.ts +++ /dev/null @@ -1,29 +0,0 @@ -import BaseAction from "./BaseAction"; -import {NTQQApi} from "../../ntqqapi/ntcall"; -import {ActionName} from "./types"; - -import {log} from "../../common/utils/log"; - -interface Payload { - method: string, - args: any[], -} - -export default class Debug extends BaseAction { - actionName = ActionName.Debug - - protected async _handle(payload: Payload): Promise { - log("debug call ntqq api", payload); - const method = NTQQApi[payload.method] - if (!method) { - throw `${method} 不存在` - } - const result = method(...payload.args); - if (method.constructor.name === "AsyncFunction") { - return await result - } - return result - // const info = await NTQQApi.getUserDetailInfo(friends[0].uid); - // return info - } -} \ No newline at end of file diff --git a/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts b/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts index 340742f..80fab52 100644 --- a/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts +++ b/src/onebot11/action/go-cqhttp/GetStrangerInfo.ts @@ -1,36 +1,20 @@ import BaseAction from "../BaseAction"; import {OB11User} from "../../types"; -import {getFriend, getGroupMember, groups} from "../../../common/data"; +import {getUidByUin, uidMaps} from "../../../common/data"; import {OB11Constructor} from "../../constructor"; import {ActionName} from "../types"; -import {isNull, log} from "../../../common/utils"; import {NTQQUserApi} from "../../../ntqqapi/api/user"; -import {Friend, GroupMember} from "../../../ntqqapi/types"; export default class GoCQHTTPGetStrangerInfo extends BaseAction<{ user_id: number }, OB11User> { actionName = ActionName.GoCQHTTP_GetStrangerInfo - private async refreshInfo(user: Friend | GroupMember){ - if (isNull(user.sex)){ - let info = (await NTQQUserApi.getUserDetailInfo(user.uid)) - Object.assign(user, info); - } - } protected async _handle(payload: { user_id: number }): Promise { const user_id = payload.user_id.toString() - const friend = await getFriend(user_id) - if (friend) { - await this.refreshInfo(friend); - return OB11Constructor.friend(friend); + const uid = getUidByUin(user_id) + if (!uid) { + throw new Error("查无此人") } - for (const group of groups) { - const member = await getGroupMember(group.groupCode, user_id) - if (member) { - await this.refreshInfo(member); - return OB11Constructor.groupMember(group.groupCode, member) as OB11User - } - } - throw new Error("查无此人") + return OB11Constructor.stranger(await NTQQUserApi.getUserDetailInfo(uid)) } } \ No newline at end of file diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index dff68b4..6461779 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -20,7 +20,7 @@ import SendLike from "./SendLike"; import SetGroupAddRequest from "./SetGroupAddRequest"; import SetGroupLeave from "./SetGroupLeave"; import GetGuildList from "./GetGuildList"; -import Debug from "./Debug"; +import Debug from "./llonebot/Debug"; import SetFriendAddRequest from "./SetFriendAddRequest"; import SetGroupWholeBan from "./SetGroupWholeBan"; import SetGroupName from "./SetGroupName"; diff --git a/src/onebot11/action/llonebot/Debug.ts b/src/onebot11/action/llonebot/Debug.ts new file mode 100644 index 0000000..7402612 --- /dev/null +++ b/src/onebot11/action/llonebot/Debug.ts @@ -0,0 +1,31 @@ +import BaseAction from "../BaseAction"; +import * as ntqqApi from "../../../ntqqapi/api"; +import {ActionName} from "../types"; +import {log} from "../../../common/utils/log"; + +interface Payload { + method: string, + args: any[], +} + +export default class Debug extends BaseAction { + actionName = ActionName.Debug + + protected async _handle(payload: Payload): Promise { + log("debug call ntqq api", payload); + for (const ntqqApiClass in ntqqApi) { + const method = ntqqApi[ntqqApiClass][payload.method] + if (method) { + const result = method(...payload.args); + if (method.constructor.name === "AsyncFunction") { + return await result + } + return result + } + } + throw `${payload.method}方法 不存在` + + // const info = await NTQQApi.getUserDetailInfo(friends[0].uid); + // return info + } +} \ No newline at end of file diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index fa223c1..7fde2d4 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -311,14 +311,14 @@ export class OB11Constructor { nickname: friend.nick, remark: friend.remark, sex: OB11Constructor.sex(friend.sex), - qq_level: friend.qqLevel && calcQQLevel(friend.qqLevel) || 0 + level: friend.qqLevel && calcQQLevel(friend.qqLevel) || 0 } } static selfInfo(selfInfo: SelfInfo): OB11User { return { user_id: parseInt(selfInfo.uin), - nickname: selfInfo.nick + nickname: selfInfo.nick, } } @@ -365,6 +365,19 @@ export class OB11Constructor { } } + static stranger(user: User): OB11User { + return { + ...user, + user_id: parseInt(user.uin), + nickname: user.nick, + sex: OB11Constructor.sex(user.sex), + age: 0, + qid: user.qid, + login_days: 0, + level: user.qqLevel && calcQQLevel(user.qqLevel) || 0, + } + } + static groupMembers(group: Group): OB11GroupMember[] { log("construct ob11 group members", group) return group.members.map(m => OB11Constructor.groupMember(group.groupCode, m)) diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts index db7bdf5..bb6f09c 100644 --- a/src/onebot11/types.ts +++ b/src/onebot11/types.ts @@ -6,7 +6,10 @@ export interface OB11User { nickname: string; remark?: string; sex?: OB11UserSex; - qq_level?: number; + level?: number; + age?: number; + qid?: string; + login_days?: number; } export enum OB11UserSex { From 965aa48729d96fe0e44bfbcd87a04d94825a6a72 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Wed, 20 Mar 2024 18:52:44 +0800 Subject: [PATCH 6/6] fix: check new version --- src/common/channels.ts | 2 +- src/common/utils/upgrade.ts | 11 ++++++++--- src/main/main.ts | 8 ++++---- src/ntqqapi/hook.ts | 10 +++++++--- src/preload.ts | 4 ++-- src/renderer/index.ts | 2 +- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/common/channels.ts b/src/common/channels.ts index c4d76b6..2119cd1 100644 --- a/src/common/channels.ts +++ b/src/common/channels.ts @@ -3,5 +3,5 @@ export const CHANNEL_SET_CONFIG = 'llonebot_set_config' export const CHANNEL_LOG = 'llonebot_log' export const CHANNEL_ERROR = 'llonebot_error' export const CHANNEL_UPDATE = 'llonebot_update' -export const CHANNEL_CHECKVERSION = 'llonebot_checkversion' +export const CHANNEL_CHECK_VERSION = 'llonebot_check_version' export const CHANNEL_SELECT_FILE = 'llonebot_select_ffmpeg' diff --git a/src/common/utils/upgrade.ts b/src/common/utils/upgrade.ts index af4041d..0ded290 100644 --- a/src/common/utils/upgrade.ts +++ b/src/common/utils/upgrade.ts @@ -8,17 +8,22 @@ import compressing from "compressing"; const downloadMirrorHosts = ["https://mirror.ghproxy.com/"]; const checkVersionMirrorHosts = ["https://521github.com"]; -export async function checkVersion() { +export async function checkNewVersion() { const latestVersionText = await getRemoteVersion(); const latestVersion = latestVersionText.split("."); log("llonebot last version", latestVersion); const currentVersion: string[] = version.split("."); + log("llonebot current version", currentVersion); for (let k of [0, 1, 2]) { if (parseInt(latestVersion[k]) > parseInt(currentVersion[k])) { - return { result: false, version: latestVersionText }; + log("") + return { result: true, version: latestVersionText }; + } + else if (parseInt(latestVersion[k]) < parseInt(currentVersion[k])) { + break; } } - return { result: true, version: version }; + return { result: false, version: version }; } export async function upgradeLLOneBot() { diff --git a/src/main/main.ts b/src/main/main.ts index 10e33f8..a83ca1e 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -7,7 +7,7 @@ import { CHANNEL_ERROR, CHANNEL_GET_CONFIG, CHANNEL_LOG, - CHANNEL_CHECKVERSION, + CHANNEL_CHECK_VERSION, CHANNEL_SELECT_FILE, CHANNEL_SET_CONFIG, CHANNEL_UPDATE, @@ -41,7 +41,7 @@ import {NTQQUserApi} from "../ntqqapi/api/user"; import {NTQQGroupApi} from "../ntqqapi/api/group"; import {registerPokeHandler} from "../ntqqapi/external/ccpoke"; import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent"; -import {checkVersion, upgradeLLOneBot} from "../common/utils/upgrade"; +import {checkNewVersion, upgradeLLOneBot} from "../common/utils/upgrade"; import {log} from "../common/utils/log"; import {getConfigUtil} from "../common/config"; import {checkFfmpeg} from "../common/utils/video"; @@ -53,8 +53,8 @@ let running = false; // 加载插件时触发 function onLoad() { log("llonebot main onLoad"); - ipcMain.handle(CHANNEL_CHECKVERSION, async (event, arg) => { - return checkVersion(); + ipcMain.handle(CHANNEL_CHECK_VERSION, async (event, arg) => { + return checkNewVersion(); }); ipcMain.handle(CHANNEL_UPDATE, async (event, arg) => { return upgradeLLOneBot(); diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index e66c292..de7274f 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -61,7 +61,7 @@ let receiveHooks: Array<{ export function hookNTQQApiReceive(window: BrowserWindow) { const originalSend = window.webContents.send; const patchSend = (channel: string, ...args: NTQQApiReturnData) => { - console.log("hookNTQQApiReceive", channel, args) + // console.log("hookNTQQApiReceive", channel, args) let isLogger = false try { isLogger = args[0]?.eventName?.startsWith("ns-LoggerApi") @@ -122,7 +122,7 @@ export function hookNTQQApiCall(window: BrowserWindow) { const proxyIpcMsg = new Proxy(ipc_message_proxy, { apply(target, thisArg, args) { - console.log(thisArg, args); + // console.log(thisArg, args); let isLogger = false try { isLogger = args[3][0].eventName.startsWith("ns-LoggerApi") @@ -156,7 +156,11 @@ export function hookNTQQApiCall(window: BrowserWindow) { } }); let ret = target.apply(thisArg, args); - HOOK_LOG && log("call NTQQ invoke api return", ret) + try { + HOOK_LOG && log("call NTQQ invoke api return", ret) + }catch (e) { + + } return ret; } }); diff --git a/src/preload.ts b/src/preload.ts index ebdb027..bc3134e 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -5,7 +5,7 @@ import { CHANNEL_ERROR, CHANNEL_GET_CONFIG, CHANNEL_LOG, - CHANNEL_CHECKVERSION, + CHANNEL_CHECK_VERSION, CHANNEL_SELECT_FILE, CHANNEL_SET_CONFIG, CHANNEL_UPDATE, @@ -19,7 +19,7 @@ const llonebot = { ipcRenderer.send(CHANNEL_LOG, data); }, checkVersion:async (): Promise => { - return ipcRenderer.invoke(CHANNEL_CHECKVERSION); + return ipcRenderer.invoke(CHANNEL_CHECK_VERSION); }, updateLLOneBot:async (): Promise => { return ipcRenderer.invoke(CHANNEL_UPDATE); diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 29ad76b..18caeba 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -336,7 +336,7 @@ async function onSettingWindowCreated(view: Element) { }); return; } - if (ResultVersion.result) { + if (!ResultVersion.result) { view.querySelector(".llonebot-update-title").innerHTML = "当前已是最新版本 V" + ResultVersion.version; view.querySelector(".llonebot-update-button").innerHTML = "无需更新"; } else {