mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 13:27:08 +00:00
* 修复后台API反代地址未能正确显示的问题 * 更新渲染页面配置 * 添加个人聊天模式配置 * 将用户数据获取改到common中 * 修复错误的渲染页面参数 * 修复bug * 添加Live2D * 修复渲染页面错误 * 修复渲染传入值 * 更新渲染 * 修复图表渲染bug * 调整live2d模型大小 * 修复live2d无法关闭问题 * 修复错误的传值 * 修复ai命名 * 更新渲染 * 添加用户独立设定 * 更新渲染配置适配个人设置 * 修复合并导致的渲染文件异常删除 * 修复用户数据缺失问题 * 修复旧版本数据缺失问题 * 修复bing参数不存在问题,兼容miao的截图 * 修复受限token重试时不被排除的问题 * 修复个人模式下结束对话的模式错误 * 更新渲染页面,将预览版转为正式版 * 修复传统渲染无法调用截图功能的问题 * 文字模式也进行一次缓存 * 更新README * Update README.md * 更新渲染 * 更新渲染页面 * 添加版本信息 * 遗漏参数 * 丢失引用 * 补充路由 * 添加云转码功能 * 判断node-silk是否正常合成 * 云转码提示 * 修复图片渲染出错 * 云转码支持发送Buffer * 添加云转码模式支持 * 更新描述 * 更新后台渲染页面 * 更新配置 * 更新渲染页面 * 添加云渲染 * 修复错误的接口调用 * 修复遗漏的数据转换 * 修复获取的图片数据异常问题 * 更新后台配置 * 更新渲染页面 * 修复云渲染访问地址错误 * 更新渲染页面 * 修复遗漏的模型文件 * 修复live2d问题 * 更新live2d以及相关配置 * 修复遗漏的数据参数 * 修复新live2d情况下云渲染错误的问题 * 适配云渲染1.1.2等待参数 * 添加云服务api检查 * 更新渲染页面 * 添加live2d加载检测 * 修复错误的属性判断 * 添加云渲染DPR * 更新sydney支持内容生成 * 修改文件模式语音转码接收模式 * 添加云转码时recordUrl检查 * 更新后台配置项 * 修复错误的文本描述 * 更新后台页面 * 添加全局对话模式设置,更新后台面板 * 添加第三方渲染服务适配 * 修复第三方服务器live2d加载导致的渲染失败问题 * 修复后台地址无法实时保存的问题 * 添加live2d模型透明度设置 * 合并更新 * 更新渲染页面 * 更新渲染页面 * 使dpr对本地渲染也生效 * 更新渲染页面 * 添加网页截图功能 * 添加后台配置项 * 添加配置导出和导入功能 * 运行通过参数传递用户token * 登录时将token作为参数返回 * 修复错误 * 添加密码修改和用户删除接口 * 修正密码比对 * 修复user错误 * 优化数据保存时的返回值 * 添加系统额外服务检查api * 添加AccessToken配置 * 修复错误的导入提示 * 添加ws连接 * 添加ws用户信息获取 * 修复错误的循环 * 修正ws参数 * 添加群消息获取权限 * 添加用户多端登录支持 * 修复错误的路径引用 * 修复错误的路径引用 * 修复错误 * 修复页面数据获取失败问题 * 修复异常的中断 * 添加配置视图 * 更新配置面板 * 添加用户版本信息 * 更新配置视图 * 修复错误的视图绑定 * 修改视图文件位置,添加mediaLink相关代码 * 修复错误的视图配置绑定 * 更新依赖,添加qq消息组件初始化信息获取 * 修复异常的群名称无法获取问题 * 修改注释 * 撤销对management的错误合并 * 添加Sydney图片识别功能 * 更新配置文件和后台页面 * 修改view配置 * 修复node版本过低导致的FormData无法调用,尝试添加反代 * 国外图片识别不使用反代 * fix: 修复云转码导致的语音重复发送问题 * fix: 修复qq消息可越权获取的问题 * feat: 添加代理post操作 * fix: 修复一些字符串格式的数字导致的配置加载错误 * fix: 修复错误的云服务api网址格式 * fix: 修复错误的云转码接口调用格式 * fix: 修复错误的精度 * 添加配置项适配 * feat: 添加群消息合并功能 * 添加历史记录的消息已读标签 * feat: 添加设定相关接口 * improvement: 在多少绘图失败后尝试使用cn进行绘图 * fix: 修复bing可能存在的无标题引用导致的错误 * fix: 修复绘图获取失败的问题 --------- Co-authored-by: ikechan8370 <geyinchibuaa@gmail.com>
151 lines
5.9 KiB
JavaScript
151 lines
5.9 KiB
JavaScript
import fetch, { FormData } from 'node-fetch'
|
||
import { makeForwardMsg } from './common.js'
|
||
import { Config } from './config.js'
|
||
|
||
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')
|
||
}
|
||
}
|
||
export default class BingDrawClient {
|
||
constructor(opts) {
|
||
this.opts = opts
|
||
if (Config.proxy && !Config.sydneyForceUseReverse) {
|
||
// 如果设置代理,走代理
|
||
this.opts.baseUrl = 'https://www.bing.com'
|
||
}
|
||
}
|
||
|
||
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 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',
|
||
'cache-control': 'max-age=0',
|
||
'content-type': 'application/x-www-form-urlencoded',
|
||
referrer: 'https://www.bing.com/images/create/',
|
||
origin: 'https://www.bing.com',
|
||
'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,
|
||
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 = {
|
||
headers
|
||
}
|
||
if (Config.proxy) {
|
||
fetchOptions.agent = proxy(Config.proxy)
|
||
}
|
||
let success = false
|
||
let retry = 5
|
||
let response
|
||
while (!success && retry >= 0) {
|
||
response = await fetch(url, Object.assign(fetchOptions, { body, redirect: 'manual', method: 'POST', credentials: 'include' }))
|
||
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`
|
||
response = await fetch(url, Object.assign(fetchOptions, { body, redirect: 'manual', method: 'POST', credentials: 'include' }))
|
||
}
|
||
if (response.status === 302) {
|
||
success = true
|
||
break
|
||
} else {
|
||
retry--
|
||
}
|
||
}
|
||
if (!success) {
|
||
//最后尝试使用https://cn.bing.com进行一次绘图
|
||
logger.info('尝试使用https://cn.bing.com进行绘图')
|
||
url = `https://cn.bing.com/images/create?q=${urlEncodedPrompt}&rt=3&FORM=GENCRE`
|
||
fetchOptions.referrer = 'https://cn.bing.com/images/create/'
|
||
fetchOptions.origin = 'https://cn.bing.com'
|
||
response = await fetch(url, Object.assign(fetchOptions, { body, redirect: 'manual', method: 'POST', credentials: 'include' }))
|
||
if (response.status !== 302) {
|
||
throw new Error('绘图失败,请检查Bing token和代理/反代配置')
|
||
}
|
||
}
|
||
let redirectUrl = response.headers.get('Location').replace('&nfy=1', '')
|
||
let requestId = redirectUrl.split('id=')[1]
|
||
// 模拟跳转
|
||
await fetch(`${this.opts.baseUrl}${redirectUrl}`, {
|
||
headers
|
||
})
|
||
let pollingUrl = `${this.opts.baseUrl}/images/create/async/results/${requestId}?q=${urlEncodedPrompt}`
|
||
logger.info({ pollingUrl })
|
||
logger.info('waiting for bing draw results...')
|
||
let timeoutTimes = 30
|
||
let found = false
|
||
let timer = setInterval(async () => {
|
||
if (found) {
|
||
return
|
||
}
|
||
let r = await fetch(pollingUrl, fetchOptions)
|
||
let rText = await r.text()
|
||
if (r.status === 200 && rText) {
|
||
// logger.info(rText)
|
||
logger.info('got bing draw results!')
|
||
found = true
|
||
let regex = /src="([^"]+)"/g
|
||
let imageLinks = rText.match(regex)
|
||
if (!imageLinks || imageLinks.length === 0) {
|
||
// 很可能是微软内部error,重试即可
|
||
return
|
||
}
|
||
imageLinks = imageLinks.map(link => link.split('?w=')[0]).map(link => link.replace('src="', ''))
|
||
imageLinks = [...new Set(imageLinks)]
|
||
const badImages = [
|
||
'https://r.bing.com/rp/in-2zU3AJUdkgFe7ZKv19yPBHVs.png',
|
||
'https://r.bing.com/rp/TX9QuO3WzcCJz1uaaSwQAz39Kb0.jpg'
|
||
]
|
||
for (let imageLink of imageLinks) {
|
||
if (badImages.indexOf(imageLink) > -1) {
|
||
await e.reply('绘图失败:Bad images', true)
|
||
logger.error(rText)
|
||
}
|
||
}
|
||
logger.info(imageLinks)
|
||
let images = imageLinks.map(link => segment.image(link))
|
||
let msg = await makeForwardMsg(e, images, `bing绘图结果:${prompt}`)
|
||
await e.reply(msg)
|
||
clearInterval(timer)
|
||
} else {
|
||
if (timeoutTimes === 0) {
|
||
await e.reply('绘图超时', true)
|
||
clearInterval(timer)
|
||
timer = null
|
||
} else {
|
||
logger.info('still waiting for bing draw results... times left: ' + timeoutTimes)
|
||
timeoutTimes--
|
||
}
|
||
}
|
||
}, 2000)
|
||
}
|
||
}
|