XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
返回提交历史

XFEstudio/gpt4free

Add account support in Copilot provider

8bc456f3
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

3 个文件 +82 -8
Modified g4f/Provider/Copilot.py +73 -5
@@ -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
Added g4f/Provider/needs_auth/CopilotAccount.py +8 -0
@@ -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 = ""
Modified g4f/Provider/needs_auth/__init__.py +1 -3
@@ -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