Miao-Yunzai/lib/events/login.js

214 lines
7.0 KiB
JavaScript
Raw Normal View History

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'
/**
* 监听上线事件
*/
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
})
}
async execute (event) {
}
2023-03-04 14:30:13 +08:00
/** 扫码登录现在仅能在同一ip下进行 */
async qrcode (event) {
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) {
inSlider = true
2023-03-04 14:30:13 +08:00
console.log('\n')
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 () => {
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) {
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) {
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()
}
}