fix: login

This commit is contained in:
Wesley F. Young 2024-08-09 23:19:47 +08:00
parent 8a8aa0016e
commit 6bce4533a3

View File

@ -10,7 +10,7 @@ import {
NapCatCore, NapCatCore,
InstanceContext, InstanceContext,
WrapperNodeApi, WrapperNodeApi,
NodeIQQNTWrapperSession NodeIQQNTWrapperSession,
} from '@/core'; } from '@/core';
import { QQBasicInfoWrapper } from '@/common/utils/QQBasicInfo'; import { QQBasicInfoWrapper } from '@/common/utils/QQBasicInfo';
import { hostname, systemVersion } from '@/common/utils/system'; import { hostname, systemVersion } from '@/common/utils/system';
@ -21,7 +21,6 @@ import path from 'path';
import fs from 'fs'; import fs from 'fs';
import os from 'os'; import os from 'os';
import { NodeIKernelLoginService } from '@/core/services'; import { NodeIKernelLoginService } from '@/core/services';
import { NapCatOneBot11Adapter } from '@/onebot';
import { program } from 'commander'; import { program } from 'commander';
import qrcode from 'qrcode-terminal'; import qrcode from 'qrcode-terminal';
@ -64,9 +63,9 @@ export async function NCoreInitShell() {
global_path_config: { global_path_config: {
desktopGlobalPath: dataPathGlobal, desktopGlobalPath: dataPathGlobal,
}, },
thumb_config: { maxSide: 324, minSide: 48, longLimit: 6, density: 2 } thumb_config: { maxSide: 324, minSide: 48, longLimit: 6, density: 2 },
}, },
new wrapper.NodeIGlobalAdapter(new GlobalAdapter()) new wrapper.NodeIGlobalAdapter(new GlobalAdapter()),
); );
loginService.initConfig({ loginService.initConfig({
machineId: '', machineId: '',
@ -74,7 +73,7 @@ export async function NCoreInitShell() {
platVer: systemVersion, platVer: systemVersion,
commonPath: dataPathGlobal, commonPath: dataPathGlobal,
clientVer: basicInfoWrapper.getFullQQVesion(), clientVer: basicInfoWrapper.getFullQQVesion(),
hostName: hostname hostName: hostname,
}); });
let quickLoginUin = cmdOptions.qq; // undefined | 'true' | string let quickLoginUin = cmdOptions.qq; // undefined | 'true' | string
@ -88,7 +87,7 @@ export async function NCoreInitShell() {
} }
} }
const selfInfo = await new Promise<SelfInfo>((resolve) => { const selfInfo = await new Promise<SelfInfo>((resolve, reject) => {
const loginListener = new LoginListener(); const loginListener = new LoginListener();
// from constructor // from constructor
@ -100,36 +99,46 @@ export async function NCoreInitShell() {
uid: loginResult.uid, uid: loginResult.uid,
uin: loginResult.uin, uin: loginResult.uin,
nick: '', // 获取不到 nick: '', // 获取不到
online: true online: true,
}); });
loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => { loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => {
const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, ''); const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, '');
const buffer = Buffer.from(realBase64, 'base64'); const buffer = Buffer.from(realBase64, 'base64');
logger.logWarn('请扫描下面的二维码然后在手Q上授权登录'); logger.logWarn('请扫描下面的二维码然后在手Q上授权登录');
const qrcodePath = path.join(__dirname, 'qrcode.png'); const qrcodePath = path.join(dataPath, 'qrcode.png');
qrcode.generate(qrcodeUrl, { small: true }, (res) => { qrcode.generate(qrcodeUrl, { small: true }, (res) => {
logger.logWarn([ logger.logWarn([
res, res,
'二维码解码URL: ' + qrcodeUrl, '二维码解码URL: ' + qrcodeUrl,
'如果控制台二维码无法扫码可以复制解码url到二维码生成网站生成二维码再扫码也可以打开下方的二维码路径图片进行扫码。' '如果控制台二维码无法扫码可以复制解码url到二维码生成网站生成二维码再扫码也可以打开下方的二维码路径图片进行扫码。',
].join('\n')); ].join('\n'));
fs.writeFile(qrcodePath, buffer, {}, () => { fs.writeFile(qrcodePath, buffer, {}, () => {
logger.logWarn('二维码已保存到', qrcodePath); logger.logWarn('二维码已保存到', qrcodePath);
}); });
}); });
} };
loginService.addKernelLoginListener(new wrapper.NodeIKernelLoginListener( loginService.addKernelLoginListener(new wrapper.NodeIKernelLoginListener(
proxiedListenerOf(loginListener, logger))); proxiedListenerOf(loginListener, logger)));
if (quickLoginUin && historyLoginList.some(u => u.uin === quickLoginUin)) { if (quickLoginUin && historyLoginList.some(u => u.uin === quickLoginUin)) {
logger.log('正在快速登录 ', quickLoginUin); logger.log('正在快速登录 ', quickLoginUin);
loginService.quickLoginWithUin(quickLoginUin); setTimeout(() => {
loginService.quickLoginWithUin(quickLoginUin)
.then(result => {
if (result.loginErrorInfo.errMsg) {
logger.logError('快速登录错误:', result.loginErrorInfo.errMsg);
reject();
}
})
.catch(e => reject(e));
}, 1000);
} else { } else {
logger.log('没有 -q 指令指定快速登录,或未曾登录过这个 QQ将使用二维码登录方式'); logger.log('没有 -q 指令指定快速登录,或未曾登录过这个 QQ将使用二维码登录方式');
if (historyLoginList.length > 0) { if (historyLoginList.length > 0) {
logger.log(`可用于快速登录的 QQ\n${historyLoginList.map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`).join('\n') logger.log(`可用于快速登录的 QQ\n${
historyLoginList.map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`).join('\n')
}`); }`);
} }
loginService.getQRCodePicture(); loginService.getQRCodePicture();
@ -140,30 +149,39 @@ export async function NCoreInitShell() {
// AFTER LOGGING IN // AFTER LOGGING IN
// from initSession // from initSession
await new Promise<void>(async (resolve, reject) => {
const sessionConfig = await genSessionConfig( const sessionConfig = await genSessionConfig(
basicInfoWrapper.QQVersionAppid!, basicInfoWrapper.QQVersionAppid!,
basicInfoWrapper.getFullQQVesion(), basicInfoWrapper.getFullQQVesion(),
selfInfo.uin, selfInfo.uin,
selfInfo.uid, selfInfo.uid,
dataPath dataPath,
); );
const sessionListener = new SessionListener(); const sessionListener = new SessionListener();
sessionListener.onSessionInitComplete = (r: unknown) => { sessionListener.onSessionInitComplete = (r: unknown) => {
if (r !== 0) { if (r === 0) {
throw r; resolve();
} else {
reject(r);
} }
}; };
session.init( session.init(
sessionConfig, sessionConfig,
new wrapper.NodeIDependsAdapter(new DependsAdapter()), new wrapper.NodeIDependsAdapter(new DependsAdapter()),
new wrapper.NodeIDispatcherAdapter(new DispatcherAdapter()), new wrapper.NodeIDispatcherAdapter(new DispatcherAdapter()),
new wrapper.NodeIKernelSessionListener(sessionListener) new wrapper.NodeIKernelSessionListener(sessionListener),
); );
logger.log('debug init')
try { try {
session.startNT(0); session.startNT(0);
} catch (__) { } catch (_) { /* Empty */
session.startNT(); // may still throw error; we do not catch that try {
session.startNT();
} catch (e) {
reject('init failed ' + e);
} }
}
});
// Initialization end! // Initialization end!
const accountDataPath = path.resolve(dataPath, './NapCat/data'); const accountDataPath = path.resolve(dataPath, './NapCat/data');
@ -177,7 +195,7 @@ export async function NCoreInitShell() {
loginService, loginService,
selfInfo, selfInfo,
basicInfoWrapper, basicInfoWrapper,
pathWrapper pathWrapper,
); );
} }
@ -200,11 +218,12 @@ export class NapCatShell {
session, session,
logger, logger,
loginService, loginService,
basicInfoWrapper basicInfoWrapper,
}; };
this.core = new NapCatCore(this.context, selfInfo); this.core = new NapCatCore(this.context, selfInfo);
new NapCatOneBot11Adapter(this.core, this.context, pathWrapper); // TODO: complete ob11 adapter initialization logic
// new NapCatOneBot11Adapter(this.core, this.context);
} }
} }