返回提交历史
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+19
-7
XFEstudio/gpt4free
Add _puid cookie, save access_token in cookies in OpenaiChat
50b796e8
代码差异
1 个文件
+19
-7
@@ -7,9 +7,9 @@ from async_property import async_cached_property
7
7
from selenium.webdriver.common.by import By
8
8
from selenium.webdriver.support.ui import WebDriverWait
9
9
from selenium.webdriver.support import expected_conditions as EC
10
10
11
11
from ..base_provider import AsyncGeneratorProvider
12
from ..helper import get_event_loop, format_prompt
12
from ..helper import get_event_loop, format_prompt, get_cookies
13
13
from ...webdriver import get_browser
14
14
from ...typing import AsyncResult, Messages
15
15
from ...requests import StreamSession
@@ -27,7 +27,7 @@ class OpenaiChat(AsyncGeneratorProvider):
27
27
needs_auth = True
28
28
supports_gpt_35_turbo = True
29
29
supports_gpt_4 = True
30
_access_token: str = None
30
_cookies: dict = {}
31
31
32
32
@classmethod
33
33
async def create(
@@ -72,6 +72,7 @@ class OpenaiChat(AsyncGeneratorProvider):
72
72
proxy: str = None,
73
73
timeout: int = 120,
74
74
access_token: str = None,
75
cookies: dict = None,
75
76
auto_continue: bool = False,
76
77
history_disabled: bool = True,
77
78
action: str = "next",
@@ -86,13 +87,18 @@ class OpenaiChat(AsyncGeneratorProvider):
86
87
raise ValueError(f"Model are not supported: {model}")
87
88
if not parent_id:
88
89
parent_id = str(uuid.uuid4())
90
if not cookies:
91
cookies = cls._cookies
89
92
if not access_token:
90
access_token = cls._access_token
93
if not cookies:
94
cls._cookies = cookies = get_cookies("chat.openai.com")
95
if "access_token" in cookies:
96
access_token = cookies["access_token"]
91
97
if not access_token:
92
98
login_url = os.environ.get("G4F_LOGIN_URL")
93
99
if login_url:
94
100
yield f"Please login: [ChatGPT]({login_url})\n\n"
95
access_token = cls._access_token = await cls.browse_access_token(proxy)
101
cls._cookies["access_token"] = access_token = await cls.browse_access_token(proxy)
96
102
headers = {
97
103
"Accept": "text/event-stream",
98
104
"Authorization": f"Bearer {access_token}",
@@ -101,7 +107,8 @@ class OpenaiChat(AsyncGeneratorProvider):
101
107
proxies={"https": proxy},
102
108
impersonate="chrome110",
103
109
headers=headers,
104
timeout=timeout
110
timeout=timeout,
111
cookies=dict([(name, value) for name, value in cookies.items() if name == "_puid"])
105
112
) as session:
106
113
end_turn = EndTurn()
107
114
while not end_turn.is_end:
@@ -170,7 +177,12 @@ class OpenaiChat(AsyncGeneratorProvider):
170
177
WebDriverWait(driver, 1200).until(
171
178
EC.presence_of_element_located((By.ID, "prompt-textarea"))
172
179
)
173
javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']"
180
javascript = """
181
access_token = (await (await fetch('/api/auth/session')).json())['accessToken'];
182
expires = new Date(); expires.setTime(expires.getTime() + 60 * 60 * 24 * 7); // One week
183
document.cookie = 'access_token=' + access_token + ';expires=' + expires.toUTCString() + ';path=/';
184
return access_token;
185
"""
174
186
return driver.execute_script(javascript)
175
187
finally:
176
188
driver.quit()