26
26
'//div[starts-with(@class, "markdown prose w-full break-words")]' ,
27
27
)
28
28
chatgpt_alert = (By .XPATH , '//div[@role="alert"]' )
29
+ chatgpt_dialog = (By .XPATH , '//div[@role="dialog"]' )
29
30
chatgpt_intro = (By .ID , 'headlessui-portal-root' )
30
31
chatgpt_login_btn = (By .XPATH , '//button[text()="Log in"]' )
31
32
chatgpt_login_h1 = (By .XPATH , '//h1[text()="Welcome back"]' )
@@ -80,6 +81,7 @@ def __init__(
80
81
:param chrome_args: The arguments to pass to the browser
81
82
:param moderation: Whether to enable message moderation
82
83
:param verbose: Whether to enable verbose logging
84
+ :param headless: Whether to run the browser in headless mode
83
85
'''
84
86
self .__init_logger (verbose )
85
87
@@ -149,7 +151,7 @@ def __init_logger(self, verbose: bool) -> None:
149
151
:param verbose: Whether to enable verbose logging
150
152
'''
151
153
self .logger = logging .getLogger ('pyChatGPT' )
152
- self .logger .setLevel (logging .INFO )
154
+ self .logger .setLevel (logging .DEBUG )
153
155
if verbose :
154
156
formatter = logging .Formatter ('[%(funcName)s] %(message)s' )
155
157
stream_handler = logging .StreamHandler ()
@@ -377,19 +379,39 @@ def __check_blocking_elements(self) -> None:
377
379
Check for blocking elements and dismiss them
378
380
'''
379
381
self .logger .debug ('Looking for blocking elements...' )
382
+
380
383
try :
381
- intro = WebDriverWait (self .driver , 3 ).until (
382
- EC .presence_of_element_located (chatgpt_intro )
384
+ # FInd a button to dismiss the dialog with class="btn relative btn-primary" inside the div[@role="dialog"]
385
+ btn_to_dismiss = WebDriverWait (self .driver , 5 ).until (
386
+ EC .presence_of_element_located ((By .XPATH , '//div[@role="dialog"]//button[@class="btn relative btn-primary"]' ))
383
387
)
384
- self .logger .debug ('Dismissing intro...' )
385
- self .driver .execute_script ('arguments[0].remove()' , intro )
386
- except SeleniumExceptions .TimeoutException :
388
+ if btn_to_dismiss :
389
+ self .logger .debug ('Dismissing dialog...' )
390
+ self .driver .execute_script ('arguments[0].click()' , btn_to_dismiss )
391
+ except :
392
+ pass
393
+
394
+ try :
395
+ # for 3 times
396
+ i = 0
397
+ while i <= 2 :
398
+ self .__sleep (0.4 )
399
+ if i != 2 :
400
+ #get the button with class="btn relative btn-neutral ml-auto"
401
+ btn = WebDriverWait (self .driver , 5 ).until (
402
+ EC .presence_of_element_located ((By .XPATH , '//button[@class="btn relative btn-neutral ml-auto"]' ))
403
+ )
404
+ else :
405
+ #get the button with class="btn relative btn-primary ml-auto"
406
+ btn = WebDriverWait (self .driver , 5 ).until (
407
+ EC .presence_of_element_located ((By .XPATH , '//button[@class="btn relative btn-primary ml-auto"]' ))
408
+ )
409
+ if btn :
410
+ self .logger .debug ('Dismissing dialog...' )
411
+ self .driver .execute_script ('arguments[0].click()' , btn )
412
+ i += 1
413
+ except :
387
414
pass
388
-
389
- alerts = self .driver .find_elements (* chatgpt_alert )
390
- if alerts :
391
- self .logger .debug ('Dismissing alert...' )
392
- self .driver .execute_script ('arguments[0].remove()' , alerts [0 ])
393
415
394
416
def __stream_message (self ):
395
417
prev_content = ''
@@ -409,15 +431,15 @@ def __stream_message(self):
409
431
if not result_streaming :
410
432
break
411
433
412
- def send_message (self , message : str , stream : bool = False ) -> dict :
434
+ def send_message (self , message : str , stream : bool = False , model : str = "default" ) -> dict :
413
435
'''
414
436
Send a message to ChatGPT\n
415
437
:param message: Message to send
416
438
:return: Dictionary with keys `message` and `conversation_id`
417
439
'''
418
440
self .logger .debug ('Ensuring Cloudflare cookies...' )
419
441
self .__ensure_cf ()
420
- self .__check_blocking_elements ()
442
+ # self.__check_blocking_elements()
421
443
422
444
# Wait for page to load
423
445
try :
@@ -429,17 +451,19 @@ def send_message(self, message: str, stream: bool = False) -> dict:
429
451
430
452
# If we have paid access, we should select GPT4 model
431
453
try :
432
- self .logger .debug ('Trying to select model...' )
433
- WebDriverWait (self .driver , 3 ).until (
434
- EC .presence_of_element_located (model_selector )
435
- ).click ()
436
- self .logger .debug ('Paid access detected, selecting GPT4 model...' )
437
- self .__sleep (1.0 )
438
- WebDriverWait (self .driver , 3 ).until (
439
- EC .presence_of_element_located (gpt4_selector )
440
- ).click ()
441
- self .logger .debug ('GPT4 model selected' )
454
+ if model == "gpt4" :
455
+ self .logger .debug ('Trying to select model...' )
456
+ WebDriverWait (self .driver , 3 ).until (
457
+ EC .presence_of_element_located (model_selector )
458
+ ).click ()
459
+ self .logger .debug ('Paid access detected, selecting GPT4 model...' )
460
+ self .__sleep (1.0 )
461
+ WebDriverWait (self .driver , 3 ).until (
462
+ EC .presence_of_element_located (gpt4_selector )
463
+ ).click ()
464
+ self .logger .debug ('GPT4 model selected' )
442
465
except SeleniumExceptions .TimeoutException :
466
+ print (">>> WARNING <<<\n >> You don't have paid access to GPT4, using default model..." )
443
467
self .logger .debug ('Paid access not detected, using default model...' )
444
468
445
469
self .logger .debug ('Sending message...' )
@@ -489,19 +513,19 @@ def send_message(self, message: str, stream: bool = False) -> dict:
489
513
content = markdownify (response .get_attribute ('innerHTML' )).replace (
490
514
'Copy code`' , '`'
491
515
)
516
+
492
517
pattern = re .compile (
493
518
r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
494
519
)
495
520
matches = pattern .search (self .driver .current_url )
496
521
if not matches :
497
522
self .driver .refresh ()
498
- self .__sleep (1 )
499
- self .__check_blocking_elements ()
500
- self .__sleep (1 )
523
+ self .__sleep (2 )
524
+ #self.__check_blocking_elements()
501
525
self .driver .execute_script ("arguments[0].click();" , WebDriverWait (self .driver , 10 ).until (
502
526
EC .element_to_be_clickable (chatgpt_chats_list_first_node )
503
527
))
504
- self .__sleep (1 )
528
+ self .__sleep (2 )
505
529
#print(self.driver.current_url)
506
530
matches = pattern .search (self .driver .current_url )
507
531
@@ -568,4 +592,4 @@ def refresh_chat_page(self) -> None:
568
592
569
593
self .driver .get (chatgpt_chat_url )
570
594
self .__check_capacity (chatgpt_chat_url )
571
- self .__check_blocking_elements ()
595
+ self .__check_blocking_elements ()
0 commit comments