fix: 修复QQBot扫码二维码获取

This commit is contained in:
sunlei 2026-06-01 18:09:40 +08:00
parent 6ed1eecb9a
commit beec106f4f

View File

@ -167,7 +167,9 @@ export class QqbotNapcatLoginService {
return this.completeLogin(session, container); return this.completeLogin(session, container);
} }
let qrcode = loginStatus.qrcodeurl || ''; let qrcode = this.isExpiredQrcodeStatus(loginStatus)
? ''
: loginStatus.qrcodeurl || '';
if (!qrcode) { if (!qrcode) {
await this.callRefreshQrcode(container, true); await this.callRefreshQrcode(container, true);
qrcode = await this.getQrcode(container, true); qrcode = await this.getQrcode(container, true);
@ -334,7 +336,7 @@ export class QqbotNapcatLoginService {
'/api/QQLogin/GetQQLoginQrcode', '/api/QQLogin/GetQQLoginQrcode',
); );
if (!data.qrcode) { if (!data.qrcode) {
throwVbenError('NapCat 未返回登录二维码'); return this.getQrcodeFromStatus(container);
} }
return data.qrcode; return data.qrcode;
} catch (err) { } catch (err) {
@ -342,11 +344,22 @@ export class QqbotNapcatLoginService {
const status = await this.getLoginStatus(container); const status = await this.getLoginStatus(container);
return status.qrcodeurl || ''; return status.qrcodeurl || '';
} }
if (this.isQrcodePending(err)) {
return this.getQrcodeFromStatus(container);
}
throw err; throw err;
} }
}); });
} }
private async getQrcodeFromStatus(container: QqbotNapcatRuntime) {
const status = await this.getLoginStatus(container);
if (status.qrcodeurl && !this.isExpiredQrcodeStatus(status)) {
return status.qrcodeurl;
}
throwVbenError('NapCat 未返回登录二维码');
}
private async postNapcat<T>( private async postNapcat<T>(
container: QqbotNapcatRuntime, container: QqbotNapcatRuntime,
path: string, path: string,
@ -480,10 +493,25 @@ export class QqbotNapcatLoginService {
'ECONNRESET', 'ECONNRESET',
'ETIMEDOUT', 'ETIMEDOUT',
'NapCat 请求超时', 'NapCat 请求超时',
'NapCat 未返回登录二维码',
'QRCode Get Error',
'socket hang up', 'socket hang up',
].some((keyword) => message.includes(keyword)); ].some((keyword) => message.includes(keyword));
} }
private isQrcodePending(err: unknown) {
const message = this.getErrorMessage(err);
return message.includes('QRCode Get Error');
}
private isExpiredQrcodeStatus(status: NapcatLoginStatus) {
const message = status.loginError || '';
return (
message.includes('二维码') &&
(message.includes('过期') || message.includes('失效'))
);
}
private async executeNapcatRequest<T>( private async executeNapcatRequest<T>(
retry: boolean, retry: boolean,
action: () => Promise<T>, action: () => Promise<T>,