mirror of https://github.com/Nofated095/Q2TG.git
perf: 将 Oicq 继承封装
This commit is contained in:
parent
2682e65008
commit
7b6d615984
|
@ -0,0 +1,109 @@
|
|||
import { Client, createClient, Platform } from 'oicq';
|
||||
import * as Buffer from 'buffer';
|
||||
import { execSync } from 'child_process';
|
||||
import random from '../utils/random';
|
||||
import fs from 'fs';
|
||||
import fsP from 'fs/promises';
|
||||
import path from 'path';
|
||||
import { Config } from 'oicq/lib/client';
|
||||
|
||||
interface CreateOicqParams {
|
||||
uin: number;
|
||||
password: string;
|
||||
platform: Platform;
|
||||
// 当需要验证手机时调用此方法,应该返回收到当手机验证码
|
||||
onVerifyDevice: (phone: string) => Promise<string>;
|
||||
// 当滑块时调用此方法,返回 ticker,也可以返回假值改用扫码登录
|
||||
onVerifySlider: (url: string) => Promise<string>;
|
||||
// 扫码后返回
|
||||
onQrCode: (image: Buffer) => Promise<void>;
|
||||
}
|
||||
|
||||
// OicqExtended??
|
||||
export default class OicqClient extends Client {
|
||||
private constructor(uin: number, conf?: Config) {
|
||||
super(uin, conf);
|
||||
}
|
||||
|
||||
public static create(params: CreateOicqParams) {
|
||||
return new Promise<OicqClient>(async (resolve, reject) => {
|
||||
async function loginDeviceHandler({ phone }: { url: string, phone: string }) {
|
||||
client.sendSmsCode();
|
||||
const code = await params.onVerifyDevice(phone);
|
||||
client.submitSmsCode(code);
|
||||
}
|
||||
|
||||
async function loginSliderHandler({ url }: { url: string }) {
|
||||
const res = await params.onVerifySlider(url);
|
||||
if (res) {
|
||||
client.submitSlider(res);
|
||||
}
|
||||
else {
|
||||
client.login();
|
||||
}
|
||||
}
|
||||
|
||||
async function loginQrCodeHandler({ image }: { image: Buffer }) {
|
||||
await params.onQrCode(image);
|
||||
client.qrcodeLogin();
|
||||
}
|
||||
|
||||
function loginErrorHandler({ message }: { code: number; message: string }) {
|
||||
reject(message);
|
||||
}
|
||||
|
||||
function successLoginHandler() {
|
||||
client.off('system.login.device', loginDeviceHandler)
|
||||
.off('system.login.slider', loginSliderHandler)
|
||||
.off('system.login.qrcode', loginQrCodeHandler)
|
||||
.off('system.login.error', loginErrorHandler)
|
||||
.off('system.online', successLoginHandler);
|
||||
resolve(client);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(`./data/${params.uin}/device-${params.uin}.json`)) {
|
||||
!fs.existsSync('./data') && await fsP.mkdir('./data');
|
||||
!fs.existsSync(`./data/${params.uin}`) && await fsP.mkdir(`./data/${params.uin}`);
|
||||
|
||||
const device = {
|
||||
product: 'Q2TG',
|
||||
device: 'ANGELKAWAII2',
|
||||
board: 'raincandy',
|
||||
brand: random.pick('GOOGLE', 'XIAOMI', 'HUAWEI', 'SAMSUNG', 'SONY'),
|
||||
model: 'raincandy',
|
||||
wifi_ssid: random.pick('OpenWrt', `Redmi-${random.hex(4)}`,
|
||||
`MiWifi-${random.hex(4)}`, `TP-LINK-${random.hex(6)}`),
|
||||
bootloader: random.pick('U-Boot', 'GRUB', 'gummiboot'),
|
||||
android_id: random.hex(16),
|
||||
proc_version: `${execSync('uname -s').toString().replace('\n', '')} version ${execSync('uname -r').toString().replace('\n', '')}`,
|
||||
mac_address: `8c:85:90:${random.hex(2)}:${random.hex(2)}:${random.hex(2)}`.toUpperCase(),
|
||||
ip_address: `192.168.${random.int(1, 200)}.${random.int(10, 250)}`,
|
||||
incremental: random.int(0, 4294967295),
|
||||
imei: random.imei(),
|
||||
};
|
||||
|
||||
await fsP.writeFile(`./data/${params.uin}/device-${params.uin}.json`, JSON.stringify(device, null, 0), 'utf-8');
|
||||
}
|
||||
|
||||
const client = new this(params.uin, {
|
||||
platform: params.platform,
|
||||
data_dir: path.resolve('./data'),
|
||||
})
|
||||
.on('system.login.device', loginDeviceHandler)
|
||||
.on('system.login.slider', loginSliderHandler)
|
||||
.on('system.login.qrcode', loginQrCodeHandler)
|
||||
.on('system.login.error', loginErrorHandler)
|
||||
.on('system.online', successLoginHandler);
|
||||
client.login(params.password);
|
||||
});
|
||||
}
|
||||
|
||||
public getEntity(roomId: number) {
|
||||
if (roomId > 0) {
|
||||
return this.pickFriend(roomId);
|
||||
}
|
||||
else {
|
||||
return this.pickGroup(-roomId);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
import { Client, createClient, Platform } from 'oicq';
|
||||
import * as Buffer from 'buffer';
|
||||
import { execSync } from 'child_process';
|
||||
import random from '../utils/random';
|
||||
import fs from 'fs';
|
||||
import fsP from 'fs/promises';
|
||||
import path from 'path';
|
||||
|
||||
interface CreateOicqParams {
|
||||
uin: number;
|
||||
password: string;
|
||||
platform: Platform;
|
||||
// 当需要验证手机时调用此方法,应该返回收到当手机验证码
|
||||
onVerifyDevice: (phone: string) => Promise<string>;
|
||||
// 当滑块时调用此方法,返回 ticker,也可以返回假值改用扫码登录
|
||||
onVerifySlider: (url: string) => Promise<string>;
|
||||
// 扫码后返回
|
||||
onQrCode: (image: Buffer) => Promise<void>;
|
||||
}
|
||||
|
||||
export default function createOicq(params: CreateOicqParams) {
|
||||
return new Promise<Client>(async (resolve, reject) => {
|
||||
async function loginDeviceHandler({ phone }: { url: string, phone: string }) {
|
||||
client.sendSmsCode();
|
||||
const code = await params.onVerifyDevice(phone);
|
||||
client.submitSmsCode(code);
|
||||
}
|
||||
|
||||
async function loginSliderHandler({ url }: { url: string }) {
|
||||
const res = await params.onVerifySlider(url);
|
||||
if (res) {
|
||||
client.submitSlider(res);
|
||||
}
|
||||
else {
|
||||
client.login();
|
||||
}
|
||||
}
|
||||
|
||||
async function loginQrCodeHandler({ image }: { image: Buffer }) {
|
||||
await params.onQrCode(image);
|
||||
client.qrcodeLogin();
|
||||
}
|
||||
|
||||
function loginErrorHandler({ message }: { code: number; message: string }) {
|
||||
reject(message);
|
||||
}
|
||||
|
||||
function successLoginHandler() {
|
||||
client.off('system.login.device', loginDeviceHandler)
|
||||
.off('system.login.slider', loginSliderHandler)
|
||||
.off('system.login.qrcode', loginQrCodeHandler)
|
||||
.off('system.login.error', loginErrorHandler)
|
||||
.off('system.online', successLoginHandler);
|
||||
resolve(client);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(`./data/${params.uin}/device-${params.uin}.json`)) {
|
||||
!fs.existsSync('./data') && await fsP.mkdir('./data');
|
||||
!fs.existsSync(`./data/${params.uin}`) && await fsP.mkdir(`./data/${params.uin}`);
|
||||
|
||||
const device = {
|
||||
product: 'Q2TG',
|
||||
device: 'ANGELKAWAII2',
|
||||
board: 'raincandy',
|
||||
brand: random.pick('GOOGLE', 'XIAOMI', 'HUAWEI', 'SAMSUNG', 'SONY'),
|
||||
model: 'raincandy',
|
||||
wifi_ssid: random.pick('OpenWrt', `Redmi-${random.hex(4)}`,
|
||||
`MiWifi-${random.hex(4)}`, `TP-LINK-${random.hex(6)}`),
|
||||
bootloader: random.pick('U-Boot', 'GRUB', 'gummiboot'),
|
||||
android_id: random.hex(16),
|
||||
proc_version: `${execSync('uname -s').toString().replace('\n', '')} version ${execSync('uname -r').toString().replace('\n', '')}`,
|
||||
mac_address: `8c:85:90:${random.hex(2)}:${random.hex(2)}:${random.hex(2)}`.toUpperCase(),
|
||||
ip_address: `192.168.${random.int(1, 200)}.${random.int(10, 250)}`,
|
||||
incremental: random.int(0, 4294967295),
|
||||
imei: random.imei(),
|
||||
};
|
||||
|
||||
await fsP.writeFile(`./data/${params.uin}/device-${params.uin}.json`, JSON.stringify(device, null, 0), 'utf-8');
|
||||
}
|
||||
|
||||
const client = createClient(params.uin, {
|
||||
platform: params.platform,
|
||||
data_dir: path.resolve('./data'),
|
||||
})
|
||||
.on('system.login.device', loginDeviceHandler)
|
||||
.on('system.login.slider', loginSliderHandler)
|
||||
.on('system.login.qrcode', loginQrCodeHandler)
|
||||
.on('system.login.error', loginErrorHandler)
|
||||
.on('system.online', successLoginHandler);
|
||||
client.login(params.password);
|
||||
});
|
||||
}
|
|
@ -4,9 +4,10 @@ import { Api } from 'telegram';
|
|||
import { getLogger } from 'log4js';
|
||||
import { Button } from 'telegram/tl/custom/button';
|
||||
import setupHelper from '../helpers/setupHelper';
|
||||
import { Client as OicqClient, Platform } from 'oicq';
|
||||
import { Platform } from 'oicq';
|
||||
import commands from '../constants/commands';
|
||||
import { WorkMode } from '../types/definitions';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
|
||||
export default class SetupController {
|
||||
private readonly setupService: SetupService;
|
||||
|
|
|
@ -2,8 +2,7 @@ import { Telegram } from './client/Telegram';
|
|||
import { config } from './providers/userConfig';
|
||||
import { getLogger, configure } from 'log4js';
|
||||
import SetupController from './controllers/SetupController';
|
||||
import { Client as OicqClient } from 'oicq';
|
||||
import createOicq from './client/oicq';
|
||||
import OicqClient from './client/OicqClient';
|
||||
import ConfigController from './controllers/ConfigController';
|
||||
|
||||
(async () => {
|
||||
|
@ -19,10 +18,12 @@ import ConfigController from './controllers/ConfigController';
|
|||
process.on('unhandledRejection', error => {
|
||||
log.error('UnhandledException: ', error);
|
||||
});
|
||||
|
||||
log.debug('正在登录 TG Bot');
|
||||
const tgBot = await Telegram.create({
|
||||
botAuthToken: process.env.TG_BOT_TOKEN,
|
||||
});
|
||||
|
||||
let tgUser: Telegram, oicq: OicqClient;
|
||||
log.debug('TG Bot 登录完成');
|
||||
if (!config.isSetup) {
|
||||
|
@ -37,7 +38,7 @@ import ConfigController from './controllers/ConfigController';
|
|||
log.debug('TG UserBot 登录完成');
|
||||
}
|
||||
log.debug('正在登录 OICQ');
|
||||
oicq = await createOicq({
|
||||
oicq = await OicqClient.create({
|
||||
uin: config.qqUin,
|
||||
password: config.qqPassword,
|
||||
platform: config.qqPlatform,
|
||||
|
|
|
@ -4,7 +4,7 @@ import { getLogger } from 'log4js';
|
|||
import { BigInteger } from 'big-integer';
|
||||
import { Platform } from 'oicq';
|
||||
import { MarkupLike } from 'telegram/define';
|
||||
import createOicq from '../client/oicq';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
import { Button } from 'telegram/tl/custom/button';
|
||||
import { CustomFile } from 'telegram/client/uploads';
|
||||
import { WorkMode } from '../types/definitions';
|
||||
|
@ -79,7 +79,7 @@ export default class SetupService {
|
|||
}
|
||||
|
||||
public async createOicq(uin: number, password: string, platform: Platform) {
|
||||
return await createOicq({
|
||||
return await OicqClient.create({
|
||||
uin, password, platform,
|
||||
onQrCode: async (file) => {
|
||||
await this.owner.sendMessage({
|
||||
|
|
Loading…
Reference in New Issue