其他
Open AI!50行代码实现GPTs
# 第6期 | 打开新世界大门,50 行 Python 代码调用自己在 ChatGPT 创建的私有 GPTs
2.1 准备工作
一个附带 Plus 会员的 ChatGPT 帐号; 本地电脑已经安装了 Python 3.7 或以上的版本; 一个可以访问 ChatGPT 的网络。有人可能说:“访问 ChatGPT 需要梯子!” 这不是问题,购买一台腾讯云美区云主机,选择 Windows 系统,在上面进行项目操作即可,不仅网络通,速度还是杠杠的。
2.2 安装类库
pip install pyperclip pip install playwright && playwright install
2.3 持久化登录
cookies = context.cookies()
print(page.title())
f = open('cookies.json', 'w')
json.dump(cookies, f)
读取 cookies 以避免重复登录的代码是这样的:
def loadCookies(cookief):
cookiefile = open(cookief, 'r')
cookie_list = json.load(cookiefile) # json读取cookies
cookiefile.close()
return cookie_list
...
context = browser.new_context()
cookiefiles = ['cookies.json']
for cookiefile in cookiefiles:
context.add_cookies(loadCookies(cookiefile))
import time
import pyperclip
from playwright.sync_api import sync_playwright
def login():
with sync_playwright() as p:
context =p.firefox.launch_persistent_context(
'./gpts_firefox_dir',
headless=False,
slow_mo=500
)
page = context.pages[0]
page.goto('https://chat.openai.com/')
login()
前 3 行是类库引用。time 是内置的,不需要安装,可以直接引用。pyperclip 与 playwright 我们已经安装过了,可以直接引用,playwright.sync_api 是 playwright 的同步模块,使用同步模式,在编写网页机器人时可以让我们轻松许多。 第 5 行~第 13 行定义了函数login,这个函数我们主要是为了在本地持久化目录下缓存 cookies 信息的。第 7 行,firefox 代表使用Firefox浏览器组件,这个地方还可以选择 chromium 或 webkit,但我不建议选择 chromium,虽然它是谷歌开源的浏览器项目,但它早已被黑客们玩坏,开发网页机器人建议使用 firefox ,它能让你节省许多时间。 还是第 7 行,launch_persistent_context 代表从本地持久化目录启动浏览器。第 8 行,第一个参数 gpts_firefox_dir 便是我们先前创建的目录,在这里用上了。 第 9 行,headless 等于 False,我们才可以在运行时看到浏览器的 UI。如果想让浏览器组件在后台静默运行,将此处设置为 True 即可。测试阶段,最好设置为 True。不要问我为什么,如果你调试过网页智能机器人程序中的元素选择,就明白我在说什么了。 第 12 行,是取到浏览器的第一个打开的标签页。第 13 行,是打开一个网址。
2.4 调用 GPTs
...
def query():
with sync_playwright() as p:
browser =p.firefox.launch_persistent_context(
'./gpts_firefox_dir',
headless=False,
slow_mo=500
)
page = browser.pages[0]
# 这是私有的,要替换成你自己的GPTs URL
page.goto('https://chat.openai.com/g/g-OitD1zCwT-story-weaver')
time.sleep(2)
page.query_selector("#prompt-textarea").fill("告诉我,你的知识库截止日期是?")
page.wait_for_selector('button[data-testid="send-button"]').click()
time.sleep(10)
copy_button_selector = 'button.text-xs.dark\\:hover\\:text-gray-200'
copy_buttons = page.query_selector_all(copy_button_selector)
(copy_buttons[len(copy_buttons)-1]).click()
time.sleep(1)
clipboard_content = pyperclip.paste()
# 打印剪贴板内容
print(clipboard_content)
str = 'y'
while str == 'y':
str = input('等待中,是否继续等待?y/n。\n\n请输入:') # 控制休眠时间
page.close()
browser.close()
query()
第 4 行~第 8 行,前文已介绍,不做过多赘述。 第 11 行,打开自定义 GPTs 的网址,注意,示例里是我自己的网址,并且是私有的,正常是访问不到的。你需要在 ChatGPT 上先创建自己的 GPTs,然后将此处换成自己的地址。关于如何创建自己的 GPTs,看这里:
第 12 行,这里有一个 sleep 操作,为什么要执行这个操作呢?我们引用的是 playwright 同步模块,第 11 行代码执行完,代表网址已经打开了,为什么还要 sleep?网址成功打开并不代表页面元素全部加载完成,在开发网页智能机器人时尤其要注意这一点,否则,你可能找不到自己要查询的页面元素,因为你要的元素还在内存里,还没有渲染出来。举个例子,就好比今天你去教堂结婚,但是你的新娘还未出生。 第 13 行,query_selector 用于选择页面上的一个元素,它的参数是 CSS 选择器,参数要求与 document.querySelector 相似。fill 是填写文本,写的是我们想问的问题,这里为了使程序简单,我直接将问题带过,事实上这个问题可以来自于数据库,也可以来自于用户输入,它的来源是灵活可控的。 第 14 行,wait_for_selector 也是选择元素,它与 query_selector 不同的是,它会等待网页出现这个元素————如果这个元素暂时没有的话。wait_for_selector 相比 query_selector 是有优势的,使用它不用显式等待,你看我在这行代码前面就没有使用 sleep。那么为什么在第 12 行使用呢,为什么第 13 行不使用 wait_for_selector 呢?主要是为了演示这两个方法之间的区别。 第 14 行,是单击了页面中的“发送”按钮,ChatGPT 背后的大语言模型开始工作了。第 15 行,这里要 sleep 一下,因为 ChatGPT 的反应需要时间。 第 17 行~第 19 行,这里是为了查询页面上出现的“拷贝”按钮,并单击它。由于多次互动后,这类按钮会出现多个,所以取最后一个。 第 21 行,这是从剪切板获取数据,我们提前安装的 pyperclip 开始发挥作用。
page.query_selector("#prompt-textarea").fill("告诉我,你的知识库截止日期是?")
page.wait_for_selector('button[data-testid="send-button"]').click()
copy_button_selector = 'button.text-xs.dark\\:hover\\:text-gray-200'
作者简介
关注并星标腾讯云开发者
每周4看鹅厂程序员测评新技术