2023-03-04 14:30:13 +08:00
|
|
|
|
import EventListener from '../listener/listener.js'
|
|
|
|
|
import common from '../common/common.js'
|
|
|
|
|
import inquirer from 'inquirer'
|
|
|
|
|
import lodash from 'lodash'
|
|
|
|
|
import fetch from 'node-fetch'
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 监听上线事件
|
|
|
|
|
*/
|
2023-03-04 15:24:28 +08:00
|
|
|
|
let inSlider = false
|
2023-03-04 14:30:13 +08:00
|
|
|
|
export default class loginEvent extends EventListener {
|
|
|
|
|
constructor () {
|
|
|
|
|
super({
|
|
|
|
|
prefix: 'system.login.',
|
|
|
|
|
event: ['qrcode', 'slider', 'device', 'error'],
|
|
|
|
|
once: false
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-04 15:24:28 +08:00
|
|
|
|
async execute (event) {
|
|
|
|
|
}
|
2023-03-04 14:30:13 +08:00
|
|
|
|
|
|
|
|
|
/** 扫码登录现在仅能在同一ip下进行 */
|
|
|
|
|
async qrcode (event) {
|
2023-03-06 10:00:25 +08:00
|
|
|
|
logger.mark(`请使用登录当前QQ的手机${logger.green('扫码')}完成登录,如果显示二维码过期,可以按${logger.green('回车键(Enter)')}刷新,重新输入密码请执行命令:${logger.green('node app login')}`)
|
2023-03-04 14:30:13 +08:00
|
|
|
|
// logger.info('等待扫码中...')
|
|
|
|
|
|
|
|
|
|
/** 获取扫码结果 */
|
|
|
|
|
let time = 0
|
|
|
|
|
let interval = setInterval(async () => {
|
|
|
|
|
time++
|
|
|
|
|
let res = await this.client.queryQrcodeResult()
|
|
|
|
|
if (res.retcode === 0) {
|
2023-11-23 01:35:18 +08:00
|
|
|
|
inSlider = true
|
2023-03-04 14:30:13 +08:00
|
|
|
|
console.log('\n')
|
2023-03-06 10:00:25 +08:00
|
|
|
|
logger.info(logger.green('扫码成功,开始登录...'))
|
2023-03-04 14:30:13 +08:00
|
|
|
|
console.log('\n')
|
|
|
|
|
await common.sleep(1000)
|
|
|
|
|
this.client.qrcodeLogin()
|
|
|
|
|
clearInterval(interval)
|
|
|
|
|
}
|
|
|
|
|
if (time >= 150) {
|
|
|
|
|
clearInterval(interval)
|
|
|
|
|
logger.error('等待扫码超时,已停止运行')
|
|
|
|
|
process.exit()
|
|
|
|
|
}
|
|
|
|
|
}, 2000)
|
|
|
|
|
|
|
|
|
|
/** 刷新二维码 */
|
|
|
|
|
inquirer.prompt({ type: 'Input', message: '回车刷新二维码,等待扫码中...\n', name: 'enter' }).then(async () => {
|
2023-03-04 15:24:28 +08:00
|
|
|
|
if (!inSlider) {
|
|
|
|
|
clearInterval(interval)
|
|
|
|
|
console.log(' 重新刷新二维码...\n\n')
|
|
|
|
|
await common.sleep(1000)
|
|
|
|
|
this.client.fetchQrcode()
|
|
|
|
|
}
|
2023-03-04 14:30:13 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 收到滑动验证码提示后,必须使用手机拉动,PC浏览器已经无效
|
|
|
|
|
*/
|
|
|
|
|
async slider (event) {
|
2023-03-04 15:24:28 +08:00
|
|
|
|
inSlider = true
|
2023-03-04 14:30:13 +08:00
|
|
|
|
console.log(`\n\n------------------${logger.green('↓↓滑动验证链接↓↓')}----------------------\n`)
|
|
|
|
|
console.log(logger.green(event.url))
|
|
|
|
|
console.log('\n--------------------------------------------------------')
|
|
|
|
|
console.log(`提示:打开上面链接获取ticket,可使用${logger.green('【滑动验证app】')}获取`)
|
|
|
|
|
console.log(`链接存在${logger.green('有效期')},请尽快操作,多次操作失败可能会被冻结`)
|
|
|
|
|
console.log('滑动验证app下载地址:https://wwp.lanzouy.com/i6w3J08um92h 密码:3kuu\n')
|
|
|
|
|
|
|
|
|
|
const ret = await inquirer.prompt([
|
|
|
|
|
{
|
|
|
|
|
type: 'list',
|
|
|
|
|
name: 'type',
|
|
|
|
|
message: '触发滑动验证,需要获取ticket通过验证,请选择获取方式:',
|
2023-05-28 15:25:23 +08:00
|
|
|
|
choices: ['0.自动获取ticket', '1.手动获取ticket', '2.滑动验证app请求码获取']
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
await common.sleep(200)
|
|
|
|
|
let ticket
|
|
|
|
|
|
2023-05-28 15:25:23 +08:00
|
|
|
|
if (ret.type == '0.自动获取ticket') {
|
|
|
|
|
ticket = await this.getTicket(event.url)
|
|
|
|
|
if (!ticket) console.log('\n请求错误,返回手动获取ticket方式\n')
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-04 14:30:13 +08:00
|
|
|
|
if (ret.type == '2.滑动验证app请求码获取') {
|
|
|
|
|
ticket = await this.requestCode(event.url)
|
|
|
|
|
if (!ticket) console.log('\n请求错误,返回手动获取ticket方式\n')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ticket) {
|
|
|
|
|
let res = await inquirer.prompt({
|
|
|
|
|
type: 'Input',
|
|
|
|
|
message: '请输入ticket:',
|
|
|
|
|
name: 'ticket',
|
|
|
|
|
validate (value) {
|
|
|
|
|
if (!value) return 'ticket不能为空'
|
|
|
|
|
if (value.toLowerCase() == 'ticket') return '请输入获取的ticket'
|
|
|
|
|
if (value == event.url) return '请勿输入滑动验证链接'
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
ticket = lodash.trim(res.ticket, '"')
|
|
|
|
|
}
|
|
|
|
|
global.inputTicket = true
|
|
|
|
|
this.client.submitSlider(ticket.trim())
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-28 15:25:23 +08:00
|
|
|
|
async getTicket (url) {
|
|
|
|
|
let req = `https://hlhs-nb.cn/captcha/slider?key=${Bot.uin}`
|
|
|
|
|
await fetch(req, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: JSON.stringify({ url })
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
console.log('\n----请打开下方链接并在2分钟内进行验证----')
|
|
|
|
|
console.log(`${logger.green(req)}\n----完成后将自动进行登录----`)
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < 40; i++) {
|
|
|
|
|
let res = await fetch(req, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: JSON.stringify({ submit: Bot.uin })
|
|
|
|
|
})
|
|
|
|
|
res = await res.json()
|
|
|
|
|
if (res.data?.ticket) return res.data.ticket
|
|
|
|
|
await common.sleep(3000)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-04 14:30:13 +08:00
|
|
|
|
async requestCode (url) {
|
|
|
|
|
let txhelper = {
|
|
|
|
|
url: url.replace('ssl.captcha.qq.com', 'txhelper.glitch.me')
|
|
|
|
|
}
|
|
|
|
|
txhelper.req = await fetch(txhelper.url).catch((err) => console.log(err.toString()))
|
|
|
|
|
|
|
|
|
|
if (!txhelper.req?.ok) return false
|
|
|
|
|
|
|
|
|
|
txhelper.req = await txhelper.req.text()
|
|
|
|
|
if (!txhelper.req.includes('使用请求码')) return false
|
|
|
|
|
|
|
|
|
|
txhelper.code = /\d+/g.exec(txhelper.req)
|
|
|
|
|
if (!txhelper.code) return false
|
|
|
|
|
|
|
|
|
|
console.log(`\n请打开滑动验证app,输入请求码${logger.green('【' + txhelper.code + '】')},然后完成滑动验证\n`)
|
|
|
|
|
|
|
|
|
|
await common.sleep(200)
|
|
|
|
|
await inquirer.prompt({
|
|
|
|
|
type: 'Input',
|
|
|
|
|
message: '验证完成后按回车确认,等待在操作中...',
|
|
|
|
|
name: 'enter'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
txhelper.res = await fetch(txhelper.url).catch((err) => console.log(err.toString()))
|
|
|
|
|
if (!txhelper.res) return false
|
|
|
|
|
txhelper.res = await txhelper.res.text()
|
|
|
|
|
|
|
|
|
|
if (!txhelper.res) return false
|
|
|
|
|
if (txhelper.res == txhelper.req) {
|
|
|
|
|
console.log('\n未完成滑动验证')
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log(`\n获取ticket成功:\n${txhelper.res}\n`)
|
|
|
|
|
return lodash.trim(txhelper.res)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 设备锁 */
|
|
|
|
|
async device (event) {
|
|
|
|
|
global.inputTicket = false
|
|
|
|
|
console.log(`\n\n------------------${logger.green('↓↓设备锁验证↓↓')}----------------------\n`)
|
|
|
|
|
const ret = await inquirer.prompt([
|
|
|
|
|
{
|
|
|
|
|
type: 'list',
|
|
|
|
|
name: 'type',
|
|
|
|
|
message: '触发设备锁验证,请选择验证方式:',
|
|
|
|
|
choices: ['1.网页扫码验证', '2.发送短信验证码到密保手机']
|
|
|
|
|
}
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
await common.sleep(200)
|
|
|
|
|
|
|
|
|
|
if (ret.type == '1.网页扫码验证') {
|
|
|
|
|
console.log('\n' + logger.green(event.url) + '\n')
|
|
|
|
|
console.log('请打开上面链接,完成验证后按回车')
|
|
|
|
|
await inquirer.prompt({ type: 'Input', message: '等待操作中...', name: 'enter' })
|
|
|
|
|
await this.client.login()
|
|
|
|
|
} else {
|
|
|
|
|
console.log('\n')
|
|
|
|
|
this.client.sendSmsCode()
|
|
|
|
|
await common.sleep(200)
|
|
|
|
|
logger.info(`验证码已发送:${event.phone}\n`)
|
|
|
|
|
let res = await inquirer.prompt({ type: 'Input', message: '请输入短信验证码:', name: 'sms' })
|
|
|
|
|
await this.client.submitSmsCode(res.sms)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 登录错误 */
|
|
|
|
|
error (event) {
|
2023-03-06 10:00:25 +08:00
|
|
|
|
if (Number(event.code) === 1) logger.error('QQ密码错误,运行命令重新登录:node app login')
|
2023-03-04 14:30:13 +08:00
|
|
|
|
if (global.inputTicket && event.code == 237) {
|
|
|
|
|
logger.error(`${logger.red('ticket')}输入错误或者已失效,已停止运行,请重新登录验证`)
|
|
|
|
|
} else if (event?.message.includes('冻结')) {
|
|
|
|
|
logger.error('账号已被冻结,已停止运行')
|
|
|
|
|
} else {
|
|
|
|
|
logger.error('登录错误,已停止运行')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
process.exit()
|
|
|
|
|
}
|
|
|
|
|
}
|