ntqq
Version:
QQ protocol for NodeJS!
173 lines (172 loc) • 6.92 kB
TypeScript
import * as pb from "./protobuf";
import { Apk, Device, Platform, ShortDevice } from "./device";
import { Config } from "../client";
import { EventEmitter } from "events";
declare const FN_NEXT_SEQ: unique symbol;
declare const FN_SEND: unique symbol;
declare const FN_SEND_LOGIN: unique symbol;
declare const HANDLERS: unique symbol;
declare const NET: unique symbol;
declare const ECDH: unique symbol;
declare const IS_ONLINE: unique symbol;
declare const LOGIN_LOCK: unique symbol;
declare const HEARTBEAT: unique symbol;
declare const SSO_HEARTBEAT: unique symbol;
export declare enum VerboseLevel {
Fatal = 0,
Mark = 1,
Error = 2,
Warn = 3,
Info = 4,
Debug = 5
}
export declare class ApiRejection {
code: number;
message: string;
constructor(code: number, message?: string);
}
export declare enum QrcodeResult {
OtherError = 0,
Timeout = 17,
WaitingForScan = 48,
WaitingForConfirm = 53,
Canceled = 54
}
export interface CoreEventMap {
'internal.qrcode': (qrcode: Buffer) => void;
'internal.slider': (url: string) => void;
'internal.verify': (url: string, phone: string) => void;
'internal.error.token': (code?: number, message?: string) => void;
'internal.error.network': (code: number, message: string) => void;
'internal.error.login': (code: number, message: string) => void;
'internal.error.qrcode': (code: QrcodeResult, message: string) => void;
'internal.online': (token: Buffer, nickname: string, gender: number, age: number) => void;
'internal.token': (token: Buffer) => void;
'internal.kickoff': (reason: string) => void;
'internal.sso': (cmd: string, payload: Buffer, seq: number) => void;
'internal.verbose': (verbose: unknown, level: VerboseLevel) => void;
}
export interface BaseClient {
uin: number;
uid: string;
on<T extends keyof CoreEventMap>(event: T, listener: CoreEventMap[T]): this;
on<S extends string | symbol>(event: S & Exclude<S, keyof CoreEventMap>, listener: (...args: any[]) => any | void): this;
once<T extends keyof CoreEventMap>(event: T, listener: CoreEventMap[T]): this;
once<S extends string | symbol>(event: S & Exclude<S, keyof CoreEventMap>, listener: (...args: any[]) => any | void): this;
off<T extends keyof CoreEventMap>(event: T, listener: CoreEventMap[T]): this;
off<S extends string | symbol>(event: S & Exclude<S, keyof CoreEventMap>, listener: (...args: any[]) => any | void): this;
emit<T extends keyof CoreEventMap>(event: T, ...args: Parameters<CoreEventMap[T]>): boolean;
emit<S extends string | symbol>(event: S & Exclude<S, keyof CoreEventMap>, ...args: any[]): boolean;
}
type Packet = {
cmd: string;
type: number;
callbackId?: number;
body: Buffer;
};
export declare class BaseClient extends EventEmitter {
config: Required<Config>;
private [IS_ONLINE];
private [LOGIN_LOCK];
private [HEARTBEAT]?;
private [SSO_HEARTBEAT]?;
private [ECDH];
private readonly [NET];
private readonly [HANDLERS];
apk: Apk;
readonly device: Device;
readonly sig: Record<string, any>;
readonly pkg: any;
readonly pskey: {
[domain: string]: Buffer;
};
readonly pt4token: {
[domain: string]: Buffer;
};
/** 心跳间隔(秒) */
protected interval: number;
protected ssoInterval: number;
/** 随心跳一起触发的函数,可以随意设定 */
protected heartbeat: () => void;
/** 数据统计 */
protected readonly statistics: {
start_time: number;
lost_times: number;
recv_pkt_cnt: number;
sent_pkt_cnt: number;
lost_pkt_cnt: number;
recv_msg_cnt: number;
sent_msg_cnt: number;
msg_cnt_per_min: number;
remote_ip: string;
sign_api_addr: string;
sign_api_init: boolean;
remote_port: number;
};
protected signLoginCmd: string[];
protected signCmd: string[];
private ssoPacketList;
constructor(p: Platform | undefined, d: ShortDevice, config: Required<Config>);
getApkInfo(platform: Platform, ver?: string): Apk;
getApkInfoList(platform: Platform): Apk[];
/** 设置连接服务器,不设置则自动搜索 */
setRemoteServer(host?: string, port?: number): void;
setSignServer(addr?: string): Promise<void>;
/** 是否为在线状态 (可以收发业务包的状态) */
isOnline(): boolean;
switchQQVer(ver?: string): Promise<boolean>;
getApiQQVer(): Promise<string>;
getT544(cmd: string): Promise<Buffer>;
getSign(cmd: string, seq: number, body: Buffer): Promise<Buffer>;
generateT544Packet(cmd: String, sign: Buffer): Buffer;
generateSignPacket(sign: String, token: String, extra: String): Buffer;
ssoPacketListHandler(list: Packet[] | null): Promise<void>;
requestToken(): Promise<void>;
requestSignToken(): Promise<never[]>;
submitSsoPacket(cmd: string, callbackId: number, body: Buffer): Promise<Packet[]>;
calcPoW(data: any): Buffer;
/** 下线 (keepalive: 是否保持tcp连接) */
logout(keepalive?: boolean): Promise<void>;
/** 关闭连接 */
terminate(): void;
/** 使用接收到的token登录 */
tokenLogin(token: Buffer): Promise<boolean | undefined>;
/**
* 使用密码登录
* @param uin 登录账号
* @param md5pass 密码的md5值
*/
passwordLogin(uin: number, md5pass: Buffer): Promise<void>;
/** 收到滑动验证码后,用于提交滑动验证码 */
submitSlider(ticket: string): Promise<void>;
/** 收到设备锁验证请求后,用于发短信 */
sendSmsCode(): Promise<void>;
/** 提交短信验证码 */
submitSmsCode(code: string): Promise<void>;
/** 获取登录二维码 */
fetchQrcode(): Promise<void>;
/** 扫码后调用此方法登录 */
qrcodeLogin(): Promise<void>;
/** 获取扫码结果(可定时查询,retcode为0则调用qrcodeLogin登录) */
queryQrcodeResult(): Promise<{
retcode: number;
uin: number | undefined;
t106: Buffer | undefined;
t16a: Buffer | undefined;
t318: Buffer | undefined;
tgtgt: Buffer | undefined;
}>;
private [FN_NEXT_SEQ];
private [FN_SEND];
private [FN_SEND_LOGIN];
/** 发送一个业务包不等待返回 */
writeUni(cmd: string, body: Uint8Array, seq?: number): Promise<void>;
/** dont use it if not clear the usage */
sendOidb(cmd: string, body: Uint8Array, timeout?: number): Promise<Buffer>;
sendPacket(type: string, cmd: string, body: any): Promise<Buffer>;
/** 发送一个业务包并等待返回 */
sendUni(cmd: string, body: Uint8Array, timeout?: number): Promise<Buffer>;
sendOidbSvcTrpcTcp(cmd: number, subCmd: number, buffer: Uint8Array, isUid?: boolean, isAfter?: boolean): Promise<pb.Proto>;
fetchHighwayTicket(): Promise<any>;
}
export {};