diff --git a/g4f/Provider/needs_auth/OpenaiChat.py b/g4f/Provider/needs_auth/OpenaiChat.py index 711de0b3..1c66d998 100644 --- a/g4f/Provider/needs_auth/OpenaiChat.py +++ b/g4f/Provider/needs_auth/OpenaiChat.py @@ -21,7 +21,7 @@ from ..base_provider import AsyncAuthedProvider, ProviderModelMixin from ...typing import AsyncResult, Messages, Cookies, MediaListType from ...requests.raise_for_status import raise_for_status from ...requests import StreamSession -from ...requests import get_nodriver +from ...requests import get_nodriver_session from ...image import ImageRequest, to_image, to_bytes, is_accepted_format, detect_file_type from ...errors import MissingAuthError, NoValidHarFileError, ModelNotFoundError from ...providers.response import JsonConversation, FinishReason, SynthesizeData, AuthResult, ImageResponse, ImagePreview, ResponseType, format_link @@ -852,8 +852,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin): @classmethod async def nodriver_auth(cls, proxy: str = None): - browser, stop_browser = await get_nodriver(proxy=proxy) - try: + async with get_nodriver_session(proxy=proxy) as browser: page = await browser.get(cls.url) def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None): if event.request.url == start_url or event.request.url.startswith(conversation_url): @@ -882,14 +881,21 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin): page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request) await page.reload() user_agent = await page.evaluate("window.navigator.userAgent", return_by_value=True) - if cls.needs_auth: - await page.select('[data-testid="accounts-profile-button"]', 300) - textarea = await page.select("#prompt-textarea", 300) - await textarea.send_keys("Hello") - await asyncio.sleep(1) + debug.log(f"OpenaiChat: User-Agent: {user_agent}") + for _ in range(3): + try: + if cls.needs_auth: + await page.select('[data-testid="accounts-profile-button"]', 300) + textarea = await page.select("#prompt-textarea", 300) + await textarea.send_keys("Hello") + await asyncio.sleep(1) + except nodriver.core.connection.ProtocolException: + continue + break button = await page.select("[data-testid=\"send-button\"]") if button: await button.click() + debug.log("OpenaiChat: 'Hello' sended") while True: body = await page.evaluate("JSON.stringify(window.__remixContext)", return_by_value=True) if hasattr(body, "value"): @@ -902,17 +908,19 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin): if cls._api_key is not None or not cls.needs_auth: break await asyncio.sleep(1) + debug.log(f"OpenaiChat: Access token: {'False' if cls._api_key is None else cls._api_key[:12]+'...'}") while True: if cls.request_config.proof_token: break await asyncio.sleep(1) + debug.log(f"OpenaiChat: Proof token: Yes") cls.request_config.data_build = await page.evaluate("document.documentElement.getAttribute('data-build')") cls.request_config.cookies = await page.send(get_cookies([cls.url])) await page.close() cls._create_request_args(cls.request_config.cookies, cls.request_config.headers, user_agent=user_agent) cls._set_api_key(cls._api_key) - finally: - stop_browser() + debug.log(f"OpenaiChat: Sleep 10s") + await asyncio.sleep(10) @staticmethod def get_default_headers() -> Dict[str, str]: diff --git a/g4f/Provider/openai/har_file.py b/g4f/Provider/openai/har_file.py index f8012457..2b9dfef4 100644 --- a/g4f/Provider/openai/har_file.py +++ b/g4f/Provider/openai/har_file.py @@ -19,7 +19,7 @@ from ... import debug arkose_url = "https://tcr9i.chat.openai.com/fc/gt2/public_key/35536E1E-65B4-4D96-9D97-6ADB7EFF8147" backend_url = "https://chatgpt.com/backend-api/f/conversation" prepare_url = "https://chatgpt.com/backend-api/f/conversation/prepare" -backend_anon_url = "https://chatgpt.com/backend-anon/conversation" +backend_anon_url = "https://chatgpt.com/backend-anon/f/conversation" start_url = "https://chatgpt.com/" conversation_url = "https://chatgpt.com/c/" diff --git a/g4f/requests/__init__.py b/g4f/requests/__init__.py index 650caa6f..e4661ac7 100644 --- a/g4f/requests/__init__.py +++ b/g4f/requests/__init__.py @@ -8,6 +8,7 @@ from urllib.parse import urlparse from typing import Iterator, AsyncIterator from http.cookies import Morsel from pathlib import Path +from contextlib import asynccontextmanager import asyncio try: from curl_cffi.requests import Session, Response @@ -218,6 +219,12 @@ async def get_nodriver( BrowserConfig.stop_browser = on_stop return browser, on_stop +@asynccontextmanager +async def get_nodriver_session(**kwargs): + browser, stop_browser = await get_nodriver(**kwargs) + yield browser + stop_browser() + async def sse_stream(iter_lines: AsyncIterator[bytes]) -> AsyncIterator[dict]: if hasattr(iter_lines, "content"): iter_lines = iter_lines.content diff --git a/scripts/start-browser.sh b/scripts/start-browser.sh index 9315f000..2dc26d42 100755 --- a/scripts/start-browser.sh +++ b/scripts/start-browser.sh @@ -2,5 +2,5 @@ while true; do sleep 5 rm ~/.config/g4f/cookies/.nodriver_is_open - google-chrome --remote-allow-origins=* --no-first-run --no-service-autorun --no-default-browser-check --homepage=about:blank --no-pings --password-store=basic --disable-infobars --disable-breakpad --disable-dev-shm-usage --disable-session-crashed-bubble --disable-search-engine-choice-screen --user-data-dir="~/.config/g4f-nodriver" --disable-session-crashed-bubble --disable-features=IsolateOrigins,site-per-process --no-sandbox --remote-debugging-host=127.0.0.1 --remote-debugging-port=57011 + google-chrome --remote-allow-origins=* --no-first-run --no-service-autorun --no-default-browser-check --homepage=about:blank --no-pings --password-store=basic --disable-infobars --disable-breakpad --disable-dev-shm-usage --disable-session-crashed-bubble --disable-search-engine-choice-screen --user-data-dir="~/.config/g4f-nodriver" --disable-session-crashed-bubble --disable-features=IsolateOrigins,site-per-process --remote-debugging-host=127.0.0.1 --remote-debugging-port=57011 done \ No newline at end of file