diff --git a/apps/chat.js b/apps/chat.js index a4861ee..c57065b 100644 --- a/apps/chat.js +++ b/apps/chat.js @@ -1683,21 +1683,22 @@ export class chatgpt extends plugin { // 不减次数 } else if (message && typeof message === 'string' && message.indexOf('UnauthorizedRequest') > -1) { // token过期了 - let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS')) - const badBingToken = bingTokens.findIndex(element => element.Token === bingToken) - // 可能是微软抽风,给三次机会 - if (bingTokens[badBingToken].exception) { - if (bingTokens[badBingToken].exception <= 3) { - bingTokens[badBingToken].exception += 1 - } else { - bingTokens[badBingToken].exception = 0 - bingTokens[badBingToken].State = '过期' - } - } else { - bingTokens[badBingToken].exception = 1 - } - await redis.set('CHATGPT:BING_TOKENS', JSON.stringify(bingTokens)) - logger.warn(`token${bingToken}已过期`) + // let bingTokens = JSON.parse(await redis.get('CHATGPT:BING_TOKENS')) + // const badBingToken = bingTokens.findIndex(element => element.Token === bingToken) + // // 可能是微软抽风,给三次机会 + // if (bingTokens[badBingToken].exception) { + // if (bingTokens[badBingToken].exception <= 3) { + // bingTokens[badBingToken].exception += 1 + // } else { + // bingTokens[badBingToken].exception = 0 + // bingTokens[badBingToken].State = '过期' + // } + // } else { + // bingTokens[badBingToken].exception = 1 + // } + // await redis.set('CHATGPT:BING_TOKENS', JSON.stringify(bingTokens)) + logger.warn(`token${bingToken}疑似不存在或已过期,再试试`) + retry = retry - 0.1 } else { retry-- errorMessage = message === 'Timed out waiting for response. Try enabling debug mode to see more information.' ? (reply ? `${reply}\n不行了,我的大脑过载了,处理不过来了!` : '必应的小脑瓜不好使了,不知道怎么回答!') : message diff --git a/utils/BingDraw.js b/utils/BingDraw.js index 038e8b1..04324b9 100644 --- a/utils/BingDraw.js +++ b/utils/BingDraw.js @@ -1,4 +1,4 @@ -import fetch from 'node-fetch' +import fetch, { FormData } from 'node-fetch' import { makeForwardMsg } from './common.js' import { Config } from './config.js' @@ -22,8 +22,8 @@ export default class BingDrawClient { async getImages (prompt, e) { let urlEncodedPrompt = encodeURIComponent(prompt) let url = `${this.opts.baseUrl}/images/create?q=${urlEncodedPrompt}&rt=4&FORM=GENCRE` - let d = Math.ceil(Math.random() * 255) - let randomIp = '141.11.138.' + d + // let d = Math.ceil(Math.random() * 255) + // let randomIp = '141.11.138.' + d 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-language': 'en-US,en;q=0.9', @@ -31,27 +31,44 @@ export default class BingDrawClient { 'content-type': 'application/x-www-form-urlencoded', referrer: 'https://www.bing.com/images/create/', 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}`, - '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' + let body = new FormData() + body.append('q', prompt) + body.append('qs', 'ds') let fetchOptions = { - method: 'POST', - headers, - redirect: 'manual' + headers } if (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() 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.') } if (response.status !== 302) { 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) { throw new Error('绘图失败,请检查Bing token和代理/反代配置') } @@ -72,9 +89,7 @@ export default class BingDrawClient { if (found) { return } - let r = await fetch(pollingUrl, { - headers - }) + let r = await fetch(pollingUrl, fetchOptions) let rText = await r.text() if (rText) { // logger.info(rText) diff --git a/utils/SydneyAIClient.js b/utils/SydneyAIClient.js index 3000f83..59612d0 100644 --- a/utils/SydneyAIClient.js +++ b/utils/SydneyAIClient.js @@ -4,7 +4,7 @@ import fetch, { Response } from 'node-fetch' import crypto from 'crypto' - +import WebSocket from 'ws' import HttpsProxyAgent from 'https-proxy-agent' import { Config, pureSydneyInstruction } from './config.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') } } -async function getWebSocket () { - let WebSocket - try { - WebSocket = (await import('ws')).default - } catch (error) { - throw new Error('ws依赖未安装,请使用pnpm install ws安装') - } - return WebSocket -} + +// async function getWebSocket () { +// let WebSocket +// try { +// WebSocket = (await import('ws')).default +// } catch (error) { +// throw new Error('ws依赖未安装,请使用pnpm install ws安装') +// } +// return WebSocket +// } async function getKeyv () { let Keyv try { @@ -80,29 +81,33 @@ export default class SydneyAIClient { const fetchOptions = { headers: { 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', - 'sec-ch-ua': '"Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"', - 'sec-ch-ua-arch': '"x86"', - 'sec-ch-ua-bitness': '"64"', - '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': '"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': '"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-mobile': '?0', - 'sec-ch-ua-model': '', - 'sec-ch-ua-platform': '"Windows"', - 'sec-ch-ua-platform-version': '"15.0.0"', + // 'sec-ch-ua-model': '', + 'sec-ch-ua-platform': '"macOS"', + // 'sec-ch-ua-platform-version': '"15.0.0"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', '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', - cookie: this.opts.cookies || `_U=${this.opts.userToken}`, - Referer: 'https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx', + '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}`, + Referer: 'https://edgeservices.bing.com/edgesvc/chat?udsframed=1&form=SHORUN&clientscopes=chat,noheader,channelstable,', 'Referrer-Policy': 'origin-when-cross-origin', // Workaround for request being blocked due to geolocation '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) { fetchOptions.agent = proxy(Config.proxy) } @@ -115,7 +120,7 @@ export default class SydneyAIClient { logger.mark('使用host:' + this.opts.host) let response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions) let text = await response.text() - let retry = 30 + let retry = 10 while (retry >= 0 && response.status === 200 && !text) { await delay(400) response = await fetch(`${this.opts.host}/turing/conversation/create`, fetchOptions) @@ -138,7 +143,7 @@ export default class SydneyAIClient { async createWebSocketConnection () { await this.initCache() - let WebSocket = await getWebSocket() + // let WebSocket = await getWebSocket() return new Promise((resolve, reject) => { let agent let sydneyHost = 'wss://sydney.bing.com' @@ -149,7 +154,7 @@ export default class SydneyAIClient { sydneyHost = Config.sydneyReverseProxy.replace('https://', 'wss://').replace('http://', 'ws://') } 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) => { console.error(err) reject(err) @@ -354,13 +359,18 @@ export default class SydneyAIClient { 'responsible_ai_policy_235', 'enablemm', toneOption, - 'dtappid', - 'cricinfo', - 'cricinfov2', - 'dv3sugg' + 'dagslnv1', + 'sportsansgnd', + 'dl_edge_desc', + 'noknowimg', + // 'dtappid', + // 'cricinfo', + // 'cricinfov2', + 'dv3sugg', + 'gencontentv3' ] if (Config.enableGenerateContents) { - optionsSets.push(...['clgalileo', 'gencontentv3', 'rai267']) + optionsSets.push(...['gencontentv3']) } const obj = { arguments: [ diff --git a/utils/config.js b/utils/config.js index a15ad67..ce501c2 100644 --- a/utils/config.js +++ b/utils/config.js @@ -123,7 +123,7 @@ const defaultConfig = { enhanceAzureTTSEmotion: false, autoJapanese: false, enableGenerateContents: false, - version: 'v2.6.1' + version: 'v2.6.2' } const _path = process.cwd() let config = {}