GPT + Selenium

Selenium 可以直接控制瀏覽器來操作畫面上的元件,常用於動態爬蟲。
如果你花大錢買了 gpt plus,卻發現打 API 還得額外花錢(對,就是我),可以試看看以下的方法

優點
月費 20 USD 吃到飽
缺點
1小時內打太多資料會限制 45 分鐘

準備

  1. ChromeDriver 下載對應chrome 的 driver (強烈建議你先更新到最新版本 的 chrome)
    • 如果用 linux 系統,依照這個設置
    • windows 點執行檔就好
    • Mac 窩不知道
  2. 安裝套件 selenium 是動態爬蟲, undetected-chromedriver 是防止機器人偵測的特別版
    ​​​​pip install selenium
    ​​​​pip install undetected-chromedriver
    

Code

driver_path
指定 chrome_driver 的位置,如果用 window 系統可以手動點 chrome_driver.exe 或是指定位置自動打開,linux 系統就不用指定了。

from selenium.webdriver.remote.webdriver import By
import undetected_chromedriver as uc
from selenium.webdriver.common.keys import Keys

class gptParser:
    def __init__(self,
                 driver,
                 gpt_url: str = 'https://chat.openai.com/'):
        """ ChatGPT parser
        Args:
            driver_path (str, optional): The path of the chromedriver.
            gpt_url (str, optional): The url of ChatGPT.
        """
        # Start a webdriver instance and open ChatGPT
        self.driver = driver
        self.driver.get(gpt_url)

    @staticmethod
    def get_driver(driver_path: str = None,):
        return uc.Chrome() if driver_path is None else uc.Chrome(driver_path)

    def __call__(self, msg: str):
        # Find the input field and send a question
        input_field = self.driver.find_elements(
            By.TAG_NAME, 'textarea')[0]
        input_field.send_keys(msg)
        input_field.send_keys(Keys.RETURN)

    def read_respond(self):
        try:
            response = self.driver.find_elements(By.TAG_NAME, 'p')[-2].text
            return response
        except:
            return None

    def new_chat(self):
        self.driver.find_element(By.XPATH, '//a[text()="New chat"]').click()

    def close(self):
        self.driver.quit()

執行後會自動開啟 gpt 網站,請自行登入

driver = gptParser.get_driver()
gpt_parser = gptParser(driver)

登入後就能開始執行你的指令了,結果存在 response 變數

query = "1+1=?"
gpt_parser(query) # send the query
time.sleep(1)
response = gpt_parser.read_respond() # response = 2

小建議

  • 限制 gpt 的回答成固定格式,例如 1 或 0
  • min_wait, max_wait 建議在 1 秒以上,有時候會卡卡的