news 2026/5/16 17:54:09

基于Puppeteer的ChatGPT对话批量删除工具:原理、配置与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Puppeteer的ChatGPT对话批量删除工具:原理、配置与实战

1. 项目概述:为什么我们需要批量删除ChatGPT对话?

如果你和我一样,深度使用ChatGPT进行过各种探索——从代码调试、方案设计到日常的头脑风暴,那么你的对话列表很可能已经堆积如山。成百上千条对话记录,不仅让界面变得杂乱,更重要的是,它们可能包含了大量过时的、无用的,甚至是包含敏感信息的测试性对话。手动一条条删除?那简直是场噩梦。就在我为此感到头疼时,我发现了GitHub上一个名为qcrao/bulk-delete-chatGPT的项目。这个工具直击痛点,它允许你通过一个简单的脚本,批量、自动地清理你的ChatGPT对话历史。

这个项目本质上是一个浏览器自动化脚本。它没有复杂的界面,也不需要你安装额外的软件,核心思路是利用Puppeteer(一个Node.js库,用于控制无头Chrome或Chromium)来模拟用户在ChatGPT网页端的操作,遍历并删除你的对话。对于任何有大量对话需要清理,或者希望定期维护自己数字工作空间整洁度的用户来说,这无疑是一个“神器”。它解决的不仅仅是一个操作效率问题,更是一种数据管理和隐私保护的主动行为。想象一下,在提交工作电脑前,或者只是想给新一年的对话列表一个清爽的开始,这个工具能帮你节省数小时枯燥的点击和确认时间。

2. 核心思路与技术选型解析

2.1 为什么选择Puppeteer而非其他方案?

当我们决定要自动化操作一个网页时,市面上有几种主流方案:Selenium、Playwright、Cypress,以及本项目采用的Puppeteer。qcrao/bulk-delete-chatGPT选择Puppeteer,背后有非常务实的考量。

首先,目标明确且单一。这个工具的唯一任务就是在chat.openai.com这个特定网站上执行删除操作。它不需要跨浏览器测试(Selenium的强项),也不需要复杂的录制回放或端到端测试框架(Cypress/Playwright的特色)。Puppeteer作为Chrome官方团队维护的工具,对Chrome/Chromium浏览器的控制力是最直接、最底层的,API也相对简洁。对于这样一个“单点爆破”式的任务,轻量、专注的Puppeteer是更合适的选择。

其次,开发与部署的简便性。Puppeteer基于Node.js,对于广大前端和Node.js开发者来说几乎没有学习门槛。脚本本身可以作为一个独立的Node.js项目运行,依赖清晰。相比于需要启动独立Driver的Selenium,Puppeteer的“开箱即用”体验更好,尤其是在个人开发环境中。

最后,性能与可靠性。Puppeteer直接启动一个无头浏览器实例,所有操作都在内存中完成,速度很快。对于批量删除这种需要反复等待页面元素加载、点击、确认的操作,一个稳定的浏览器环境至关重要。Puppeteer在这方面经过了大量生产环境的检验。

注意:选择Puppeteer也意味着工具主要适配Chrome/Chromium内核的浏览器。虽然理论上可以通过配置连接到其他浏览器,但项目的默认和最佳实践路径就是Chromium。如果你的主要工作环境是Firefox或Safari,可能需要额外调整。

2.2 项目架构与工作流设计

这个项目的架构非常清晰,遵循了“配置-执行-清理”的简单工作流。我们来看一下它的核心逻辑是如何运转的。

  1. 初始化与登录:脚本启动一个Puppeteer控制的浏览器实例,导航到ChatGPT登录页。这里的关键是处理用户认证。项目通常不会(也不应该)硬编码你的账号密码。更常见的做法是依赖你已经登录的浏览器会话(通过加载用户数据目录),或者在首次运行时提示你手动登录一次,然后由Puppeteer保存登录后的Cookies供后续使用。这平衡了安全性与便利性。

  2. 遍历对话列表:登录成功后,脚本需要定位到对话历史侧边栏。这里的设计难点在于处理动态加载。ChatGPT的对话列表是懒加载的,不会一次性全部呈现。脚本需要模拟用户不断向下滚动侧边栏的行为,触发更多对话加载,直到没有新对话出现为止。这通常通过一个循环实现,在循环中判断滚动前后对话列表的HTML高度或元素数量是否发生变化。

  3. 识别与选择目标对话:获取到完整的对话列表后,脚本需要根据用户的配置来筛选哪些对话需要删除。配置可能很简单,比如“删除全部”,也可能更精细,例如“删除标题包含‘test’的对话”或“删除XX日期之前的对话”。脚本会遍历每个对话元素,提取其标题、时间戳等信息,与配置规则进行匹配。

  4. 执行批量删除操作:对于匹配到的对话,脚本会执行点击操作(通常是点击对话项旁边的菜单按钮,然后选择“删除”)。这里最大的挑战是处理异步交互和确认弹窗。点击删除后,ChatGPT通常会弹出一个确认对话框。脚本必须等待这个对话框出现,然后点击确认按钮。这个过程中需要有足够的等待时间(page.waitForSelector)和错误重试机制,以确保网络延迟或页面渲染不会导致操作失败。

  5. 状态记录与错误恢复:一个健壮的批量操作工具必须考虑中断恢复。想象一下,在删除到第500条对话时脚本因网络问题崩溃了。如果没有记录,你无从得知哪些已经删除,哪些还没有。因此,一个完善的实现应该将已成功删除的对话ID或标题记录到一个本地文件中。这样,当脚本再次运行时,可以先读取这个记录,跳过已经处理过的项目,实现“断点续传”。

这个工作流设计体现了对实际使用场景的深刻理解,不仅仅是功能的堆砌,更是对用户体验和操作可靠性的周全考虑。

3. 环境准备与工具配置实操

3.1 基础运行环境搭建

要运行这个项目,你首先需要一个Node.js环境。如果你还没有安装,建议直接访问Node.js官网下载最新的LTS(长期支持)版本进行安装。安装完成后,打开终端(Windows上是CMD或PowerShell,macOS/Linux上是Terminal),通过以下命令验证安装是否成功:

node --version npm --version

接下来,你需要获取项目的源代码。通常,你需要将项目克隆(Clone)到本地:

git clone https://github.com/qcrao/bulk-delete-chatGPT.git cd bulk-delete-chatGPT

进入项目目录后,运行npm install来安装所有依赖包。核心依赖就是puppeteer。这个过程会自动下载一个Chromium浏览器,所以第一次运行可能会花费一些时间,请保持网络通畅。

3.2 关键配置文件解析与定制

项目根目录下通常会有一个配置文件,例如config.jsonconfig.js。这是工具的大脑,你需要根据个人需求进行调整。让我们详细拆解一下常见的配置项:

{ "headless": false, "slowMo": 50, "userDataDir": "./user_data", "deleteAll": true, "filters": { "contains": ["test", "调试"], "excludes": ["重要方案", "终版"], "beforeDate": "2023-12-31" }, "maxDeletions": 1000 }
  • headless: 布尔值。设置为false时,你会看到一个真实的浏览器窗口在运行,方便你观察脚本执行过程,进行调试。设置为true时,浏览器在后台无界面运行,速度更快,适合自动化任务。建议初次使用时设为false,确认一切工作正常后再改为true

  • slowMo: 数字(毫秒)。它会在每个Puppeteer操作(如点击、输入)后增加一个延迟。这对于调试至关重要!当headless: false时,设置一个如50-100毫秒的slowMo可以让你清楚地看到脚本每一步在做什么,而不是一闪而过。在生产运行时可以设为0或一个很小的值。

  • userDataDir: 字符串路径。这是保存浏览器用户数据(包括Cookies、本地存储)的目录。通过指定一个固定的目录,Puppeteer可以复用你的登录状态。这意味着你只需要在第一次运行脚本时手动登录一次ChatGPT,之后的运行都会自动保持登录,无需重复输入密码。务必妥善保管这个目录,它包含了你的会话信息。

  • deleteAllfilters: 这两个配置决定了删除的范围。如果deleteAll设为true,则会忽略filters,删除所有对话。如果设为false,则会根据filters的规则进行筛选删除。filters可以非常灵活:

    • contains: 数组。删除对话标题中包含任意指定关键词的对话。
    • excludes: 数组。即使匹配了contains,但如果标题也包含excludes中的关键词,则跳过不删。这用于保护一些重要的对话。
    • beforeDate: 字符串。删除指定日期之前创建的所有对话。日期格式需与ChatGPT页面显示的格式或脚本解析的格式一致。
  • maxDeletions: 数字。安全限制,单次运行最多删除的对话数量。防止因配置错误导致“误杀”所有对话。建议首次使用时设置一个较小的数字(如10)进行测试。

实操心得:在第一次运行前,强烈建议你将deleteAll设为false,并设置一个非常明确的、只匹配少数几条测试对话的filters,同时将maxDeletions设为一个很小的数字(比如3-5)。运行一次,观察它是否准确地识别并删除了你期望的那几条对话。这是验证配置和脚本逻辑是否正确的黄金步骤,能有效避免灾难性错误。

4. 核心脚本逻辑深度剖析

4.1 页面导航与登录状态管理

脚本的入口通常是启动浏览器并导航到ChatGPT。核心代码如下:

const browser = await puppeteer.launch({ headless: config.headless, slowMo: config.slowMo, userDataDir: config.userDataDir }); const page = await browser.newPage(); await page.goto('https://chat.openai.com', { waitUntil: 'networkidle2' });

waitUntil: 'networkidle2'这个参数非常关键,它告诉Puppeteer等待到页面网络活动很少(最多2个网络连接)时才认为导航完成,这比默认的load事件更能确保页面(特别是单页应用)完全加载就绪。

接下来是登录状态判断。一个稳健的做法是检查页面是否存在代表已登录状态的元素,例如用户头像按钮或“New chat”按钮:

async function isLoggedIn(page) { try { await page.waitForSelector('button[aria-label*="Account"]', { timeout: 5000 }); return true; } catch (error) { return false; } }

如果未检测到登录状态,脚本可以抛出错误并提示用户手动登录,或者更友好地,在headless: false模式下暂停,等待用户手动完成登录后再继续执行。由于我们配置了userDataDir,在第一次手动登录成功后,后续运行这个检查通常会直接通过。

4.2 对话列表的动态加载与捕获

这是整个脚本中最精巧的部分。ChatGPT的对话侧边栏不会一次性加载所有项目。我们需要模拟滚动来触发加载。思路是:获取侧边栏容器元素,然后循环执行“滚动到底部 -> 等待可能的新内容加载 -> 判断是否已加载完毕”。

async function loadAllConversations(page) { const sidebarSelector = 'nav[aria-label*="Chat history"]'; // 侧边栏选择器 let previousHeight = 0; let currentHeight = 0; let noChangeCount = 0; do { previousHeight = await page.evaluate((sel) => { const el = document.querySelector(sel); return el ? el.scrollHeight : 0; }, sidebarSelector); // 滚动到底部 await page.evaluate((sel) => { const el = document.querySelector(sel); if (el) el.scrollTop = el.scrollHeight; }, sidebarSelector); // 等待可能的异步加载 await page.waitForTimeout(1000); currentHeight = await page.evaluate((sel) => { const el = document.querySelector(sel); return el ? el.scrollHeight : 0; }, sidebarSelector); // 如果滚动高度没有变化,可能是加载完了,也可能是网络慢。我们计数。 if (currentHeight === previousHeight) { noChangeCount++; } else { noChangeCount = 0; // 高度变化了,重置计数器 } } while (noChangeCount < 3); // 连续3次滚动高度无变化,认为已加载完毕 // 现在,获取所有的对话列表项 const conversationItems = await page.$$(`${sidebarSelector} a`); return conversationItems; }

这段代码的核心在于page.evaluate(),它允许我们在浏览器页面上下文中执行JavaScript代码。我们通过比较滚动容器的scrollHeight在滚动前后的变化来判断是否有新内容加载。设置一个计数器(如3次)是为了应对网络延迟,避免在内容还未加载完时就误判为结束。

4.3 精准筛选与删除逻辑实现

获取到所有对话项的元素句柄后,我们需要提取每个对话的信息,并与配置进行匹配。

for (const item of conversationItems) { // 提取标题和可能的日期 const title = await item.evaluate(el => el.textContent.trim()); // 注意:ChatGPT的日期可能藏在子元素里,需要更精细的解析 // const dateStr = await item.evaluate(el => el.querySelector('.date-class')?.textContent); // 应用过滤规则 let shouldDelete = config.deleteAll; if (!shouldDelete && config.filters) { const { contains, excludes, beforeDate } = config.filters; const matchesContains = contains ? contains.some(keyword => title.includes(keyword)) : false; const matchesExcludes = excludes ? excludes.some(keyword => title.includes(keyword)) : false; const isBeforeDate = beforeDate ? (/* 解析并比较日期逻辑 */) : false; shouldDelete = (matchesContains || isBeforeDate) && !matchesExcludes; } if (shouldDelete) { // 找到该对话项的菜单按钮并点击 const menuButton = await item.$('button[aria-label*="更多"]'); // 按钮选择器需根据实际页面调整 if (menuButton) { await menuButton.click(); await page.waitForTimeout(300); // 等待菜单弹出 // 在弹出菜单中点击“删除”选项 const deleteOption = await page.$('div[role="menuitem"]:has-text("Delete")'); if (deleteOption) { await deleteOption.click(); // 等待确认弹窗出现并点击确认 await page.waitForSelector('button:has-text("Confirm")', { visible: true }); await page.click('button:has-text("Confirm")'); // 等待删除操作完成,可以等待对话项消失或一个短暂的延迟 await page.waitForTimeout(500); deletionCount++; // 记录已删除的对话 fs.appendFileSync('./deleted.log', `${new Date().toISOString()} - ${title}\n`); } } } if (deletionCount >= config.maxDeletions) { console.log(`已达到最大删除数量限制:${config.maxDeletions}`); break; } }

这里有几个至关重要的细节:

  1. 选择器的稳定性:ChatGPT的网页结构可能会更新,导致sidebarSelector、菜单按钮、删除选项的选择器失效。脚本需要健壮的选择器,通常优先使用aria-label等属性,它们比CSS类名更稳定。在运行前,最好手动检查一下目标元素的实际属性。
  2. 等待与超时:在点击菜单按钮、等待弹窗、点击确认按钮之间,必须插入适当的等待(waitForTimeoutwaitForSelector)。网络速度和页面渲染速度会影响这些元素的出现时机。slowMo配置在这里也能提供视觉缓冲,帮助脚本稳定运行。
  3. 错误处理与日志:每个删除操作都应该有try-catch包裹,防止单个对话删除失败导致整个脚本中断。同时,将成功删除的对话标题记录到日志文件(如deleted.log)中,是后续审计和恢复(如果需要的话)的唯一依据。

5. 实战演练:从零运行到成功清理

5.1 首次运行与调试

假设你已经完成了环境配置和项目克隆,我们来进行第一次实战。

  1. 备份你的对话(心理上):虽然我们可以通过配置限制,但面对自动化工具,保持敬畏是好的习惯。你可以手动将一些非常重要的对话通过ChatGPT的“分享”功能生成链接保存,或者简单截个图。

  2. 配置安全测试:打开config.json,进行如下设置:

    { "headless": false, "slowMo": 100, "userDataDir": "./user_data", "deleteAll": false, "filters": { "contains": ["debug_test"], "excludes": [], "beforeDate": null }, "maxDeletions": 2 }

    这个配置意味着:显示浏览器窗口,操作慢速可见,使用独立的用户数据目录,不删除全部,只删除标题包含“debug_test”的对话,最多删2条。请确保你确实有1-2条标题包含此关键词的测试对话

  3. 运行脚本:在项目根目录下,运行node index.js(或主脚本文件的其他名称)。一个浏览器窗口会打开,并自动导航到ChatGPT。如果是第一次使用指定的userDataDir,你需要手动完成登录。登录成功后,脚本会开始工作。你会看到它自动滚动侧边栏,然后定位到你那几条测试对话,点击菜单,选择删除,确认。整个过程在你眼前慢速播放。

  4. 观察与验证:密切观察脚本的行为是否与预期一致。它是否准确找到了目标对话?点击的位置对吗?确认弹窗是否成功处理?删除后,侧边栏的对话是否消失了?打开deleted.log文件,查看记录是否正确。

5.2 执行大规模清理任务

在确认测试无误后,你可以开始真正的清理工作了。

  1. 调整配置:根据你的清理目标修改config.json

    • 如果你想清理2023年以前的所有旧对话,可以将beforeDate设为"2023-12-31",并将deleteAll设为false
    • 如果你想删除所有标题里带“test”、“临时”、“草稿”的对话,但保留带“终版”、“归档”的,可以这样配置:
      "deleteAll": false, "filters": { "contains": ["test", "临时", "草稿"], "excludes": ["终版", "归档"], "beforeDate": null }
    • 如果你决心清理除少数几个重要对话外的所有内容,最安全的方法是使用“排除法”:将deleteAll设为true,但同时设置excludes列表,里面放上你需要保留的对话的关键词。但请注意,deleteAll: true会覆盖filters的包含规则,通常只与excludes结合使用,且务必再三确认excludes关键词能准确匹配到你想保留的对话。
    • headless改为true以加速运行。
    • slowMo调整为10-20,在保证稳定性的前提下提高速度。
    • 根据对话量,合理设置maxDeletions,可以设为500或1000,防止单次运行时间过长。
  2. 再次进行小范围测试:即使配置看起来没问题,也建议先将maxDeletions设为一个较小的数(如5),运行一次,检查日志,确认筛选逻辑完全符合你的预期。

  3. 正式运行:调整好最终配置后,运行脚本。由于是无头模式,你只会在终端看到日志输出。可以去喝杯咖啡,让它慢慢运行。删除成百上千条对话可能需要一段时间,这取决于你的网络速度和ChatGPT服务器的响应。

  4. 监控与处理中断:脚本运行过程中,可能会因为网络波动、页面结构微调等原因抛出异常。一个健壮的脚本应该能捕获这些异常,记录错误,并尝试继续后续任务,或者优雅退出。你需要关注终端的错误信息。如果脚本中途停止,检查deleted.log,看看已经删除了多少。你可以根据日志,调整filtersexcludes,然后重新运行脚本,它会跳过已记录的项目(如果脚本实现了断点续传逻辑)或从上次中断的地方继续(取决于脚本设计)。

6. 常见问题排查与进阶技巧

6.1 运行时报错与解决方案

在实际操作中,你可能会遇到以下典型问题:

问题现象可能原因解决方案
Error: Failed to launch the browser process!Puppeteer无法启动Chromium。可能是缺少系统依赖,或安装不完整。1. 在项目目录运行npm install重装依赖。
2. 对于Linux系统,安装缺失的库:sudo apt-get install -y gconf-service libgbm-dev libasound2...(具体依赖请查Puppeteer文档)。
3. 尝试设置环境变量PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1,然后手动安装系统Chromium并指定可执行路径。
页面一直停留在登录页,不跳转1. 登录状态判断逻辑有误。
2. ChatGPT页面改版,选择器失效。
3. 需要处理人机验证(如Cloudflare Turnstile)。
1. 将headless设为false,观察页面状态,手动判断是否已登录。
2. 更新脚本中的选择器,使用浏览器开发者工具检查最新页面结构。
3. 人机验证是自动化脚本的“天敌”。如果遇到,可能需要更复杂的处理(如使用带验证码破解服务的Puppeteer扩展),或者更简单——在headless: false模式下手动完成验证,然后让脚本继续。之后利用userDataDir保持会话。
脚本找不到对话列表或按钮ChatGPT前端代码更新,HTML结构或CSS类名/属性发生变化。这是最常见的问题。你需要:
1. 用浏览器打开ChatGPT,进入对话列表页。
2. 按F12打开开发者工具,使用元素选择器(箭头图标)点击侧边栏、对话项、菜单按钮等。
3. 在Elements面板中,找到该元素对应的HTML标签,寻找一个唯一且稳定的属性作为选择器。优先顺序:>删除到一半脚本卡住或报超时错误
网络延迟、页面响应慢,或某个对话的删除确认弹窗未按预期出现。1.增加等待时间:适当增加waitForTimeoutwaitForSelector的超时参数。
2.引入重试机制:在删除单个对话的代码块外加try-catch,如果失败,记录错误并继续下一个,而不是中断整个流程。
3.使用slowMo:即使在无头模式下,设置一个小的slowMo(如30ms)也能让操作更稳定,给页面足够的反应时间。
deleted.log文件记录混乱或重复脚本没有实现“断点续传”逻辑,每次运行都从头开始,可能重复记录。修改脚本逻辑。在开始遍历前,先读取deleted.log文件,将已删除的标题加载到一个Set(集合)中。在判断是否删除某个对话前,先检查其标题是否已存在于这个Set中,如果存在则直接跳过。

6.2 性能优化与安全建议

当需要处理海量对话(比如数千条)时,效率就变得重要了。

  1. 减少不必要的等待:在确认脚本稳定后,逐步降低slowMo直至为0。将waitForTimeout的固定延迟,尽可能替换为waitForSelectorwaitForFunction,后者会在条件满足时立即继续,而不是傻等固定时间。
  2. 并行处理的考量:理论上可以打开多个页面(browser.newPage())并行删除。但强烈不建议这样做。首先,这违反了ChatGPT的使用条款,可能导致账号被限制。其次,并行操作会极大增加页面状态管理的复杂性,容易出错。对于个人清理任务,顺序执行是更安全、更可靠的选择。
  3. 会话安全userDataDir目录包含了你的浏览器Cookies,这意味着任何能访问这个目录的人都有可能获取你的ChatGPT会话。务必不要将此目录上传到Git等公开版本控制系统。更好的做法是在.gitignore文件中添加user_data/deleted.log。在清理任务完成后,可以考虑删除这个目录。
  4. 遵守服务条款:使用自动化工具与网站交互,始终存在风险。ChatGPT的用户条款可能禁止未经授权的自动化访问。此工具应仅用于个人、合理的批量管理需求,切勿用于恶意爬取、骚扰服务或任何可能对OpenAI服务器造成不当负载的行为。控制删除速度,避免在短时间内发起大量请求。

6.3 功能扩展思路

基础功能之上,你可以根据自己的需求对这个脚本进行扩展:

  • 基于时间的智能清理:不仅支持“在某日期之前”,还可以实现“保留最近N天的对话,自动清理更早的”。
  • 对话内容分析后再删除:通过Puppeteer打开对话,获取部分消息内容进行分析(例如,使用简单的关键词匹配),根据对话内容本身(而不仅仅是标题)来决定是否删除。这需要更复杂的页面导航和内容提取逻辑。
  • 生成清理报告:除了记录已删除的,还可以生成一个更详细的报告,包括跳过了哪些(因匹配excludes规则)、总共扫描了多少条、清理前后对比等。
  • 图形化界面(GUI):使用Electron或简单的Web界面(配合Express.js)将配置和运行包装起来,让不熟悉命令行的用户也能使用。

这个项目提供了一个强大而简洁的起点。理解其核心原理后,你完全可以将其改造成适应自己工作流的个性化数据管理工具。记住,自动化是为了提升效率,但谨慎和备份永远是第一位。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 17:51:32

硬核!字节前端专家耗时一周整理出大厂常考前端场景题合集

在前端开发中&#xff0c;项目场景题&#xff08;即结合实际业务场景的题目或问题&#xff09;具有极高的重要性&#xff0c;主要体现在以下几个方面&#xff1a; 1. 贴近真实开发需求 前端开发不仅仅是实现静态页面或简单交互&#xff0c;而是需要解决复杂的业务逻辑&…

作者头像 李华
网站建设 2026/5/16 17:50:04

Smithbox:跨平台魂系游戏模组开发框架的深度解析

Smithbox&#xff1a;跨平台魂系游戏模组开发框架的深度解析 【免费下载链接】Smithbox Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demons Souls. 项目地址: https://gitcode.com/gh_mi…

作者头像 李华
网站建设 2026/5/16 17:50:03

MAA智能辅助工具:解放双手的明日方舟全自动长草神器

MAA智能辅助工具&#xff1a;解放双手的明日方舟全自动长草神器 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitco…

作者头像 李华
网站建设 2026/5/16 17:48:03

Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型指南 对于习惯使用 OpenAI 官方 Python SDK 的开发者来说&#xff0c;…

作者头像 李华
网站建设 2026/5/16 17:47:24

使用 Python 快速将现有应用接入 Taotoken 的多模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Python 快速将现有应用接入 Taotoken 的多模型服务 如果你已经在使用 OpenAI 官方的 Python SDK 进行开发&#xff0c;那么将…

作者头像 李华
网站建设 2026/5/16 17:47:07

智能无人叉车选型指南:底层控制系统与生态平台深度解析

在现代工厂的物流自动化升级中&#xff0c;智能无人叉车因为能够解决重载搬运、高位堆垛和跨楼层对接等复杂任务&#xff0c;正逐渐取代传统的人工叉车。然而&#xff0c;很多企业在立项采购时往往陷入迷茫。面对市面上琳琅满目的供应商&#xff0c;终端厂长和项目负责人最关心…

作者头像 李华