Skip to content

Commit 0eb963a

Browse files
committed
Add auto login feature integrated with settings file 🔥🔥🔥
Fixes #17
1 parent e17f54a commit 0eb963a

File tree

2 files changed

+60
-37
lines changed

2 files changed

+60
-37
lines changed

aishell/cli.py

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,77 @@
11
import os
22
import sys
3-
import webbrowser
43

5-
import pyperclip
64
import rich
75
import typer
86
from rich.console import Console
97
from yt_dlp.cookies import SUPPORTED_BROWSERS
108

119
from aishell.adapters.openai_cookie_adapter import OpenAICookieAdapter
12-
from aishell.exceptions import UnauthorizedAccessError
10+
from aishell.models import RevChatGPTChatbotConfigModel
11+
from aishell.models.aishell_config_model import AiShellConfigModel
1312
from aishell.models.language_model import LanguageModel
1413
from aishell.query_clients import GPT3Client, OfficialChatGPTClient, QueryClient, ReverseEngineeredChatGPTClient
14+
from aishell.utils import AiShellConfigManager
1515

1616
cli_app = typer.Typer()
1717

1818

19-
def _open_chatgpt_browser():
20-
CHATGPT_LOGIN_URL = 'https://chat.openai.com/auth/login?next=/chat'
21-
webbrowser.open(CHATGPT_LOGIN_URL)
19+
def config_aishell():
20+
rich.print('''Hi! 🙌 I am [bold blue]AiShell[/bold blue], [yellow]your powerful terminal assistant[/yellow] 🔥
21+
I am here to assist you with configuring AiShell. 💪
2222
23+
Please make sure that you have logged into chat.openai.com on your browser before we continue. 🗝️
2324
24-
def _ask_user_copy_session_token_to_clipboard(session_token: str) -> None:
25-
copy_session_token = typer.confirm('Do you want to copy the session token to your clipboard?')
26-
if copy_session_token:
27-
pyperclip.copy(session_token)
28-
rich.print(
29-
'Session token copied to clipboard. [bold]`export CHATGPT_SESSION_TOKEN=<session_token>`[/bold] to set it.'
30-
)
25+
''')
26+
typer.confirm('Are you ready to proceed? 🚀', abort=True)
27+
28+
rich.print(f'''Which browser did you use to log in to chat.openai.com?
29+
30+
We support the following browsers: [{SUPPORTED_BROWSERS}]''')
31+
browser_name = typer.prompt('Please enter your choice here: ')
32+
if browser_name not in SUPPORTED_BROWSERS:
33+
rich.print(f'Browser {browser_name} is not supported. Supported browsers are: {SUPPORTED_BROWSERS}')
34+
sys.exit(1)
35+
36+
adapter = OpenAICookieAdapter(browser_name)
37+
session_token = adapter.get_openai_session_token()
38+
if not session_token:
39+
rich.print('Failed to get session token. 😓 Can you check if you are logged in to https://chat.openai.com?')
40+
sys.exit(1)
41+
42+
is_paid = typer.confirm("It's my last question! 🤩 Are you a PLUS user?")
43+
44+
chatgpt_config = RevChatGPTChatbotConfigModel(session_token=session_token, paid=is_paid)
45+
aishell_config = AiShellConfigModel(chatgpt_config=chatgpt_config)
46+
config_manager = AiShellConfigManager(config_model=aishell_config)
47+
config_manager.save_config()
48+
49+
rich.print(f'''[green bold]Excellent![/green bold] You are now ready to use [bold blue]AiShell[/bold blue] 🚀
50+
51+
Enjoy your AI powered terminal assistant! 🎉
52+
53+
[dim]To check your settings file, it's at: {config_manager.config_path}[/dim]
54+
55+
''')
56+
return config_manager
3157

3258

3359
@cli_app.command()
3460
def ask(question: str, language_model: LanguageModel = LanguageModel.REVERSE_ENGINEERED_CHATGPT):
61+
is_config_file_available = AiShellConfigManager.is_config_file_available(AiShellConfigManager.DEFAULT_CONFIG_PATH)
62+
config_manager: AiShellConfigManager
63+
if is_config_file_available:
64+
config_manager = AiShellConfigManager(load_config=True)
65+
else:
66+
config_manager = config_aishell()
67+
3568
query_client: QueryClient
36-
if language_model == LanguageModel.GPT3:
69+
if language_model == LanguageModel.REVERSE_ENGINEERED_CHATGPT:
70+
query_client = ReverseEngineeredChatGPTClient(config=config_manager.config_model.chatgpt_config)
71+
elif language_model == LanguageModel.GPT3:
3772
query_client = GPT3Client()
3873
elif language_model == LanguageModel.OFFICIAL_CHATGPT:
3974
query_client = OfficialChatGPTClient()
40-
elif language_model == LanguageModel.REVERSE_ENGINEERED_CHATGPT:
41-
try:
42-
query_client = ReverseEngineeredChatGPTClient()
43-
except UnauthorizedAccessError:
44-
print('You are not logged in to OpenAI, attempting to log you in...')
45-
_open_chatgpt_browser()
46-
BROWSER_NAME = typer.prompt(f'Which browser did you use to log in? [{SUPPORTED_BROWSERS}]')
47-
adapter = OpenAICookieAdapter(BROWSER_NAME)
48-
session_token = adapter.get_openai_session_token()
49-
if session_token is not None:
50-
os.environ['CHATGPT_SESSION_TOKEN'] = session_token
51-
_ask_user_copy_session_token_to_clipboard(session_token)
52-
ask(question, language_model)
53-
else:
54-
print('Failed to log in.')
55-
sys.exit()
5675

5776
query_client.query(question)
5877

aishell/query_clients/reverse_engineered_chatgpt_client.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,21 @@ def revchatgpt_config(self) -> dict[str, Union[str, bool]]:
1919

2020
def __init__(
2121
self,
22+
config: Optional[RevChatGPTChatbotConfigModel] = None,
2223
access_token: Optional[str] = None,
2324
session_token: Optional[str] = None,
2425
):
25-
CHATGPT_ACCESS_TOKEN = os.environ.get('CHATGPT_ACCESS_TOKEN', access_token)
26-
CHATGPT_SESSION_TOKEN = os.environ.get('CHATGPT_SESSION_TOKEN', session_token)
27-
if CHATGPT_ACCESS_TOKEN:
28-
self._config = RevChatGPTChatbotConfigModel(access_token=CHATGPT_ACCESS_TOKEN)
29-
elif CHATGPT_SESSION_TOKEN:
30-
self._config = RevChatGPTChatbotConfigModel(session_token=CHATGPT_SESSION_TOKEN)
26+
if config:
27+
self._config = config
3128
else:
32-
raise UnauthorizedAccessError('No access token or session token provided.')
29+
CHATGPT_ACCESS_TOKEN = os.environ.get('CHATGPT_ACCESS_TOKEN', access_token)
30+
CHATGPT_SESSION_TOKEN = os.environ.get('CHATGPT_SESSION_TOKEN', session_token)
31+
if CHATGPT_ACCESS_TOKEN:
32+
self._config = RevChatGPTChatbotConfigModel(access_token=CHATGPT_ACCESS_TOKEN)
33+
elif CHATGPT_SESSION_TOKEN:
34+
self._config = RevChatGPTChatbotConfigModel(session_token=CHATGPT_SESSION_TOKEN)
35+
else:
36+
raise UnauthorizedAccessError('No access token or session token provided.')
3337

3438
def query(self, prompt: str) -> str:
3539
prompt = self._construct_prompt(prompt)

0 commit comments

Comments
 (0)