DeepSeek Chat 自动化交互技术分析


本文将对 DeepSeek Chat 自动化交互脚本进行技术分析,包括代码结构、实现原理以及关键技术点。该脚本使用 Selenium 实现了对 DeepSeek Chat 平台的自动化登录和问答功能。

1. 代码结构概览

该脚本主要由以下几个部分组成:

  • 环境准备与依赖导入:导入必要的库和模块,设置基本环境
  • WebDriver 配置:设置和配置 Chrome WebDriver
  • 登录功能:实现 DeepSeek Chat 的自动化登录
  • 问答功能:向 DeepSeek Chat 提问并等待回答

5. 辅助功能:截图、问题加载、随机问题选择等

  • 主函数:处理命令行参数并协调整个流程

2. 核心功能实现原理

2.1 WebDriver 配置 (setup_driver 函数)

def setup_driver():"""Set up and return a configured Chrome WebDriver."""chrome_options = Options()# 配置Chrome选项chrome_options.add_argument("--start-maximized")chrome_options.add_argument("--ignore-certificate-errors")# ... 其他配置选项 ...# 使用本地ChromeDriverchromedriver_path = os.path.join(os.getcwd(), "chromedriver.exe")service = Service(executable_path=chromedriver_path)driver = webdriver.Chrome(service=service, options=chrome_options)# 设置页面加载超时driver.set_page_load_timeout(60)return driver

实现原理:

  • 创建并配置 Chrome WebDriver,设置各种参数以提高稳定性和兼容性
  • 使用本地的 ChromeDriver 而非自动下载,确保版本匹配
  • 设置页面加载超时时间,防止长时间等待

2.2 登录功能 (login_to_deepseek 函数)

def login_to_deepseek(driver, phone, password):"""Log in to DeepSeek Chat using phone number and password."""# 尝试加载网页driver.get("https://chat.deepseek.com/")# 查找并点击登录按钮login_button = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Log in') or contains(text(), '登录')]")))login_button.click()# 切换到密码登录password_tab = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[2]/div/div/div[2]/div[2]")))password_tab.click()# 输入手机号和密码phone_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div/input")))phone_input.send_keys(phone)# ... 输入密码、勾选协议、点击登录按钮 ...# 等待登录完成WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'chat-container') or //textarea[contains(@placeholder, 'Send a message')]]")))return True

实现原理:

  • 使用 WebDriverWait 和 expected_conditions 等待页面元素加载
  • 采用主要/备用方法策略,当精确 XPath 失败时尝试备用定位方法
  • 在关键步骤进行截图,便于调试和问题排查
  • 使用异常处理确保脚本不会因单点故障而完全失败

2.3 问答功能 (ask_question 函数)

def ask_question(driver, question):"""Ask a question in the chat interface."""# 定位并输入问题input_area = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//textarea[contains(@placeholder, 'Send a message') or contains(@placeholder, '发送消息')]")))input_area.send_keys(question)# 勾选"深度思考"选项deep_thinking_option = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div[2]/div[1]")))deep_thinking_option.click()# 勾选"联网搜索"选项web_search_option = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div[2]/div[2]")))web_search_option.click()# 点击提交按钮submit_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div[2]/div[3]/div[2]")))submit_button.click()# 等待回答完成WebDriverWait(driver, 600).until_not(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'loading') or contains(@class, 'typing')]")))return True

实现原理:

  • 定位输入框并输入问题
  • 勾选特定选项("深度思考"和"联网搜索")
  • 提交问题并等待回答完成
  • 通过等待加载指示器消失来判断回答是否完成
  • 同样采用主要/备用方法策略,提高脚本的鲁棒性

2.4 辅助功能

截图功能 (take_screenshot 函数)
def take_screenshot(driver, output_dir="screenshots", filename=None):"""Take a screenshot of the current page."""if not os.path.exists(output_dir):os.makedirs(output_dir)if filename is None:timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = f"deepseek_chat_{timestamp}.png"filepath = os.path.join(output_dir, filename)driver.save_screenshot(filepath)return filepath

实现原理:

  • 创建截图目录(如果不存在)
  • 生成带时间戳的文件名(如果未提供)
  • 使用 WebDriver 的 save_screenshot 方法保存当前页面截图
问题加载功能 (load_questions_from_file 和 get_random_question 函数)
def load_questions_from_file(file_path):"""从文件加载问题列表"""with open(file_path, 'r', encoding='utf-8') as f:questions = [line.strip() for line in f if line.strip()]return questionsdef get_random_question(questions_file):"""从问题文件中随机选择一个问题"""questions = load_questions_from_file(questions_file)if not questions:return Nonereturn random.choice(questions)

实现原理:

  • 从文本文件中读取问题列表,每行一个问题
  • 提供随机选择问题的功能,增加交互的多样性

3. 主函数流程

def main():# 解析命令行参数parser = argparse.ArgumentParser(description="Automate DeepSeek Chat interactions")# ... 参数定义 ...args = parser.parse_args()# 获取凭据phone = os.getenv("DEEPSEEK_PHONE")password = os.getenv("DEEPSEEK_PASSWORD")# 获取问题列表questions = []# ... 从不同来源获取问题 ...# 设置WebDriverdriver = setup_driver()try:# 登录if login_to_deepseek(driver, phone, password):# 处理每个问题for i, question in enumerate(questions):# 尝试多次提问,直到成功或达到最大尝试次数for attempt in range(1, args.max_retries + 1):if ask_question(driver, question):break# 等待一段时间再问下一个问题if i < len(questions) - 1:time.sleep(args.wait_time)finally:# 关闭浏览器driver.quit()

实现原理:

  • 解析命令行参数,支持多种问题输入方式(单个问题、多个问题、问题文件、随机问题)
  • 从环境变量获取登录凭据
  • 设置 WebDriver 并执行登录
  • 循环处理每个问题,支持失败重试机制
  • 确保无论执行结果如何,都会正确关闭浏览器

4. 技术亮点与挑战

4.1 鲁棒性设计

脚本采用了多层次的鲁棒性设计:

  • 主要/备用元素定位策略:当精确 XPath 失败时,尝试使用备用方法(如文本内容、相对位置等)
  • 全面的异常处理:捕获并记录所有可能的异常,防止脚本崩溃

3. 重试机制:对关键操作(如提问)实现了重试机制

  • 详细的日志记录:记录每一步操作和可能的错误
  • 截图功能:在关键步骤保存截图,便于调试和问题排查

4.2 元素定位策略

脚本使用了多种元素定位策略:

  • 精确 XPath:首选使用精确的 XPath 路径
  • 文本内容匹配:使用包含特定文本的元素定位
  • 属性匹配:通过元素属性(如 placeholder、type 等)定位
  • 相对位置定位:通过元素之间的相对位置关系定位

4.3 等待策略

脚本使用了 Selenium 的显式等待机制:

  • WebDriverWait:等待特定条件满足后再执行下一步
  • expected_conditions:定义等待条件(如元素可点击、元素存在等)
  • 自定义超时时间:根据不同操作设置不同的超时时间

5. 可能的改进方向

  • 模块化重构:将功能进一步模块化,提高代码复用性
  • 配置文件支持:将硬编码的 XPath 和其他配置移至配置文件
  • 更智能的等待机制:实现更智能的等待机制,如基于页面状态的动态等待
  • 结果解析与保存:添加解析和保存 DeepSeek 回答的功能
  • 代理支持:添加代理支持,解决可能的 IP 限制问题
  • 多账户支持:支持多账户轮换使用,避免单一账户使用频率过高
  • 更完善的错误恢复:实现更完善的错误恢复机制,如页面刷新、重新登录等

6. 总结

该脚本通过 Selenium WebDriver 实现了对 DeepSeek Chat 平台的自动化交互,包括登录和问答功能。脚本设计考虑了鲁棒性、可靠性和易用性,采用了多种元素定位策略和异常处理机制,确保在各种情况下都能正常工作。

通过命令行参数,脚本支持多种问题输入方式,可以满足不同的自动化需求。同时,详细的日志记录和截图功能也便于调试和问题排查。

这种自动化交互脚本在测试、数据收集、批量查询等场景中有广泛的应用价值,也为其他类似平台的自动化交互提供了参考实现。

实现源码地址:https://github.com/jerry-rd/deepseek-automation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

128. Longest Consecutive Sequence

如果n-1存在于数组中&#xff0c;则以n开头的连续序列可以忽略掉&#xff0c;因为以n-1开头的连续序列的长度肯定至少比以n开头的连续序列长1个元素。这是本题的关键。然后利用哈希表查询元素是否在数组中。 class Solution { public:int longestConsecutive(vector<int>…

《SQL编程思想》中的 MySQL 建表语句和测试数据

《SQL编程思想》中的 MySQL 建表语句 建表语句 -- 创建 4 个示例表和索引 CREATE TABLE department( dept_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 部门编号&#xff0c;自增主键, dept_name VARCHAR(50) NOT NULL COMMENT 部门名称) ENGINEInnoDB COMM…

基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的学科竞赛管理方式的缺点逐渐暴露&#xff0c;本次对过去的学科竞赛管理方式的缺点进行分析&#xff0c;采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种关于竞赛信息…

【redis】什么是持久化之 RDB

什么是持久化 MySQL 的事务&#xff0c;有四个比较核心的特性&#xff1a; 原子性一致性持久性>持久化&#xff08;说的一回事&#xff09; 把数据存储在硬盘上>持久把数据存在内存上>不持久重启进程/重启主机之后&#xff0c;数据是否还存在 隔离性 Redis 是一个内存…

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

游戏立项时期随笔记录(1)

模拟经营的项目还没有完全结束&#xff0c;这几天又有可能涉及到一个新项目。感想随笔记录一下&#xff0c;防止忘记。今天一天整理这个&#xff0c;搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期&#xff0c;核心目标是明确技术方向、评估可行性、搭建基础…

Channel-wise Knowledge Distillation for Dense Prediction论文阅读和

paper&#xff1a;https://arxiv.org/pdf/2011.13256.pdf code&#xff1a;https://github.com/open-mmlab/mmrazor 这篇paper主要是商汤开源的mmrazor中提及在detection有效果&#xff0c;我之前记录的几篇sota文章虽然在各自的paper中在detection领域都有提及有增益&#…

hide函数的使用方法

在编程中&#xff0c;我们常常需要控制元素的显示与隐藏。特别是在前端开发中&#xff0c;hide 函数是一个非常常见的操作&#xff0c;尤其是在 JavaScript 和 jQuery 中。它可以让你轻松地将元素从视图中隐藏&#xff0c;进而提升用户交互体验和页面的响应能力。本文将介绍如何…

【MySQL】基本操作 —— DML 与约束

目录 DML 基本介绍DML 常见操作添加数据 insert给指定字段添加数据给全部字段添加数据给指定字段批量添加数据给全部字段批量添加数据 修改数据 update删除数据 delete 约束基本概念约束操作主键约束添加单列主键添加多列主键&#xff08;联合主键&#xff09;修改表结构添加主…

nginx配置转发到另一个网站或另一台服务器的服务

需求背景 在一台服务器上安装了一个服务&#xff0c;不想使用ip:port方式&#xff0c;想使用域名打开这个服务的地址。 1. 配置转发 1.1 参数解释 listen&#xff1a;指定 Nginx 监听的端口。在上面的例子中&#xff0c;Nginx 监听 8888 端口。server_name&#xff1a;用于…

HarmonyOS三层架构实战

目录&#xff1a; 1、三层架构项目结构1.0、三层架构简介1.1、 common层&#xff08;主要放一些公共的资源等&#xff09;1.2、 features层&#xff08;主要模块定义的组件以及图片等静态资源&#xff09;1.3、 products层&#xff08;主要放主页面层和一些主要的资源&#xff…

macOS homebrew - 切换源

https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ 环境变量中 添加&#xff1a; export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn…

ETL中的实用功能以及数据集成方式

在企业数字化转型的进程中&#xff0c;数据集成扮演着至关重要的角色。它不仅是实现信息流动和系统协同的关键步骤&#xff0c;更是提升企业运营效率和决策能力的核心驱动力。ETL&#xff08;Extract&#xff0c;Transform&#xff0c;Load&#xff09;作为数据集成的重要工具&…

基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等

基于SpringbootTypst的PDF生成方案&#xff0c;适用于报告打印/标签打印/二维码打印等。 仅提供后端实现 Typst2pdf-for-report/label/QR code github 环境 JDK11linux/windows/mac 应用场景 适用于定制化的报告模板/标签/条码/二维码等信息的pdf生成方案。通过浏览器的p…

OSG简介

OSG OpenSceneGraph (简称 OSG) 是一个开源的高性能3D图形库。 作用 它为开发者提供了一个强大的API&#xff0c;处理和渲染复杂的3D图形。 特点 OSG基于OpenGL构建&#xff0c;提供了对现代图形技术的支持&#xff0c;如着色器、纹理映射、光照模型等高级特性。 跨平台支…

简述下npm,cnpm,yarn和pnpm的区别,以及跟在后面的-g,--save, --save-dev代表着什么

文章目录 前言一、npm&#xff0c;cnpm&#xff0c;yarn和pnpm的基本介绍和特点1.npm (Node Package Manager)2. Yarn3. cnpm (China npm)4. pnpm 二、简述npm和pnpm 的存储方式和依赖数1.存储方式2.依赖树 三、两者依赖树的差异导致结果的对比四、简单说说-g&#xff0c;--sav…

三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg

前言 在当今的短视频时代&#xff0c;高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻&#xff0c;还是制作 GIF、去除广告&#xff0c;剪辑都是必不可少的一环。 然而&#xff0c;批量处理大量视频并非易事&#xff0c;常见的挑战…

Python 视频爬取教程

文章目录 前言基本原理环境准备Python安装选择Python开发环境安装必要库 示例 1&#xff1a;爬取简单直链视频示例 2&#xff1a;爬取基于 HTML5 的视频&#xff08;以某简单视频网站为例&#xff09; 前言 以下是一个较为完整的 Python 视频爬取教程&#xff0c;包含基本原理…

ollama搭建deepseek调用详细步骤

在使用 Ollama 搭建 DeepSeek 并投喂数据的过程中,你需要几个主要步骤来确保一切顺利进行。以下是详细的指南,涵盖了从准备工作到实际投喂数据的所有环节。 准备环境确保你的计算机具备足够的硬件资源: CPU: 至少8核处理器(推荐12核以上)内存: 至少32GB RAM(推荐64GB以上…

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…