背景
有一些重复性的操作想让GPT执行
不想一个个点
实现功能:
- 保持登陆状态,
- 重复对话,
- Python输入对话内容,
- 复制对话结果,
- 自动退出
来源
零基础教学:如何用 50 行 Python 代码调用私有 GPTs?
直接使用还是存在一些问题,进行了修改
环境安装
一定注意第三句。安装对应的浏览器组件,不然用不了。
pip install pyperclip
pip install playwright
playwright install
Python实现
- 首先执行login,打开网页后需要登陆自己的GPT账号
- 然后关闭网页,停止程序,注释掉login语句
- 然后执行,在Python中可以进一步选择自己想要对话的问题,或者输入n退出
# 导入所需的模块
import time # 用于睡眠和延迟操作
import pyperclip # 用于与剪贴板交互
from playwright.sync_api import sync_playwright # 用于浏览器自动化
# 创建保存历史数据的临时文件夹
if not os.path.exists('gpts_firefox_dir'):
os.makedirs('gpts_firefox_dir')
# 定义登录函数
def login():
# 使用Playwright同步API
with sync_playwright() as p:
# 启动Firefox浏览器,并创建一个持久的上下文环境
context = p.firefox.launch_persistent_context(
'./gpts_firefox_dir', # 浏览器数据存储目录
headless=False, # 以有头模式运行,方便调试
slow_mo=500 # 每步操作之间延迟500毫秒,方便观察
)
# 获取第一个页面
page = context.pages[0]
# 访问OpenAI的ChatGPT网页
page.goto('https://chat.openai.com/')
input('等待登陆,登录后请注释login()这一行,之后会保持登陆')
# 调用登录函数,只需要登陆一次,就不需要再次登陆了
login()
# 定义查询函数
def query():
# 使用Playwright同步API
with sync_playwright() as p:
# 启动Firefox浏览器,并创建一个持久的上下文环境
browser = p.firefox.launch_persistent_context(
'./gpts_firefox_dir', # 浏览器数据存储目录
headless=False, # 以有头模式运行,方便调试
slow_mo=500 # 每步操作之间延迟500毫秒,方便观察
)
# 获取第一个页面
page = browser.pages[0]
# 访问OpenAI的ChatGPT网页
page.goto('https://chat.openai.com/')
time.sleep(2) # 等待页面加载
# # 在手动关闭浏览器之前,保持浏览器打开状态
# input("浏览器已启动并登录,请手动操作完成后按回车键继续...")
# 在页面的文本区域输入问题
page.query_selector("#prompt-textarea").fill("告诉我,你的知识库截止日期是?")
# 点击发送按钮
page.wait_for_selector('button[data-testid="fruitjuice-send-button"]').click()
# time.sleep(10) # 等待响应
# 这个选择器需要从网页中一个个找
# 定义复制按钮的选择器
copy_button_selector = 'button[class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"]'
page.wait_for_selector(copy_button_selector)
# 获取所有符合选择器的复制按钮
copy_buttons = page.query_selector_all(copy_button_selector)
print(copy_buttons)
# 点击最后一个复制按钮(获取最新响应)
(copy_buttons[len(copy_buttons) - 3]).click()
time.sleep(1) # 等待复制操作完成
# 从剪贴板获取内容
clipboard_content = pyperclip.paste()
# 打印剪贴板内容
print(clipboard_content)
# 控制循环,询问用户是否继续等待
while 1:
str = input('等待中,是否继续等待?【问题】/【n】。\n\n请输入:') # 控制休眠时间
if str == 'n':
break
# 在页面的文本区域输入问题
page.query_selector("#prompt-textarea").fill(str)
# 点击发送按钮
page.wait_for_selector('button[data-testid="fruitjuice-send-button"]').click()
# time.sleep(10) # 等待响应
# 这个选择器需要从网页中一个个找
# 定义复制按钮的选择器
copy_button_selector = 'button[class="rounded-lg text-token-text-secondary hover:bg-token-main-surface-secondary"]'
num = len(page.query_selector_all(copy_button_selector))
# 等待GPT响应,直接出现新的复制按键
while 1:
copy_buttons = page.query_selector_all(copy_button_selector)
if len(copy_buttons) > num:
break
time.sleep(1) # 等待复制操作完成
# 点击最后一个复制按钮(获取最新响应)
(copy_buttons[len(copy_buttons) - 3]).click()
time.sleep(1) # 等待复制操作完成
# 从剪贴板获取内容
clipboard_content = pyperclip.paste()
# 打印剪贴板内容
print(clipboard_content)
# 关闭页面和浏览器
page.close()
browser.close()
# 调用查询函数
query()
调用结果: