---
# System prepended metadata

title: GPT + Selenium

---

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

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

## 準備
1. 去 [ChromeDriver](https://chromedriver.chromium.org/downloads) 下載對應chrome 的 driver (強烈建議你先更新到**最新版本** 的 chrome)
    + 如果用 linux 系統，[依照這個設置](https://www.jianshu.com/p/cbc01d32c7b0)
    + windows 點執行檔就好
    + Mac 窩不知道...
2. 安裝套件 **selenium** 是動態爬蟲， **undetected-chromedriver** 是防止機器人偵測的特別版
    ```
    pip install selenium
    pip install undetected-chromedriver
    ``` 
## Code

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

```python
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 網站，請自行登入
```python
driver = gptParser.get_driver()
gpt_parser = gptParser(driver)
```
登入後就能開始執行你的指令了，結果存在 response 變數
```python
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 秒以上，有時候會卡卡的