Skip to content

Commit e724079

Browse files
authored
Merge pull request #1802 from hlohaus/satur
Add nodriver to OpenaiChat
2 parents c9abf5c + bdc61ca commit e724079

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

g4f/Provider/needs_auth/OpenaiChat.py

+38
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ async def create_async_generator(
338338
impersonate="chrome",
339339
timeout=timeout
340340
) as session:
341+
if cls._expires is not None and cls._expires < time.time():
342+
cls._headers = cls._api_key = None
341343
if cls._headers is None or cookies is not None:
342344
cls._create_request_args(cookies)
343345
api_key = kwargs["access_token"] if "access_token" in kwargs else api_key
@@ -365,6 +367,8 @@ async def create_async_generator(
365367
cls._set_api_key(api_key)
366368
except NoValidHarFileError:
367369
...
370+
if cls._api_key is None:
371+
await cls.nodriver_access_token()
368372
cls.default_model = cls.get_model(await cls.get_default_model(session, cls._headers))
369373

370374
async with session.post(
@@ -566,6 +570,40 @@ async def webview_access_token(cls) -> str:
566570
cls._expires = int(time.time()) + 60 * 60 * 4
567571
cls._update_cookie_header()
568572

573+
@classmethod
574+
async def nodriver_access_token(cls):
575+
try:
576+
import nodriver as uc
577+
except ImportError:
578+
return
579+
try:
580+
from platformdirs import user_config_dir
581+
user_data_dir = user_config_dir("g4f-nodriver")
582+
except:
583+
user_data_dir = None
584+
browser = await uc.start(user_data_dir=user_data_dir)
585+
page = await browser.get("https://chat.openai.com/")
586+
while await page.query_selector("#prompt-textarea") is None:
587+
await asyncio.sleep(1)
588+
api_key = await page.evaluate(
589+
"(async () => {"
590+
"let session = await fetch('/api/auth/session');"
591+
"let data = await session.json();"
592+
"let accessToken = data['accessToken'];"
593+
"let expires = new Date(); expires.setTime(expires.getTime() + 60 * 60 * 4 * 1000);"
594+
"document.cookie = 'access_token=' + accessToken + ';expires=' + expires.toUTCString() + ';path=/';"
595+
"return accessToken;"
596+
"})();",
597+
await_promise=True
598+
)
599+
cookies = {}
600+
for c in await page.browser.cookies.get_all():
601+
if c.domain.endswith("chat.openai.com"):
602+
cookies[c.name] = c.value
603+
await page.close()
604+
cls._create_request_args(cookies)
605+
cls._set_api_key(api_key)
606+
569607
@classmethod
570608
def browse_access_token(cls, proxy: str = None, timeout: int = 1200) -> None:
571609
"""

g4f/client/async_client.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ def create_response(
8787
else:
8888
create = provider.create_completion
8989
response = create(
90-
model, messages, stream,
90+
model, messages,
91+
stream=stream,
9192
**filter_none(
9293
proxy=proxy,
9394
max_tokens=max_tokens,

g4f/client/client.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ def create(
9898
)
9999
stop = [stop] if isinstance(stop, str) else stop
100100
response = provider.create_completion(
101-
model, messages, stream,
101+
model, messages,
102+
stream=stream,
102103
**filter_none(
103104
proxy=self.client.get_proxy() if proxy is None else proxy,
104105
max_tokens=max_tokens,

g4f/gui/client/static/css/style.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,7 @@ a:-webkit-any-link {
10181018
width: 100%;
10191019
color: var(--colour-3);
10201020
min-height: 50px;
1021-
height: 50px;
1021+
height: 59px;
10221022
outline: none;
10231023
padding: var(--inner-gap) var(--section-gap);
10241024
resize: vertical;

0 commit comments

Comments
 (0)