mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 13:57:10 +00:00
feat: 必应验证码(beta)
This commit is contained in:
parent
bc072d965d
commit
5d6737d24a
3 changed files with 147 additions and 39 deletions
55
apps/chat.js
55
apps/chat.js
|
|
@ -66,6 +66,7 @@ import { SendDiceTool } from '../utils/tools/SendDiceTool.js'
|
|||
import { SendAvatarTool } from '../utils/tools/SendAvatarTool.js'
|
||||
import { SendMessageToSpecificGroupOrUserTool } from '../utils/tools/SendMessageToSpecificGroupOrUserTool.js'
|
||||
import { SetTitleTool } from '../utils/tools/SetTitleTool.js'
|
||||
import { createCaptcha, solveCaptcha } from '../utils/bingCaptcha.js'
|
||||
|
||||
try {
|
||||
await import('emoji-strip')
|
||||
|
|
@ -232,12 +233,37 @@ export class chatgpt extends plugin {
|
|||
reg: '^#chatgpt删除对话',
|
||||
fnc: 'deleteConversation',
|
||||
permission: 'master'
|
||||
},
|
||||
{
|
||||
reg: '^#chatgpt必应验证码',
|
||||
fnc: 'bingCaptcha'
|
||||
}
|
||||
]
|
||||
})
|
||||
this.toggleMode = toggleMode
|
||||
}
|
||||
|
||||
async bingCaptcha (e) {
|
||||
let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS'))
|
||||
if (!bingTokens) {
|
||||
await e.reply('尚未绑定必应token:必应过码必须绑定token')
|
||||
return
|
||||
}
|
||||
bingTokens = bingTokens.map(token => token.Token)
|
||||
let index = e.msg.replace(/^#chatgpt必应验证码/, '')
|
||||
if (!index) {
|
||||
await e.reply('指令不完整:请输入#chatgpt必应验证码+token序号(从1开始),如#chatgpt必应验证码1')
|
||||
return
|
||||
}
|
||||
index = parseInt(index) - 1
|
||||
let bingToken = bingTokens[index]
|
||||
let { id, image } = await createCaptcha(e, bingToken)
|
||||
e.bingCaptchaId = id
|
||||
e.token = bingToken
|
||||
await e.reply(['请崽60秒内输入下面图片以通过必应人机验证', segment.image(`base64://${image}`)])
|
||||
this.setContext('solveBingCaptcha', e.isGroup, 60)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取chatgpt当前对话列表
|
||||
* @param e
|
||||
|
|
@ -1000,6 +1026,11 @@ export class chatgpt extends plugin {
|
|||
logger.mark({ conversation })
|
||||
}
|
||||
let chatMessage = await this.sendMessage(prompt, conversation, use, e)
|
||||
if (chatMessage.image) {
|
||||
this.setContext('solveBingCaptcha', e.isGroup, 60)
|
||||
await e.reply([chatMessage.text, segment.image(`base64://${chatMessage.image}`)])
|
||||
return
|
||||
}
|
||||
if (use === 'api' && !chatMessage) {
|
||||
// 字数超限直接返回
|
||||
return false
|
||||
|
|
@ -1640,7 +1671,17 @@ export class chatgpt extends plugin {
|
|||
} catch (error) {
|
||||
logger.error(error)
|
||||
const message = error?.message || error?.data?.message || error || '出错了'
|
||||
if (message && typeof message === 'string' && message.indexOf('限流') > -1) {
|
||||
if (message && typeof message === 'string' && message.indexOf('CaptchaChallenge') > -1) {
|
||||
let { id, image } = await createCaptcha(e, bingToken)
|
||||
e.bingCaptchaId = id
|
||||
e.token = bingToken
|
||||
return {
|
||||
text: '请崽60秒内输入下面图片以通过必应人机验证',
|
||||
image,
|
||||
error: true,
|
||||
token: bingToken
|
||||
}
|
||||
} else if (message && typeof message === 'string' && message.indexOf('限流') > -1) {
|
||||
throttledTokens.push(bingToken)
|
||||
let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS'))
|
||||
const badBingToken = bingTokens.findIndex(element => element.Token === bingToken)
|
||||
|
|
@ -2282,6 +2323,18 @@ export class chatgpt extends plugin {
|
|||
}
|
||||
return await this.chatGPTApi.sendMessage(prompt, sendMessageOption)
|
||||
}
|
||||
|
||||
async solveBingCaptcha (e) {
|
||||
let id = e.bingCaptchaId
|
||||
let text = this.e.msg
|
||||
let solveResult = await solveCaptcha(id, text, e.token)
|
||||
if (solveResult.result) {
|
||||
await e.reply('验证码已通过')
|
||||
} else {
|
||||
await e.reply('验证码失败:' + JSON.stringify(solveResult.detail))
|
||||
}
|
||||
this.finish('solveBingCaptcha')
|
||||
}
|
||||
}
|
||||
|
||||
async function getAvailableBingToken (conversation, throttled = []) {
|
||||
|
|
|
|||
55
utils/bingCaptcha.js
Normal file
55
utils/bingCaptcha.js
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
import fetch from 'node-fetch'
|
||||
import { Config } from './config.js'
|
||||
import HttpsProxyAgent from 'https-proxy-agent'
|
||||
const newFetch = (url, options = {}) => {
|
||||
const defaultOptions = Config.proxy
|
||||
? {
|
||||
agent: HttpsProxyAgent(Config.proxy)
|
||||
}
|
||||
: {}
|
||||
const mergedOptions = {
|
||||
...defaultOptions,
|
||||
...options
|
||||
}
|
||||
|
||||
return fetch(url, mergedOptions)
|
||||
}
|
||||
export async function createCaptcha (e, tokenU) {
|
||||
let baseUrl = Config.sydneyReverseProxy
|
||||
let imageResponse = await newFetch(`${baseUrl}/edgesvc/turing/captcha/create`, {
|
||||
headers: {
|
||||
Cookie: `_U=${tokenU};`,
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82',
|
||||
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
|
||||
}
|
||||
})
|
||||
const blob = await imageResponse.blob()
|
||||
let id = imageResponse.headers.get('id')
|
||||
const arrayBuffer = await blob.arrayBuffer()
|
||||
const buffer = Buffer.from(arrayBuffer)
|
||||
const base64String = buffer.toString('base64')
|
||||
// await e.reply(segment.image(base64String))
|
||||
return { id, image: base64String }
|
||||
}
|
||||
|
||||
export async function solveCaptcha (id, text, token) {
|
||||
let baseUrl = Config.sydneyReverseProxy
|
||||
let url = `${baseUrl}/edgesvc/turing/captcha/verify?type=visual&id=${id}®ionId=0&value=${text}`
|
||||
let res = await newFetch(url, {
|
||||
headers: {
|
||||
Cookie: '_U=' + token
|
||||
}
|
||||
})
|
||||
res = await res.json()
|
||||
if (res.reason === 'Solved') {
|
||||
return {
|
||||
result: true,
|
||||
detail: res
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
result: false,
|
||||
detail: res
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -131,7 +131,7 @@ const defaultConfig = {
|
|||
serpSource: 'ikechan8370',
|
||||
extraUrl: 'https://cpe.ikechan8370.com',
|
||||
smartMode: false,
|
||||
version: 'v2.7.2'
|
||||
version: 'v2.7.3'
|
||||
}
|
||||
const _path = process.cwd()
|
||||
let config = {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue