Skip to content

Commit 955fb4b

Browse files
authored
Merge pull request xtekky#1124 from hlohaus/fake
Improve helper
2 parents 33fcf90 + 598255f commit 955fb4b

File tree

7 files changed

+68
-48
lines changed

7 files changed

+68
-48
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ docker compose down
175175
```py
176176
import g4f
177177

178-
g4f.logging = True # enable logging
178+
g4f.debug.logging = True # enable logging
179179
g4f.check_version = False # Disable automatic version checking
180180
print(g4f.version) # check version
181181
print(g4f.Provider.Ails.params) # supported args

g4f/Provider/AItianhuSpace.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import random, json
4-
from ..debug import logging
4+
from .. import debug
55
from ..typing import AsyncResult, Messages
66
from ..requests import StreamSession
77
from .base_provider import AsyncGeneratorProvider, format_prompt, get_cookies
@@ -36,7 +36,7 @@ async def create_async_generator(cls,
3636
rand = ''.join(random.choice(chars) for _ in range(6))
3737
domain = f"{rand}.{domains[model]}"
3838

39-
if logging:
39+
if debug.logging:
4040
print(f"AItianhuSpace | using domain: {domain}")
4141

4242
if not cookies:

g4f/Provider/ChatgptFree.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
class ChatgptFree(AsyncProvider):
1515
url = "https://chatgptfree.ai"
1616
supports_gpt_35_turbo = True
17-
working = True
17+
working = False
1818
_post_id = None
1919
_nonce = None
2020

@@ -24,6 +24,7 @@ async def create_async(
2424
model: str,
2525
messages: Messages,
2626
proxy: str = None,
27+
timeout: int = 120,
2728
cookies: dict = None,
2829
**kwargs
2930
) -> str:
@@ -45,14 +46,19 @@ async def create_async(
4546
'sec-fetch-dest': 'empty',
4647
'sec-fetch-mode': 'cors',
4748
'sec-fetch-site': 'same-origin',
48-
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
49+
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
4950
}
5051

51-
async with StreamSession(headers=headers,
52-
impersonate="chrome107", proxies={"https": proxy}, timeout=10) as session:
52+
async with StreamSession(
53+
headers=headers,
54+
cookies=cookies,
55+
impersonate="chrome107",
56+
proxies={"https": proxy},
57+
timeout=timeout
58+
) as session:
5359

5460
if not cls._nonce:
55-
async with session.get(f"{cls.url}/", cookies=cookies) as response:
61+
async with session.get(f"{cls.url}/") as response:
5662

5763
response.raise_for_status()
5864
response = await response.text()

g4f/Provider/helper.py

+21-13
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import sys
44
import asyncio
55
import webbrowser
6-
import http.cookiejar
76

87
from os import path
98
from asyncio import AbstractEventLoop
9+
from platformdirs import user_config_dir
10+
1011
from ..typing import Dict, Messages
1112
from browser_cookie3 import chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox, BrowserCookieError
12-
13+
from .. import debug
1314

1415
# Change event loop policy on windows
1516
if sys.platform == 'win32':
@@ -44,7 +45,6 @@ def get_event_loop() -> AbstractEventLoop:
4445
)
4546

4647
def init_cookies():
47-
4848
urls = [
4949
'https://chat-gpt.org',
5050
'https://www.aitianhu.com',
@@ -72,16 +72,26 @@ def open_urls_in_browser(browser):
7272
# Load cookies for a domain from all supported browsers.
7373
# Cache the results in the "_cookies" variable.
7474
def get_cookies(domain_name=''):
75-
cj = http.cookiejar.CookieJar()
76-
for cookie_fn in [chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox]:
75+
if domain_name in _cookies:
76+
return _cookies[domain_name]
77+
def g4f(domain_name):
78+
user_data_dir = user_config_dir("g4f")
79+
cookie_file = path.join(user_data_dir, "Default", "Cookies")
80+
if not path.exists(cookie_file):
81+
return []
82+
return chrome(cookie_file, domain_name)
83+
cookies = {}
84+
for cookie_fn in [g4f, chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox]:
7785
try:
78-
for cookie in cookie_fn(domain_name=domain_name):
79-
cj.set_cookie(cookie)
80-
except BrowserCookieError:
86+
cookie_jar = cookie_fn(domain_name=domain_name)
87+
if len(cookie_jar) and debug.logging:
88+
print(f"Read cookies from {cookie_fn.__name__} for {domain_name}")
89+
for cookie in cookie_jar:
90+
if cookie.name not in cookies:
91+
cookies[cookie.name] = cookie.value
92+
except BrowserCookieError as e:
8193
pass
82-
83-
_cookies[domain_name] = {cookie.name: cookie.value for cookie in cj}
84-
94+
_cookies[domain_name] = cookies
8595
return _cookies[domain_name]
8696

8797

@@ -100,10 +110,8 @@ def format_prompt(messages: Messages, add_special_tokens=False) -> str:
100110

101111
def get_browser(user_data_dir: str = None):
102112
from undetected_chromedriver import Chrome
103-
from platformdirs import user_config_dir
104113

105114
if not user_data_dir:
106115
user_data_dir = user_config_dir("g4f")
107-
user_data_dir = path.join(user_data_dir, "Default")
108116

109117
return Chrome(user_data_dir=user_data_dir)

g4f/Provider/needs_auth/OpenaiChat.py

+27-20
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import uuid, json, time
44

55
from ..base_provider import AsyncGeneratorProvider
6-
from ..helper import get_browser, get_cookies, format_prompt
6+
from ..helper import get_browser, get_cookies, format_prompt, get_event_loop
77
from ...typing import AsyncResult, Messages
88
from ...requests import StreamSession
99

@@ -73,26 +73,33 @@ async def create_async_generator(
7373
last_message = new_message
7474

7575
@classmethod
76-
def browse_access_token(cls) -> str:
77-
try:
78-
from selenium.webdriver.common.by import By
79-
from selenium.webdriver.support.ui import WebDriverWait
80-
from selenium.webdriver.support import expected_conditions as EC
76+
async def browse_access_token(cls) -> str:
77+
def browse() -> str:
78+
try:
79+
from selenium.webdriver.common.by import By
80+
from selenium.webdriver.support.ui import WebDriverWait
81+
from selenium.webdriver.support import expected_conditions as EC
8182

82-
driver = get_browser()
83-
except ImportError:
84-
return
83+
driver = get_browser()
84+
except ImportError:
85+
return
8586

86-
driver.get(f"{cls.url}/")
87-
try:
88-
WebDriverWait(driver, 1200).until(
89-
EC.presence_of_element_located((By.ID, "prompt-textarea"))
90-
)
91-
javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']"
92-
return driver.execute_script(javascript)
93-
finally:
94-
time.sleep(1)
95-
driver.quit()
87+
driver.get(f"{cls.url}/")
88+
try:
89+
WebDriverWait(driver, 1200).until(
90+
EC.presence_of_element_located((By.ID, "prompt-textarea"))
91+
)
92+
javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']"
93+
return driver.execute_script(javascript)
94+
finally:
95+
driver.close()
96+
time.sleep(0.1)
97+
driver.quit()
98+
loop = get_event_loop()
99+
return await loop.run_in_executor(
100+
None,
101+
browse
102+
)
96103

97104
@classmethod
98105
async def fetch_access_token(cls, cookies: dict, proxies: dict = None) -> str:
@@ -110,7 +117,7 @@ async def get_access_token(cls, cookies: dict = None, proxies: dict = None) -> s
110117
if cookies:
111118
cls._access_token = await cls.fetch_access_token(cookies, proxies)
112119
if not cls._access_token:
113-
cls._access_token = cls.browse_access_token()
120+
cls._access_token = await cls.browse_access_token()
114121
if not cls._access_token:
115122
raise RuntimeError("Read access token failed")
116123
return cls._access_token

g4f/Provider/retry_provider.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
from typing import List, Type, Dict
66
from ..typing import CreateResult, Messages
77
from .base_provider import BaseProvider, AsyncProvider
8+
from .. import debug
89

910

1011
class RetryProvider(AsyncProvider):
1112
__name__: str = "RetryProvider"
1213
working: bool = True
1314
supports_stream: bool = True
14-
logging: bool = False
1515

1616
def __init__(
1717
self,
@@ -39,7 +39,7 @@ def create_completion(
3939
started: bool = False
4040
for provider in providers:
4141
try:
42-
if self.logging:
42+
if debug.logging:
4343
print(f"Using {provider.__name__} provider")
4444

4545
for token in provider.create_completion(model, messages, stream, **kwargs):
@@ -51,7 +51,7 @@ def create_completion(
5151

5252
except Exception as e:
5353
self.exceptions[provider.__name__] = e
54-
if self.logging:
54+
if debug.logging:
5555
print(f"{provider.__name__}: {e.__class__.__name__}: {e}")
5656
if started:
5757
raise e
@@ -77,7 +77,7 @@ async def create_async(
7777
)
7878
except Exception as e:
7979
self.exceptions[provider.__name__] = e
80-
if self.logging:
80+
if debug.logging:
8181
print(f"{provider.__name__}: {e.__class__.__name__}: {e}")
8282

8383
self.raise_exceptions()

g4f/__init__.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from .models import Model, ModelUtils, _all_models
44
from .Provider import BaseProvider, RetryProvider
55
from .typing import Messages, CreateResult, Union, List
6-
from .debug import logging
6+
from . import debug
77

88
version = '0.1.7.4'
99
version_check = True
@@ -46,8 +46,7 @@ def get_model_and_provider(model : Union[Model, str],
4646
if not provider.supports_stream and stream:
4747
raise ValueError(f'{provider.__name__} does not support "stream" argument')
4848

49-
if logging:
50-
RetryProvider.logging = True
49+
if debug.logging:
5150
print(f'Using {provider.__name__} provider')
5251

5352
return model, provider

0 commit comments

Comments
 (0)