From 46038c6a207a594d32a88e98d5ed6532f0bd17f3 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Mon, 25 Nov 2024 13:27:56 +0100 Subject: Add .har file support for Copilot Update provider in Vision documentation Hide --- g4f/Provider/Copilot.py | 53 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'g4f/Provider/Copilot.py') diff --git a/g4f/Provider/Copilot.py b/g4f/Provider/Copilot.py index 2f37b1eb..5721f377 100644 --- a/g4f/Provider/Copilot.py +++ b/g4f/Provider/Copilot.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os import json import asyncio from http.cookiejar import CookieJar @@ -21,9 +22,11 @@ from .helper import format_prompt from ..typing import CreateResult, Messages, ImageType from ..errors import MissingRequirementsError from ..requests.raise_for_status import raise_for_status -from ..providers.helper import format_cookies +from ..providers.asyncio import get_running_loop +from ..Provider.openai.har_file import NoValidHarFileError, get_headers from ..requests import get_nodriver from ..image import ImageResponse, to_bytes, is_accepted_format +from ..cookies import get_cookies_dir from .. import debug class Conversation(BaseConversation): @@ -69,7 +72,15 @@ class Copilot(AbstractProvider): cookies = conversation.cookie_jar if conversation is not None else None if cls.needs_auth or image is not None: if conversation is None or conversation.access_token is None: - access_token, cookies = asyncio.run(cls.get_access_token_and_cookies(proxy)) + try: + access_token, cookies = readHAR() + except NoValidHarFileError as h: + debug.log(f"Copilot: {h}") + try: + get_running_loop(check_nested=True) + access_token, cookies = asyncio.run(cls.get_access_token_and_cookies(proxy)) + except MissingRequirementsError: + raise h else: access_token = conversation.access_token debug.log(f"Copilot: Access token: {access_token[:7]}...{access_token[-5:]}") @@ -159,7 +170,9 @@ class Copilot(AbstractProvider): for (var i = 0; i < localStorage.length; i++) { try { item = JSON.parse(localStorage.getItem(localStorage.key(i))); - if (item.credentialType == "AccessToken") { + if (item.credentialType == "AccessToken" + && item.expiresOn > Math.floor(Date.now() / 1000) + && item.target.includes("ChatAI")) { return item.secret; } } catch(e) {} @@ -172,4 +185,36 @@ class Copilot(AbstractProvider): for c in await page.send(nodriver.cdp.network.get_cookies([cls.url])): cookies[c.name] = c.value await page.close() - return access_token, cookies \ No newline at end of file + return access_token, cookies + +def readHAR(): + harPath = [] + for root, _, files in os.walk(get_cookies_dir()): + for file in files: + if file.endswith(".har"): + harPath.append(os.path.join(root, file)) + if not harPath: + raise NoValidHarFileError("No .har file found") + api_key = None + cookies = None + for path in harPath: + with open(path, 'rb') as file: + try: + harFile = json.loads(file.read()) + except json.JSONDecodeError: + # Error: not a HAR file! + continue + for v in harFile['log']['entries']: + v_headers = get_headers(v) + if v['request']['url'].startswith(Copilot.url): + try: + if "authorization" in v_headers: + api_key = v_headers["authorization"].split(maxsplit=1).pop() + except Exception as e: + debug.log(f"Error on read headers: {e}") + if v['request']['cookies']: + cookies = {c['name']: c['value'] for c in v['request']['cookies']} + if api_key is None: + raise NoValidHarFileError("No access token found in .har files") + + return api_key, cookies \ No newline at end of file -- cgit v1.2.3