From 9ee2791ad80917c8b5a039c1fb66a6dd65ed3089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E8=8E=9E?= Date: Fri, 18 Feb 2022 11:29:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=20oicq=20?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/oicq.ts | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/client/oicq.ts diff --git a/src/client/oicq.ts b/src/client/oicq.ts new file mode 100644 index 0000000..6ed845e --- /dev/null +++ b/src/client/oicq.ts @@ -0,0 +1,61 @@ +import { Client, createClient, Platform } from 'oicq'; +import * as Buffer from 'buffer'; + +interface CreateOicqParams { + uin: number; + password: string; + platform: Platform; + // 当需要验证手机时调用此方法,应该返回收到当手机验证码 + onVerifyDevice: (phone: string) => Promise; + // 当滑块时调用此方法,返回 ticker,也可以返回假值改用扫码登录 + onVerifySlider: (url: string) => Promise; + // 扫码后返回 + onQrCode: (image: Buffer) => Promise; +} + +export default function createOicq(params: CreateOicqParams) { + return new Promise((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); + } + + const client = createClient(params.uin, { + platform: params.platform, + }) + .on('system.login.device', loginDeviceHandler) + .on('system.login.slider', loginSliderHandler) + .on('system.login.qrcode', loginQrCodeHandler) + .on('system.login.error', loginErrorHandler) + .on('system.online', successLoginHandler); + }); +}