mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
refactor: private/group image rkey
This commit is contained in:
parent
09ab8cbe93
commit
58f544862b
@ -12,13 +12,15 @@ import {
|
|||||||
import path from "path";
|
import path from "path";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import {ReceiveCmdS} from "../hook";
|
import {ReceiveCmdS} from "../hook";
|
||||||
import {log} from "../../common/utils/log";
|
import {log} from "../../common/utils";
|
||||||
import http from "http";
|
import http from "http";
|
||||||
import {sleep} from "../../common/utils";
|
import {sleep} from "../../common/utils";
|
||||||
import {hookApi} from "../external/moehook/hook";
|
import {hookApi} from "../external/moehook/hook";
|
||||||
|
|
||||||
let privateImageRKey = '';
|
let privateImageRKey = '';
|
||||||
let groupImageRKey = '';
|
let groupImageRKey = '';
|
||||||
|
let lastGetRKeyTime = 0;
|
||||||
|
const rkeyExpireTime = 1000 * 60 * 30;
|
||||||
|
|
||||||
export class NTQQFileApi {
|
export class NTQQFileApi {
|
||||||
static async getFileType(filePath: string) {
|
static async getFileType(filePath: string) {
|
||||||
@ -139,6 +141,7 @@ export class NTQQFileApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async getImageUrl(msg: RawMessage) {
|
static async getImageUrl(msg: RawMessage) {
|
||||||
|
const isPrivateImage = msg.chatType !== ChatType.group;
|
||||||
const msgElement = msg.elements.find(e => !!e.picElement);
|
const msgElement = msg.elements.find(e => !!e.picElement);
|
||||||
if (!msgElement) {
|
if (!msgElement) {
|
||||||
return '';
|
return '';
|
||||||
@ -147,118 +150,67 @@ export class NTQQFileApi {
|
|||||||
const md5HexStr = msgElement.picElement.md5HexStr;
|
const md5HexStr = msgElement.picElement.md5HexStr;
|
||||||
const fileMd5 = msgElement.picElement.md5HexStr;
|
const fileMd5 = msgElement.picElement.md5HexStr;
|
||||||
const fileUuid = msgElement.picElement.fileUuid;
|
const fileUuid = msgElement.picElement.fileUuid;
|
||||||
let imageUrl = '';
|
|
||||||
// let currentRKey = "CAQSKAB6JWENi5LMk0kc62l8Pm3Jn1dsLZHyRLAnNmHGoZ3y_gDZPqZt-64"
|
|
||||||
if (url) {
|
if (url) {
|
||||||
if (url.startsWith('/download')) {
|
if (url.startsWith('/download')) {
|
||||||
// console.log('rkey', rkey);
|
// console.log('rkey', rkey);
|
||||||
if (url.includes('&rkey=')) {
|
if (url.includes('&rkey=')) {
|
||||||
imageUrl = IMAGE_HTTP_HOST_NT + url;
|
return IMAGE_HTTP_HOST_NT + url;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
if (!hookApi.isAvailable()) {
|
if (!hookApi.isAvailable()) {
|
||||||
log('hookApi is not available');
|
log('hookApi is not available');
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
let isPrivateImage = false;
|
|
||||||
if (url.indexOf('appid=1406') !== -1) {
|
const saveRKey = (rkey: string)=>{
|
||||||
// 私聊图片
|
if(isPrivateImage){
|
||||||
isPrivateImage = true;
|
privateImageRKey = rkey;
|
||||||
}
|
|
||||||
let rkey = '';
|
|
||||||
if (isPrivateImage) {
|
|
||||||
rkey = privateImageRKey;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rkey = groupImageRKey;
|
|
||||||
}
|
|
||||||
rkey = rkey || hookApi.getRKey();
|
|
||||||
const saveRKey = ()=>{
|
|
||||||
if (isPrivateImage){
|
|
||||||
privateImageRKey = rkey;
|
|
||||||
}else {
|
|
||||||
groupImageRKey = rkey;
|
groupImageRKey = rkey;
|
||||||
}
|
}
|
||||||
|
lastGetRKeyTime = Date.now();
|
||||||
};
|
};
|
||||||
|
|
||||||
const refreshRKey = async () => {
|
const refreshRKey = async () => {
|
||||||
log('正在获取图片rkey...');
|
log('获取图片rkey...');
|
||||||
NTQQFileApi.downloadMedia(msg.msgId, msg.chatType, msg.peerUid, msgElement.elementId, '', msgElement.picElement.sourcePath, true).then().catch(() => {
|
NTQQFileApi.downloadMedia(msg.msgId, msg.chatType, msg.peerUid, msgElement.elementId, '', msgElement.picElement.sourcePath, true).then().catch(() => {
|
||||||
});
|
});
|
||||||
await sleep(300);
|
await sleep(1000);
|
||||||
const _rkey = hookApi.getRKey();
|
const _rkey = hookApi.getRKey();
|
||||||
if (_rkey) {
|
if (_rkey) {
|
||||||
rkey = _rkey;
|
log('图片rkey获取成功', _rkey);
|
||||||
log('图片rkey获取成功', rkey);
|
saveRKey(_rkey);
|
||||||
|
return _rkey;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (!rkey) {
|
|
||||||
// 下载一次图片获取rkey
|
const existsRKey = isPrivateImage ? privateImageRKey : groupImageRKey;
|
||||||
try {
|
if ((Date.now() - lastGetRKeyTime > rkeyExpireTime) || !existsRKey) {
|
||||||
await refreshRKey();
|
// rkey过期
|
||||||
} catch (e) {
|
const newRKey = await refreshRKey();
|
||||||
log('获取图片rkey失败', e);
|
if (newRKey){
|
||||||
|
return IMAGE_HTTP_HOST_NT + url + `${newRKey}`;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
log('图片rkey获取失败', url);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
imageUrl = IMAGE_HTTP_HOST_NT + url + `${rkey}`;
|
// 使用未过期的rkey
|
||||||
// 调用head请求获取图片rkey是否正常
|
if (existsRKey){
|
||||||
const checkUrl = new Promise((resolve, reject) => {
|
return IMAGE_HTTP_HOST_NT + url + `${existsRKey}`;
|
||||||
const uri = new URL(imageUrl);
|
|
||||||
const options = {
|
|
||||||
method: 'GET',
|
|
||||||
host: uri.host,
|
|
||||||
path: uri.pathname + uri.search,
|
|
||||||
headers: {
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
|
|
||||||
'Accept': '*/*',
|
|
||||||
'Range': 'bytes=0-0'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const req = http.request(options, (res) => {
|
|
||||||
console.log(`Check rkey status: ${res.statusCode}`);
|
|
||||||
console.log(`Check rkey headers: ${JSON.stringify(res.headers)}`);
|
|
||||||
if (res.statusCode == 200 || res.statusCode === 206) {
|
|
||||||
// console.log('The image URL is accessible.');
|
|
||||||
resolve('ok');
|
|
||||||
} else {
|
|
||||||
reject('The image URL is not accessible.');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
req.setTimeout(3000, () => {
|
|
||||||
req.destroy();
|
|
||||||
reject('Check rkey request timed out');
|
|
||||||
});
|
|
||||||
|
|
||||||
req.on('error', (e) => {
|
|
||||||
console.error(`Problem with rkey request: ${e.message}`);
|
|
||||||
reject(e.message);
|
|
||||||
});
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
const start = Date.now();
|
|
||||||
await checkUrl;
|
|
||||||
const end = Date.now();
|
|
||||||
log('Check rkey request time:', end - start);
|
|
||||||
saveRKey();
|
|
||||||
} catch (e) {
|
|
||||||
try {
|
|
||||||
await refreshRKey();
|
|
||||||
saveRKey();
|
|
||||||
imageUrl = IMAGE_HTTP_HOST_NT + url + `${rkey}`;
|
|
||||||
} catch (e) {
|
|
||||||
log('获取rkey失败', e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
imageUrl = IMAGE_HTTP_HOST + url;
|
// 老的图片url,不需要rkey
|
||||||
|
return IMAGE_HTTP_HOST + url;
|
||||||
}
|
}
|
||||||
} else if (fileMd5 || md5HexStr) {
|
} else if (fileMd5 || md5HexStr) {
|
||||||
imageUrl = `${IMAGE_HTTP_HOST}/gchatpic_new/0/0-0-${(fileMd5 || md5HexStr)!.toUpperCase()}/0`;
|
// 没有url,需要自己拼接
|
||||||
|
return `${IMAGE_HTTP_HOST}/gchatpic_new/0/0-0-${(fileMd5 || md5HexStr)!.toUpperCase()}/0`;
|
||||||
}
|
}
|
||||||
|
log('图片url获取失败', msg);
|
||||||
return imageUrl;
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user