kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
feat: add proxy support
rodzic
c331c73677
commit
31a8206fed
|
@ -1,6 +1,7 @@
|
|||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
*.swp
|
||||
.idea
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -29,6 +29,7 @@ export class ChatGPTAPIBrowser extends AChatGPTAPI {
|
|||
protected _executablePath: string
|
||||
protected _browser: Browser
|
||||
protected _page: Page
|
||||
protected _proxyServer: string
|
||||
|
||||
/**
|
||||
* Creates a new client for automating the ChatGPT webapp.
|
||||
|
@ -54,6 +55,9 @@ export class ChatGPTAPIBrowser extends AChatGPTAPI {
|
|||
|
||||
/** @defaultValue `undefined` **/
|
||||
executablePath?: string
|
||||
|
||||
/** @defaultValue `undefined` **/
|
||||
proxyServer?: string
|
||||
}) {
|
||||
super()
|
||||
|
||||
|
@ -65,7 +69,8 @@ export class ChatGPTAPIBrowser extends AChatGPTAPI {
|
|||
isGoogleLogin = false,
|
||||
minimize = true,
|
||||
captchaToken,
|
||||
executablePath
|
||||
executablePath,
|
||||
proxyServer
|
||||
} = opts
|
||||
|
||||
this._email = email
|
||||
|
@ -77,6 +82,7 @@ export class ChatGPTAPIBrowser extends AChatGPTAPI {
|
|||
this._minimize = !!minimize
|
||||
this._captchaToken = captchaToken
|
||||
this._executablePath = executablePath
|
||||
this._proxyServer = proxyServer
|
||||
|
||||
if (!this._email) {
|
||||
const error = new types.ChatGPTError('ChatGPT invalid email')
|
||||
|
@ -99,7 +105,8 @@ export class ChatGPTAPIBrowser extends AChatGPTAPI {
|
|||
try {
|
||||
this._browser = await getBrowser({
|
||||
captchaToken: this._captchaToken,
|
||||
executablePath: this._executablePath
|
||||
executablePath: this._executablePath,
|
||||
proxyServer: this._proxyServer
|
||||
})
|
||||
this._page =
|
||||
(await this._browser.pages())[0] || (await this._browser.newPage())
|
||||
|
|
|
@ -55,7 +55,8 @@ export async function getOpenAIAuth({
|
|||
isGoogleLogin = false,
|
||||
captchaToken = process.env.CAPTCHA_TOKEN,
|
||||
nopechaKey = process.env.NOPECHA_KEY,
|
||||
executablePath
|
||||
executablePath,
|
||||
proxyServer = process.env.PROXY_SERVER,
|
||||
}: {
|
||||
email?: string
|
||||
password?: string
|
||||
|
@ -65,14 +66,15 @@ export async function getOpenAIAuth({
|
|||
isGoogleLogin?: boolean
|
||||
captchaToken?: string
|
||||
nopechaKey?: string
|
||||
executablePath?: string
|
||||
executablePath?: string,
|
||||
proxyServer?: string
|
||||
}): Promise<OpenAIAuth> {
|
||||
const origBrowser = browser
|
||||
const origPage = page
|
||||
|
||||
try {
|
||||
if (!browser) {
|
||||
browser = await getBrowser({ captchaToken, nopechaKey, executablePath })
|
||||
browser = await getBrowser({ captchaToken, nopechaKey, executablePath, proxyServer })
|
||||
}
|
||||
|
||||
const userAgent = await browser.userAgent()
|
||||
|
@ -216,12 +218,14 @@ export async function getBrowser(
|
|||
opts: PuppeteerLaunchOptions & {
|
||||
captchaToken?: string
|
||||
nopechaKey?: string
|
||||
proxyServer?: string
|
||||
} = {}
|
||||
) {
|
||||
const {
|
||||
captchaToken = process.env.CAPTCHA_TOKEN,
|
||||
nopechaKey = process.env.NOPECHA_KEY,
|
||||
executablePath = defaultChromeExecutablePath(),
|
||||
proxyServer = process.env.PROXY_SERVER,
|
||||
...launchOptions
|
||||
} = opts
|
||||
|
||||
|
@ -274,6 +278,10 @@ export async function getBrowser(
|
|||
hasNopechaExtension = true
|
||||
}
|
||||
|
||||
if (proxyServer) {
|
||||
puppeteerArgs.push(`--proxy-server=${proxyServer}`)
|
||||
}
|
||||
|
||||
const browser = await puppeteer.launch({
|
||||
headless: false,
|
||||
// https://peter.sh/experiments/chromium-command-line-switches/
|
||||
|
@ -288,6 +296,26 @@ export async function getBrowser(
|
|||
...launchOptions
|
||||
})
|
||||
|
||||
if (process.env.PROXY_VALIDATE_IP) {
|
||||
const page = (await browser.pages())[0] || (await browser.newPage())
|
||||
// send a fetch request to https://ifconfig.co using page.evaluate() and verify the IP matches
|
||||
let ip;
|
||||
try {
|
||||
({ ip } = await page.evaluate(() => {
|
||||
return fetch('https://ifconfig.co', {
|
||||
headers: {
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
}).then((res) => res.json())
|
||||
}));
|
||||
} catch (err) {
|
||||
throw new Error(`Proxy IP validation failed: ${err.message}`)
|
||||
}
|
||||
if (ip !== process.env.PROXY_VALIDATE_IP) {
|
||||
throw new Error(`Proxy IP mismatch: ${ip} !== ${process.env.PROXY_VALIDATE_IP}`)
|
||||
}
|
||||
}
|
||||
|
||||
// TOdO: this is a really hackity hack way of setting the API key...
|
||||
if (hasNopechaExtension) {
|
||||
const page = (await browser.pages())[0] || (await browser.newPage())
|
||||
|
|
Ładowanie…
Reference in New Issue