fix: 回退部分修改;增加验证码提示词

This commit is contained in:
ikechan8370 2023-07-23 21:21:32 +08:00
parent ef57259e8a
commit b1570d6126
3 changed files with 123 additions and 94 deletions

View file

@ -234,15 +234,20 @@ export class chatgpt extends plugin {
fnc: 'deleteConversation', fnc: 'deleteConversation',
permission: 'master' permission: 'master'
}, },
{ // {
reg: '^#chatgpt必应验证码', // reg: '^#chatgpt必应验证码',
fnc: 'bingCaptcha' // fnc: 'bingCaptcha'
} // }
] ]
}) })
this.toggleMode = toggleMode this.toggleMode = toggleMode
} }
/**
* deprecated
* @param e
* @returns {Promise<boolean>}
*/
async bingCaptcha (e) { async bingCaptcha (e) {
let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS')) let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS'))
if (!bingTokens) { if (!bingTokens) {
@ -257,8 +262,9 @@ export class chatgpt extends plugin {
} }
index = parseInt(index) - 1 index = parseInt(index) - 1
let bingToken = bingTokens[index] let bingToken = bingTokens[index]
let { id, image } = await createCaptcha(e, bingToken) let { id, regionId, image } = await createCaptcha(e, bingToken)
e.bingCaptchaId = id e.bingCaptchaId = id
e.regionId = regionId
e.token = bingToken e.token = bingToken
await e.reply(['请崽60秒内输入下面图片以通过必应人机验证', segment.image(`base64://${image}`)]) await e.reply(['请崽60秒内输入下面图片以通过必应人机验证', segment.image(`base64://${image}`)])
this.setContext('solveBingCaptcha', false, 60) this.setContext('solveBingCaptcha', false, 60)
@ -1672,27 +1678,31 @@ export class chatgpt extends plugin {
} catch (error) { } catch (error) {
logger.error(error) logger.error(error)
const message = error?.message || error?.data?.message || error || '出错了' const message = error?.message || error?.data?.message || error || '出错了'
if (message && typeof message === 'string' && message.indexOf('CaptchaChallenge') > -1) { // if (message && typeof message === 'string' && message.indexOf('CaptchaChallenge') > -1) {
let { id, image } = await createCaptcha(e, bingToken) // if (bingToken) {
e.bingCaptchaId = id // // let { id, regionId, image } = await createCaptcha(e, bingToken)
e.token = bingToken // // e.bingCaptchaId = id
const { // // e.token = bingToken
conversationSignature, // // e.regionId = regionId
conversationId, // // const {
clientId // // conversationSignature,
} = error?.data // // conversationId,
e.bingConversation = { // // clientId
conversationSignature, // // } = error?.conversation
conversationId, // // e.bingConversation = {
clientId // // conversationSignature,
} // // conversationId,
return { // // clientId
text: '请崽60秒内输入下面图片以通过必应人机验证', // // }
image, // return {
error: true, // text: '请在60秒内输入下面图片以通过必应人机验证',
token: bingToken // image,
} // error: true,
} else if (message && typeof message === 'string' && message.indexOf('限流') > -1) { // token: bingToken
// }
// }
// } else
if (message && typeof message === 'string' && message.indexOf('限流') > -1) {
throttledTokens.push(bingToken) throttledTokens.push(bingToken)
let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS')) let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS'))
const badBingToken = bingTokens.findIndex(element => element.Token === bingToken) const badBingToken = bingTokens.findIndex(element => element.Token === bingToken)
@ -1729,6 +1739,13 @@ export class chatgpt extends plugin {
} while (retry > 0) } while (retry > 0)
if (errorMessage) { if (errorMessage) {
response = response || {} response = response || {}
if (errorMessage.includes('CaptchaChallenge')) {
if (bingToken) {
errorMessage = '出现验证码请使用当前账户前往https://www.bing.com/chat或Edge侧边栏手动解除验证码'
} else {
errorMessage = '出现验证码,且未配置必应账户,请尝试更换代理/反代或绑定必应账户以解除验证码'
}
}
return { return {
text: errorMessage, text: errorMessage,
error: true error: true
@ -2336,29 +2353,40 @@ export class chatgpt extends plugin {
} }
async solveBingCaptcha (e) { async solveBingCaptcha (e) {
let id = e.bingCaptchaId try {
let text = this.e.msg let id = e.bingCaptchaId
let solveResult = await solveCaptcha(id, text, e.token) let regionId = e.regionId
if (solveResult.result) { let text = this.e.msg
const cacheOptions = { let solveResult = await solveCaptcha(id, regionId, text, e.token)
namespace: Config.toneStyle, if (solveResult.result) {
store: new KeyvFile({ filename: 'chatgpt:bing:temp.json' }) logger.mark('验证码正确:' + JSON.stringify(solveResult.detail))
} const cacheOptions = {
const bingAIClient = new SydneyAIClient({ namespace: Config.toneStyle,
userToken: e.token, // "_U" cookie from bing.com store: new KeyvFile({ filename: 'cache.json' })
debug: false, }
cache: cacheOptions, const bingAIClient = new SydneyAIClient({
user: e.sender.user_id, userToken: e.token, // "_U" cookie from bing.com
proxy: Config.proxy debug: Config.debug,
}) cache: cacheOptions,
let response = await bingAIClient.sendMessage('hello', e.bingConversation) user: e.sender.user_id,
if (response.response) { proxy: Config.proxy
await e.reply('验证码已通过') })
try {
let response = await bingAIClient.sendMessage('hello', Object.assign({ invocationId: '1' }, e.bingConversation))
if (response.response) {
await e.reply('验证码已通过')
} else {
await e.reply('验证码正确,但账户未解决验证码')
}
} catch (err) {
logger.error(err)
await e.reply('验证码正确,但账户未解决验证码')
}
} else { } else {
await e.reply('验证码正确,但账户未解决验证码') await e.reply('验证码失败:' + JSON.stringify(solveResult.detail))
} }
} else { } catch (err) {
await e.reply('验证码失败:' + JSON.stringify(solveResult.detail)) this.finish('solveBingCaptcha')
} }
this.finish('solveBingCaptcha') this.finish('solveBingCaptcha')
} }

View file

@ -18,19 +18,6 @@ if (!globalThis.fetch) {
globalThis.Request = Request globalThis.Request = Request
globalThis.Response = Response globalThis.Response = Response
} }
try {
await import('ws')
} catch (error) {
logger.warn('【ChatGPT-Plugin】依赖ws未安装可能影响Sydney模式下Bing对话建议使用pnpm install ws安装')
}
let proxy
if (Config.proxy) {
try {
proxy = (await import('https-proxy-agent')).default
} catch (e) {
console.warn('未安装https-proxy-agent请在插件目录下执行pnpm add https-proxy-agent')
}
}
// async function getWebSocket () { // async function getWebSocket () {
// let WebSocket // let WebSocket
@ -111,7 +98,7 @@ export default class SydneyAIClient {
fetchOptions.headers.cookie = this.opts.cookies || `_U=${this.opts.userToken}` fetchOptions.headers.cookie = this.opts.cookies || `_U=${this.opts.userToken}`
} }
if (this.opts.proxy) { if (this.opts.proxy) {
fetchOptions.agent = proxy(Config.proxy) fetchOptions.agent = HttpsProxyAgent(Config.proxy)
} }
let accessible = !(await isCN()) || this.opts.proxy let accessible = !(await isCN()) || this.opts.proxy
if (accessible && !Config.sydneyForceUseReverse) { if (accessible && !Config.sydneyForceUseReverse) {
@ -243,7 +230,7 @@ export default class SydneyAIClient {
onProgress = () => { } onProgress = () => { }
} }
let master = (await getMasterQQ())[0] let master = (await getMasterQQ())[0]
if (parentMessageId || !conversationSignature || !conversationId || !clientId) { if (!conversationSignature || !conversationId || !clientId) {
const createNewConversationResponse = await this.createNewConversation() const createNewConversationResponse = await this.createNewConversation()
if (this.debug) { if (this.debug) {
console.debug(createNewConversationResponse) console.debug(createNewConversationResponse)
@ -292,7 +279,7 @@ export default class SydneyAIClient {
} }
}) })
pm = pm.reverse() pm = pm.reverse()
let previousMessages let previousMessages = []
let whoAmI = '' let whoAmI = ''
if (Config.enforceMaster && master && qq) { if (Config.enforceMaster && master && qq) {
// 加强主人人知 // 加强主人人知
@ -328,7 +315,7 @@ export default class SydneyAIClient {
}, },
...pm ...pm
] ]
: undefined : []
} else { } else {
previousMessages = invocationId === 0 previousMessages = invocationId === 0
? [ ? [
@ -342,7 +329,7 @@ export default class SydneyAIClient {
}, },
...pm ...pm
] ]
: undefined : []
} }
const userMessage = { const userMessage = {
@ -363,9 +350,9 @@ export default class SydneyAIClient {
'responsible_ai_policy_235', 'responsible_ai_policy_235',
'enablemm', 'enablemm',
toneOption, toneOption,
'dagslnv1', // 'dagslnv1',
'sportsansgnd', // 'sportsansgnd',
'dl_edge_desc', // 'dl_edge_desc',
'noknowimg', 'noknowimg',
// 'dtappid', // 'dtappid',
// 'cricinfo', // 'cricinfo',
@ -380,7 +367,7 @@ export default class SydneyAIClient {
} }
const currentDate = moment().format('YYYY-MM-DDTHH:mm:ssZ') const currentDate = moment().format('YYYY-MM-DDTHH:mm:ssZ')
const imageDate = await this.kblobImage(opts.imageUrl) const imageDate = await this.kblobImage(opts.imageUrl)
console.log(imageDate) // console.log(imageDate)
const obj = { const obj = {
arguments: [ arguments: [
{ {
@ -389,30 +376,30 @@ export default class SydneyAIClient {
allowedMessageTypes: ['ActionRequest', 'Chat', 'Context', allowedMessageTypes: ['ActionRequest', 'Chat', 'Context',
// 'InternalSearchQuery', 'InternalSearchResult', 'Disengaged', 'InternalLoaderMessage', 'Progress', 'RenderCardRequest', 'AdsQuery', // 'InternalSearchQuery', 'InternalSearchResult', 'Disengaged', 'InternalLoaderMessage', 'Progress', 'RenderCardRequest', 'AdsQuery',
'SemanticSerp', 'GenerateContentQuery', 'SearchQuery'], 'SemanticSerp', 'GenerateContentQuery', 'SearchQuery'],
sliceIds: [], sliceIds: [
],
traceId: genRanHex(32), traceId: genRanHex(32),
scenario: 'Underside',
verbosity: 'verbose',
isStartOfSession: invocationId === 0, isStartOfSession: invocationId === 0,
message: { message: {
locale: 'zh-CN', locale: 'zh-CN',
market: 'zh-CN', market: 'zh-CN',
region: 'HK', region: 'WW',
location: 'lat:47.639557;long:-122.128159;re=1000m;', location: 'lat:47.639557;long:-122.128159;re=1000m;',
locationHints: [ locationHints: [
{ {
country: 'Macedonia',
state: 'Centar',
city: 'Skopje',
zipcode: '1004',
timezoneoffset: 1,
countryConfidence: 8,
cityConfidence: 5,
Center: { Center: {
Latitude: 39.971031896331, Latitude: 41.9961,
Longitude: 116.33522679576237 Longitude: 21.4317
},
RegionType: 2,
SourceType: 11
},
{
country: 'Hong Kong',
timezoneoffset: 8,
countryConfidence: 9,
Center: {
Latitude: 22.15,
Longitude: 114.1
}, },
RegionType: 2, RegionType: 2,
SourceType: 1 SourceType: 1
@ -499,10 +486,15 @@ export default class SydneyAIClient {
messageType: 'Context', messageType: 'Context',
messageId: 'discover-web--page-ping-mriduna-----' messageId: 'discover-web--page-ping-mriduna-----'
}) })
} else {
obj.arguments[0].previousMessages.push({
author: 'user',
description: '<EMPTY>',
contextType: 'WebPage',
messageType: 'Context'
})
} }
if (obj.arguments[0].previousMessages.length === 0) {
delete obj.arguments[0].previousMessages
}
let apology = false let apology = false
const messagePromise = new Promise((resolve, reject) => { const messagePromise = new Promise((resolve, reject) => {
let replySoFar = [''] let replySoFar = ['']
@ -671,7 +663,9 @@ export default class SydneyAIClient {
logger.warn('该账户的SERP请求已被限流') logger.warn('该账户的SERP请求已被限流')
logger.warn(JSON.stringify(event.item?.result)) logger.warn(JSON.stringify(event.item?.result))
} else { } else {
reject(`${event.item?.result.value}\n${event.item?.result.error}\n${event.item?.result.exception}`) reject({
message: `${event.item?.result.value}\n${event.item?.result.error}\n${event.item?.result.exception}`
})
} }
} else { } else {
reject('Unexpected message author.') reject('Unexpected message author.')
@ -803,7 +797,7 @@ export default class SydneyAIClient {
body: formData body: formData
} }
if (this.opts.proxy) { if (this.opts.proxy) {
fetchOptions.agent = proxy(Config.proxy) fetchOptions.agent = HttpsProxyAgent(Config.proxy)
} }
let accessible = !(await isCN()) || this.opts.proxy let accessible = !(await isCN()) || this.opts.proxy
let response = await fetch(`${accessible ? 'https://www.bing.com' : this.opts.host}/images/kblob`, fetchOptions) let response = await fetch(`${accessible ? 'https://www.bing.com' : this.opts.host}/images/kblob`, fetchOptions)
@ -843,7 +837,7 @@ async function generateRandomIP () {
if (ip) { if (ip) {
return ip return ip
} }
const baseIP = '104.28.215.' const baseIP = '62.77.140.'
const subnetSize = 254 // 2^8 - 2 const subnetSize = 254 // 2^8 - 2
const randomIPSuffix = Math.floor(Math.random() * subnetSize) + 1 const randomIPSuffix = Math.floor(Math.random() * subnetSize) + 1
ip = baseIP + randomIPSuffix ip = baseIP + randomIPSuffix

View file

@ -1,4 +1,7 @@
import fetch from 'node-fetch' import fetch from 'node-fetch'
// this file is deprecated
import { Config } from './config.js' import { Config } from './config.js'
import HttpsProxyAgent from 'https-proxy-agent' import HttpsProxyAgent from 'https-proxy-agent'
const newFetch = (url, options = {}) => { const newFetch = (url, options = {}) => {
@ -21,23 +24,27 @@ export async function createCaptcha (e, tokenU) {
Cookie: `_U=${tokenU};`, 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', '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', 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',
Referer: 'https://edgeservices.bing.com/edgesvc/chat?udsframed=1&form=SHORUN&clientscopes=chat,noheader,channelstable,&shellsig=ddb7b7dc7a56d0c5350f37b3653696bbeb77496e&setlang=zh-CN&lightschemeovr=1'
} }
}) })
const blob = await imageResponse.blob() const blob = await imageResponse.blob()
let id = imageResponse.headers.get('id') let id = imageResponse.headers.get('id')
let regionId = imageResponse.headers.get('Regionid')
const arrayBuffer = await blob.arrayBuffer() const arrayBuffer = await blob.arrayBuffer()
const buffer = Buffer.from(arrayBuffer) const buffer = Buffer.from(arrayBuffer)
const base64String = buffer.toString('base64') const base64String = buffer.toString('base64')
// await e.reply(segment.image(base64String)) // await e.reply(segment.image(base64String))
return { id, image: base64String } return { id, regionId, image: base64String }
} }
export async function solveCaptcha (id, text, token) { export async function solveCaptcha (id, regionId, text, token) {
let baseUrl = Config.sydneyReverseProxy let baseUrl = Config.sydneyReverseProxy
let url = `${baseUrl}/edgesvc/turing/captcha/verify?type=visual&id=${id}&regionId=0&value=${text}` let url = `${baseUrl}/edgesvc/turing/captcha/verify?type=visual&id=${id}&regionId=${regionId}&value=${text}`
let res = await newFetch(url, { let res = await newFetch(url, {
headers: { headers: {
Cookie: '_U=' + token Cookie: '_U=' + token,
'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',
Referer: 'https://edgeservices.bing.com/edgesvc/chat?udsframed=1&form=SHORUN&clientscopes=chat,noheader,channelstable,&shellsig=ddb7b7dc7a56d0c5350f37b3653696bbeb77496e&setlang=zh-CN&lightschemeovr=1'
} }
}) })
res = await res.json() res = await res.json()