This Python scraper provides access to the conversational capabilities of ChatGPT through a simple chat messaging interface.
While not officially supported by OpenAI, this library can enable interesting conversational applications.
It allows for:
- Creating chat sessions with ChatGPT and getting chat IDs.
- Sending messages to specific chat ids, and even toggle chat history.
- Get an ordered, strong typed list of messages from any chat.
It relies on geckodriver, selenium-wire and selgym (selenium) libraries only.
Download this repository and install it from source by runnig this command inside the repository folder:
pip install -e .
pip uninstall gptauto
- Python >= 3.10
- geckodriver installed in a folder registered in PATH
- A valid login to ChatGPT on a newly created Firefox profile
(A new Firefox profile is needed in order for
selenium-wire
proxy to work). - Disabling ChatGPT's chat history on this profile is also recommended.
By installing this library using pip
, a command-line interface is provided, ask-gpt
, it takes one positional argument, the input TEXT for chat-gpt, that can also be prepended with an header (prompt) using the -p
string parameter.
Other parameters are:
-f Firefox profile
(Firefox root profile path string, default behaviour is creating a new one)
-ts Type speed
(Maximum type speed expressed as a float number >= 0.001, defaults to 0.01)
This value is used to randomly sleep for a specific interval between each individual key-stroke.
-nh No-Headless
(Turn off selenium Headless mode, for debugging purposes)
This utility is also pipe friendly, having the ability to pipe input strings as the Chat GPT input directly into the command.
For example in Linux distributions:
echo "Roll a D20" | ask-gpt -p "Only answer with a number" | cat "output.txt"
Or in Windows CMD:
( echo "Roll a D20" & ask-gpt -p "Only answer with a number" ) >> output.txt
from gptauto.scraper import GPTScraper
# Set to None to use default firefox profile
# Set to a string with the root profile directory path
# to use a different firefox profile
PROFILE_PATH = None
def _main() -> None:
scraper = GPTScraper(profile_path=PROFILE_PATH)
try:
# Creates a new webdriver instance
# opening chatgpt page
scraper.start()
# Pick text to send
text = input("\nText\n>>").strip()
scraper.send_message(text)
# Waits for completion to finish
scraper.wait_completion()
# Retrieves chat messages
# as an ordered list of AssistantMessage
# or UserMessage
messages = list(scraper.get_messages())
if messages:
print(f"\nANSWER:\n\n{messages[-1].text}\n")
except KeyboardInterrupt:
return
finally:
# Gracefully quit the webdriver instance
scraper.quit()
# After calling quit()
# a new session can be started with .start()
if __name__ == "__main__":
_main()
from gptauto.scraper import GPTScraper
# Open new session on default firefox profile
scraper = GPTScraper()
try:
scraper.start()
# Toggle chat history
# If On -> Off
# If Off -> On
scraper.toggle_history()
finally:
scraper.quit()
-
Sometimes a captcha may appear after sending a message, so far this software does nothing to prevent this or act accordingly, if a captcha is triggered, the only current solution is to solve it manually, having non-headless behavior set by default.
-
Currently this software does not work in headless mode, I don't know if I will ever be able to find a solution in the near future. Feel free to open a pull request if you found a better one and would like to contribute 🦾
This repository provides a way for automating free accounts on ChatGPT. Please note that this software is not endorsed, supported, or maintained by OpenAI. Use it at your own discretion and risk. OpenAI may make changes to their official product or APIs at any time, which could affect the functionality of this software. We do not guarantee the accuracy, reliability, or security of the information and data retrieved using this API. By using this repository, you agree that the maintainers are not responsible for any damages, issues, or consequences that may arise from its usage. Always refer to OpenAI's official documentation and terms of use. This project is maintained independently by contributors who are not affiliated with OpenAI.
A huge thank you in advance to anyone who wants to donate :)