返回提交历史
Modified
g4f/Provider/Copilot.py
+73
-5
Added
g4f/Provider/needs_auth/CopilotAccount.py
+8
-0
Modified
g4f/Provider/needs_auth/__init__.py
+1
-3
XFEstudio/gpt4free
Add account support in Copilot provider
8bc456f3
代码差异
3 个文件
+82
-8
@@ -1,12 +1,25 @@
1
1
from __future__ import annotations
2
2
3
3
import json
4
import asyncio
4
5
from http.cookiejar import CookieJar
6
from urllib.parse import quote
7
5
8
try:
6
9
from curl_cffi.requests import Session, CurlWsFlag
7
10
has_curl_cffi = True
8
11
except ImportError:
9
12
has_curl_cffi = False
13
try:
14
import nodriver
15
has_nodriver = True
16
except ImportError:
17
has_nodriver = False
18
try:
19
from platformdirs import user_config_dir
20
has_platformdirs = True
21
except ImportError:
22
has_platformdirs = False
10
23
11
24
from .base_provider import AbstractProvider, BaseConversation
12
25
from .helper import format_prompt
@@ -18,10 +31,12 @@ from .. import debug
18
31
class Conversation(BaseConversation):
19
32
conversation_id: str
20
33
cookie_jar: CookieJar
34
access_token: str
21
35
22
def __init__(self, conversation_id: str, cookie_jar: CookieJar):
36
def __init__(self, conversation_id: str, cookie_jar: CookieJar, access_token: str = None):
23
37
self.conversation_id = conversation_id
24
38
self.cookie_jar = cookie_jar
39
self.access_token = access_token
25
40
26
41
class Copilot(AbstractProvider):
27
42
label = "Microsoft Copilot"
@@ -45,10 +60,26 @@ class Copilot(AbstractProvider):
45
60
**kwargs
46
61
) -> CreateResult:
47
62
if not has_curl_cffi:
48
raise MissingRequirementsError('Install or update "curl_cffi" package | pip install -U nodriver')
63
raise MissingRequirementsError('Install or update "curl_cffi" package | pip install -U curl_cffi')
49
64
65
websocket_url = cls.websocket_url
66
access_token = None
50
67
cookies = conversation.cookie_jar if conversation is not None else None
51
with Session(timeout=timeout, proxy=proxy, impersonate="chrome", cookies=cookies) as session:
68
if cls.needs_auth:
69
if conversation is None or conversation.access_token is None:
70
access_token, cookies = asyncio.run(cls.get_access_token_and_cookies(proxy))
71
else:
72
access_token = conversation.access_token
73
websocket_url = f"{websocket_url}&acessToken={quote(access_token)}"
74
headers = {"Authorization": f"Bearer {access_token}"}
75
76
with Session(
77
timeout=timeout,
78
proxy=proxy,
79
impersonate="chrome",
80
headers=headers,
81
cookies=cookies
82
) as session:
52
83
response = session.get(f"{cls.url}/")
53
84
raise_for_status(response)
54
85
if conversation is None:
@@ -56,7 +87,7 @@ class Copilot(AbstractProvider):
56
87
raise_for_status(response)
57
88
conversation_id = response.json().get("id")
58
89
if return_conversation:
59
yield Conversation(conversation_id, session.cookies.jar)
90
yield Conversation(conversation_id, session.cookies.jar, access_token)
60
91
prompt = format_prompt(messages)
61
92
if debug.logging:
62
93
print(f"Copilot: Created conversation: {conversation_id}")
@@ -84,4 +115,41 @@ class Copilot(AbstractProvider):
84
115
if msg.get("event") == "appendText":
85
116
yield msg.get("text")
86
117
elif msg.get("event") in ["done", "partCompleted"]:
87
break
118
break
119
120
@classmethod
121
async def get_access_token_and_cookies(cls, proxy: str = None):
122
if not has_nodriver:
123
raise MissingRequirementsError('Install "nodriver" package | pip install -U nodriver')
124
if has_platformdirs:
125
user_data_dir = user_config_dir("g4f-nodriver")
126
else:
127
user_data_dir = None
128
if debug.logging:
129
print(f"Copilot: Open nodriver with user_dir: {user_data_dir}")
130
browser = await nodriver.start(
131
user_data_dir=user_data_dir,
132
browser_args=None if proxy is None else [f"--proxy-server={proxy}"],
133
)
134
page = await browser.get(cls.url)
135
while True:
136
access_token = await page.evaluate("""
137
(() => {
138
for (var i = 0; i < localStorage.length; i++) {
139
try {
140
item = JSON.parse(localStorage.getItem(localStorage.key(i)));
141
if (item.credentialType == "AccessToken") {
142
return item.secret;
143
}
144
} catch(e) {}
145
}
146
})()
147
""")
148
if access_token:
149
break
150
asyncio.sleep(1)
151
cookies = {}
152
for c in await page.send(nodriver.cdp.network.get_cookies([cls.url])):
153
cookies[c.name] = c.value
154
await page.close()
155
return access_token, cookies
@@ -0,0 +1,8 @@
1
from __future__ import annotations
2
3
from ..Copilot import Copilot
4
5
class CopilotAccount(Copilot):
6
needs_auth = True
7
parent = "Copilot"
8
default_model = ""
@@ -1,9 +1,7 @@
1
1
from .gigachat import *
2
2
3
#from .MetaAIAccount import MetaAIAccount
4
#from .OpenaiAccount import OpenaiAccount
5
6
3
from .BingCreateImages import BingCreateImages
4
from .CopilotAccount import CopilotAccount
7
5
from .DeepInfra import DeepInfra
8
6
from .DeepInfraImage import DeepInfraImage
9
7
from .Gemini import Gemini