fix: 调整sydney token过期方式;画图调整增加成功概率

This commit is contained in:
ikechan8370 2023-05-24 21:00:36 +08:00
parent cc78143c0e
commit 3c437ddfc5
4 changed files with 85 additions and 59 deletions

View file

@ -1683,21 +1683,22 @@ export class chatgpt extends plugin {
// 不减次数 // 不减次数
} else if (message && typeof message === 'string' && message.indexOf('UnauthorizedRequest') > -1) { } else if (message && typeof message === 'string' && message.indexOf('UnauthorizedRequest') > -1) {
// token过期了 // token过期了
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)
// 可能是微软抽风,给三次机会 // // 可能是微软抽风,给三次机会
if (bingTokens[badBingToken].exception) { // if (bingTokens[badBingToken].exception) {
if (bingTokens[badBingToken].exception <= 3) { // if (bingTokens[badBingToken].exception <= 3) {
bingTokens[badBingToken].exception += 1 // bingTokens[badBingToken].exception += 1
} else { // } else {
bingTokens[badBingToken].exception = 0 // bingTokens[badBingToken].exception = 0
bingTokens[badBingToken].State = '过期' // bingTokens[badBingToken].State = '过期'
} // }
} else { // } else {
bingTokens[badBingToken].exception = 1 // bingTokens[badBingToken].exception = 1
} // }
await redis.set('CHATGPT:BING_TOKENS', JSON.stringify(bingTokens)) // await redis.set('CHATGPT:BING_TOKENS', JSON.stringify(bingTokens))
logger.warn(`token${bingToken}已过期`) logger.warn(`token${bingToken}疑似不存在或已过期,再试试`)
retry = retry - 0.1
} else { } else {
retry-- retry--
errorMessage = message === 'Timed out waiting for response. Try enabling debug mode to see more information.' ? (reply ? `${reply}\n不行了,我的大脑过载了,处理不过来了!` : '必应的小脑瓜不好使了,不知道怎么回答!') : message errorMessage = message === 'Timed out waiting for response. Try enabling debug mode to see more information.' ? (reply ? `${reply}\n不行了,我的大脑过载了,处理不过来了!` : '必应的小脑瓜不好使了,不知道怎么回答!') : message

View file

@ -1,4 +1,4 @@
import fetch from 'node-fetch' import fetch, { FormData } from 'node-fetch'
import { makeForwardMsg } from './common.js' import { makeForwardMsg } from './common.js'
import { Config } from './config.js' import { Config } from './config.js'
@ -22,8 +22,8 @@ export default class BingDrawClient {
async getImages (prompt, e) { async getImages (prompt, e) {
let urlEncodedPrompt = encodeURIComponent(prompt) let urlEncodedPrompt = encodeURIComponent(prompt)
let url = `${this.opts.baseUrl}/images/create?q=${urlEncodedPrompt}&rt=4&FORM=GENCRE` let url = `${this.opts.baseUrl}/images/create?q=${urlEncodedPrompt}&rt=4&FORM=GENCRE`
let d = Math.ceil(Math.random() * 255) // let d = Math.ceil(Math.random() * 255)
let randomIp = '141.11.138.' + d // let randomIp = '141.11.138.' + d
let headers = { let headers = {
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',
'accept-language': 'en-US,en;q=0.9', 'accept-language': 'en-US,en;q=0.9',
@ -31,27 +31,44 @@ export default class BingDrawClient {
'content-type': 'application/x-www-form-urlencoded', 'content-type': 'application/x-www-form-urlencoded',
referrer: 'https://www.bing.com/images/create/', referrer: 'https://www.bing.com/images/create/',
origin: 'https://www.bing.com', origin: 'https://www.bing.com',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50',
cookie: this.opts.cookies || `_U=${this.opts.userToken}`, cookie: this.opts.cookies || `_U=${this.opts.userToken}`,
'x-forwarded-for': randomIp // 'x-forwarded-for': randomIp,
Dnt: '1',
'sec-ch-ua': '"Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version': '"113.0.5672.126"',
'sec-ch-ua-full-version-list': '"Google Chrome";v="113.0.5672.126", "Chromium";v="113.0.5672.126", "Not-A.Brand";v="24.0.0.0"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '',
'sec-ch-ua-platform': '"macOS"',
'sec-ch-ua-platform-version': '"13.1.0"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'Referrer-Policy': 'origin-when-cross-origin',
'x-edge-shopping-flag': '1'
} }
// headers['x-forwarded-for'] = '141.11.138.30' // headers['x-forwarded-for'] = '141.11.138.30'
let body = new FormData()
body.append('q', prompt)
body.append('qs', 'ds')
let fetchOptions = { let fetchOptions = {
method: 'POST', headers
headers,
redirect: 'manual'
} }
if (Config.proxy) { if (Config.proxy) {
fetchOptions.agent = proxy(Config.proxy) fetchOptions.agent = proxy(Config.proxy)
} }
let response = await fetch(url, fetchOptions) let response = await fetch(url, Object.assign(fetchOptions, { body, redirect: 'manual', method: 'POST' }))
let res = await response.text() let res = await response.text()
if (res.toLowerCase().indexOf('this prompt has been blocked') > -1) { if (res.toLowerCase().indexOf('this prompt has been blocked') > -1) {
throw new Error('Your prompt has been blocked by Bing. Try to change any bad words and try again.') throw new Error('Your prompt has been blocked by Bing. Try to change any bad words and try again.')
} }
if (response.status !== 302) { if (response.status !== 302) {
url = `${this.opts.baseUrl}/images/create?q=${urlEncodedPrompt}&rt=3&FORM=GENCRE` url = `${this.opts.baseUrl}/images/create?q=${urlEncodedPrompt}&rt=3&FORM=GENCRE`
let response3 = await fetch(url, fetchOptions) let response3 = await fetch(url, Object.assign(fetchOptions, { body, redirect: 'manual', method: 'POST' }))
if (response3.status !== 302) { if (response3.status !== 302) {
throw new Error('绘图失败请检查Bing token和代理/反代配置') throw new Error('绘图失败请检查Bing token和代理/反代配置')
} }
@ -72,9 +89,7 @@ export default class BingDrawClient {
if (found) { if (found) {
return return
} }
let r = await fetch(pollingUrl, { let r = await fetch(pollingUrl, fetchOptions)
headers
})
let rText = await r.text() let rText = await r.text()
if (rText) { if (rText) {
// logger.info(rText) // logger.info(rText)

View file

@ -4,7 +4,7 @@ import fetch, {
Response Response
} from 'node-fetch' } from 'node-fetch'
import crypto from 'crypto' import crypto from 'crypto'
import WebSocket from 'ws'
import HttpsProxyAgent from 'https-proxy-agent' import HttpsProxyAgent from 'https-proxy-agent'
import { Config, pureSydneyInstruction } from './config.js' import { Config, pureSydneyInstruction } from './config.js'
import { formatDate, getMasterQQ, isCN, getUserData } from './common.js' import { formatDate, getMasterQQ, isCN, getUserData } from './common.js'
@ -29,15 +29,16 @@ if (Config.proxy) {
console.warn('未安装https-proxy-agent请在插件目录下执行pnpm add https-proxy-agent') console.warn('未安装https-proxy-agent请在插件目录下执行pnpm add https-proxy-agent')
} }
} }
async function getWebSocket () {
let WebSocket // async function getWebSocket () {
try { // let WebSocket
WebSocket = (await import('ws')).default // try {
} catch (error) { // WebSocket = (await import('ws')).default
throw new Error('ws依赖未安装请使用pnpm install ws安装') // } catch (error) {
} // throw new Error('ws依赖未安装请使用pnpm install ws安装')
return WebSocket // }
} // return WebSocket
// }
async function getKeyv () { async function getKeyv () {
let Keyv let Keyv
try { try {
@ -80,29 +81,33 @@ export default class SydneyAIClient {
const fetchOptions = { const fetchOptions = {
headers: { headers: {
accept: 'application/json', accept: 'application/json',
'accept-language': 'en-US,en;q=0.9', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'content-type': 'application/json', 'content-type': 'application/json',
'sec-ch-ua': '"Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"', 'sec-ch-ua': '"Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
'sec-ch-ua-arch': '"x86"', // 'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"', // 'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version': '"112.0.1722.7"', // 'sec-ch-ua-full-version': '"112.0.1722.7"',
'sec-ch-ua-full-version-list': '"Chromium";v="112.0.5615.20", "Microsoft Edge";v="112.0.1722.7", "Not:A-Brand";v="99.0.0.0"', // 'sec-ch-ua-full-version-list': '"Chromium";v="112.0.5615.20", "Microsoft Edge";v="112.0.1722.7", "Not:A-Brand";v="99.0.0.0"',
'sec-ch-ua-mobile': '?0', 'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '', // 'sec-ch-ua-model': '',
'sec-ch-ua-platform': '"Windows"', 'sec-ch-ua-platform': '"macOS"',
'sec-ch-ua-platform-version': '"15.0.0"', // 'sec-ch-ua-platform-version': '"15.0.0"',
'sec-fetch-dest': 'empty', 'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors', 'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin', 'sec-fetch-site': 'same-origin',
'x-ms-client-request-id': crypto.randomUUID(), 'x-ms-client-request-id': crypto.randomUUID(),
'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32', 'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.3 OS/macOS',
cookie: this.opts.cookies || `_U=${this.opts.userToken}`, // cookie: this.opts.cookies || `_U=${this.opts.userToken}`,
Referer: 'https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx', Referer: 'https://edgeservices.bing.com/edgesvc/chat?udsframed=1&form=SHORUN&clientscopes=chat,noheader,channelstable,',
'Referrer-Policy': 'origin-when-cross-origin', 'Referrer-Policy': 'origin-when-cross-origin',
// Workaround for request being blocked due to geolocation // Workaround for request being blocked due to geolocation
'x-forwarded-for': '1.1.1.1' 'x-forwarded-for': '1.1.1.1'
} }
} }
if (this.opts.cookies || this.opts.userToken) {
// 疑似无需token了
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 = proxy(Config.proxy)
} }
@ -115,7 +120,7 @@ export default class SydneyAIClient {
logger.mark('使用host' + this.opts.host) logger.mark('使用host' + this.opts.host)
let response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions) let response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions)
let text = await response.text() let text = await response.text()
let retry = 30 let retry = 10
while (retry >= 0 && response.status === 200 && !text) { while (retry >= 0 && response.status === 200 && !text) {
await delay(400) await delay(400)
response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions) response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions)
@ -138,7 +143,7 @@ export default class SydneyAIClient {
async createWebSocketConnection () { async createWebSocketConnection () {
await this.initCache() await this.initCache()
let WebSocket = await getWebSocket() // let WebSocket = await getWebSocket()
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let agent let agent
let sydneyHost = 'wss://sydney.bing.com' let sydneyHost = 'wss://sydney.bing.com'
@ -149,7 +154,7 @@ export default class SydneyAIClient {
sydneyHost = Config.sydneyReverseProxy.replace('https://', 'wss://').replace('http://', 'ws://') sydneyHost = Config.sydneyReverseProxy.replace('https://', 'wss://').replace('http://', 'ws://')
} }
logger.mark(`use sydney websocket host: ${sydneyHost}`) logger.mark(`use sydney websocket host: ${sydneyHost}`)
let ws = new WebSocket(sydneyHost + '/sydney/ChatHub', { agent }) let ws = new WebSocket(sydneyHost + '/sydney/ChatHub', undefined, { agent, origin: 'https://edgeservices.bing.com' })
ws.on('error', (err) => { ws.on('error', (err) => {
console.error(err) console.error(err)
reject(err) reject(err)
@ -354,13 +359,18 @@ export default class SydneyAIClient {
'responsible_ai_policy_235', 'responsible_ai_policy_235',
'enablemm', 'enablemm',
toneOption, toneOption,
'dtappid', 'dagslnv1',
'cricinfo', 'sportsansgnd',
'cricinfov2', 'dl_edge_desc',
'dv3sugg' 'noknowimg',
// 'dtappid',
// 'cricinfo',
// 'cricinfov2',
'dv3sugg',
'gencontentv3'
] ]
if (Config.enableGenerateContents) { if (Config.enableGenerateContents) {
optionsSets.push(...['clgalileo', 'gencontentv3', 'rai267']) optionsSets.push(...['gencontentv3'])
} }
const obj = { const obj = {
arguments: [ arguments: [

View file

@ -123,7 +123,7 @@ const defaultConfig = {
enhanceAzureTTSEmotion: false, enhanceAzureTTSEmotion: false,
autoJapanese: false, autoJapanese: false,
enableGenerateContents: false, enableGenerateContents: false,
version: 'v2.6.1' version: 'v2.6.2'
} }
const _path = process.cwd() const _path = process.cwd()
let config = {} let config = {}