mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-28 07:40:27 +00:00
Introduce multi-step QQ password login support (captcha and new-device verification) and related OIDB QR handling. - Change login signature fields in NodeIKernelLoginService to binary (Uint8Array) and add unusualDeviceCheckSig. - Update shell base to handle additional result codes (captcha required, new-device, abnormal-device), set login status on success, and register three callbacks: captcha, new-device, and password flows. Use TextEncoder for encoding ticket/randstr/sid and newDevicePullQrCodeSig. - Extend backend WebUiDataRuntime (types and runtime) with set/request methods for captcha and new-device login calls and adjust LoginRuntime types to return richer metadata (needCaptcha, proofWaterUrl, needNewDevice, jumpUrl, newDevicePullQrCodeSig). - Add backend API handlers: CaptchaLogin, NewDeviceLogin, GetNewDeviceQRCode and PollNewDeviceQR; add oidbRequest helper using https to query oidb.tim.qq.com for QR generation and polling. - Wire new handlers into QQLogin router and return structured success responses when further steps are required. - Add frontend components and pages for captcha and new-device verification (new files: 1.html, new_device_verify.tsx, tencent_captcha.tsx) and update existing frontend controllers/pages to integrate the new flows. - Improve error logging and user-facing messages for the new flows. This change enables handling of password-login scenarios requiring captcha or device attestation and provides endpoints to obtain and poll OIDB QR codes for new-device verification.
122 lines
2.7 KiB
TypeScript
122 lines
2.7 KiB
TypeScript
import { NodeIKernelLoginListener } from '@/napcat-core/listeners/NodeIKernelLoginListener';
|
||
import { GeneralCallResult } from './common';
|
||
|
||
export interface LoginInitConfig {
|
||
machineId: '';
|
||
appid: string;
|
||
platVer: string;
|
||
commonPath: string;
|
||
clientVer: string;
|
||
hostName: string;
|
||
externalVersion: boolean;
|
||
}
|
||
|
||
export interface PasswordLoginRetType {
|
||
result: string,
|
||
loginErrorInfo: {
|
||
step: number;
|
||
errMsg: string;
|
||
proofWaterUrl: string;
|
||
newDevicePullQrCodeSig: string;
|
||
jumpUrl: string,
|
||
jumpWord: string;
|
||
tipsTitle: string;
|
||
tipsContent: string;
|
||
};
|
||
}
|
||
|
||
export interface PasswordLoginArgType {
|
||
uin: string;
|
||
passwordMd5: string;// passwMD5
|
||
step: number;// 猜测是需要二次认证 参数 一次为0
|
||
newDeviceLoginSig: Uint8Array;
|
||
proofWaterSig: Uint8Array;
|
||
proofWaterRand: Uint8Array;
|
||
proofWaterSid: Uint8Array;
|
||
unusualDeviceCheckSig: Uint8Array;
|
||
}
|
||
|
||
export interface LoginListItem {
|
||
uin: string;
|
||
uid: string;
|
||
nickName: string;
|
||
faceUrl: string;
|
||
facePath: string;
|
||
loginType: 1; // 1是二维码登录?
|
||
isQuickLogin: boolean; // 是否可以快速登录
|
||
isAutoLogin: boolean; // 是否可以自动登录
|
||
}
|
||
|
||
export interface QuickLoginResult {
|
||
result: string;
|
||
loginErrorInfo: {
|
||
step: number,
|
||
errMsg: string,
|
||
proofWaterUrl: string,
|
||
newDevicePullQrCodeSig: string,
|
||
jumpUrl: string,
|
||
jumpWord: string,
|
||
tipsTitle: string,
|
||
tipsContent: string;
|
||
};
|
||
}
|
||
|
||
export interface NodeIKernelLoginService {
|
||
getMsfStatus: () => number;
|
||
|
||
setLoginMiscData (key: string, value: string): unknown;
|
||
|
||
getLoginMiscData (key: string): Promise<GeneralCallResult & { value: string; }>;
|
||
|
||
getMachineGuid (): string;
|
||
|
||
get (): NodeIKernelLoginService;
|
||
|
||
connect (): boolean;
|
||
|
||
addKernelLoginListener (listener: NodeIKernelLoginListener): number;
|
||
|
||
removeKernelLoginListener (listenerId: number): void;
|
||
|
||
initConfig (config: LoginInitConfig): void;
|
||
|
||
getLoginList (): Promise<{
|
||
result: number,
|
||
LocalLoginInfoList: LoginListItem[];
|
||
}>;
|
||
|
||
quickLoginWithUin (uin: string): Promise<QuickLoginResult>;
|
||
|
||
passwordLogin (param: PasswordLoginArgType): Promise<QuickLoginResult>;
|
||
|
||
getQRCodePicture (): boolean;
|
||
|
||
destroy (): unknown;
|
||
|
||
cancel (): unknown;
|
||
|
||
abortPolling (): unknown;
|
||
|
||
startPolling (): unknown;
|
||
|
||
deleteLoginInfo (arg: unknown): unknown;
|
||
|
||
isHasLoginInfo (uin: string): boolean;
|
||
|
||
loadNoLoginUnitedConfig (arg: unknown): unknown;
|
||
|
||
loginUnusualDevice (arg: unknown): unknown;
|
||
|
||
registerUnitedConfigPushGroupList (groupList: unknown): unknown;
|
||
|
||
resetLoginInfo (arg: unknown): unknown;
|
||
|
||
setAutoLogin (arg: unknown): unknown;
|
||
|
||
setRemerberPwd (remember: boolean): unknown;
|
||
|
||
online (): unknown;
|
||
|
||
offline (): unknown;
|
||
}
|