@@ -338,6 +338,8 @@ async def create_async_generator(
338
338
impersonate = "chrome" ,
339
339
timeout = timeout
340
340
) as session :
341
+ if cls ._expires is not None and cls ._expires < time .time ():
342
+ cls ._headers = cls ._api_key = None
341
343
if cls ._headers is None or cookies is not None :
342
344
cls ._create_request_args (cookies )
343
345
api_key = kwargs ["access_token" ] if "access_token" in kwargs else api_key
@@ -365,6 +367,8 @@ async def create_async_generator(
365
367
cls ._set_api_key (api_key )
366
368
except NoValidHarFileError :
367
369
...
370
+ if cls ._api_key is None :
371
+ await cls .nodriver_access_token ()
368
372
cls .default_model = cls .get_model (await cls .get_default_model (session , cls ._headers ))
369
373
370
374
async with session .post (
@@ -566,6 +570,40 @@ async def webview_access_token(cls) -> str:
566
570
cls ._expires = int (time .time ()) + 60 * 60 * 4
567
571
cls ._update_cookie_header ()
568
572
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
+
569
607
@classmethod
570
608
def browse_access_token (cls , proxy : str = None , timeout : int = 1200 ) -> None :
571
609
"""
0 commit comments