from abc import ABC, abstractmethod from DrissionPage import Chromium, ChromiumOptions from DrissionPage.common import Keys from log.log_manager import log import time class ChatBot(ABC): def __init__(self, url): self.prompt = None co = ChromiumOptions().set_local_port(9222) self.browser = Chromium(co) self.tab = self.browser.new_tab() self.tab.get(url) @abstractmethod def do_chat(self): """抽象方法,由子类实现""" pass def chat(self, prompt): self.prompt = prompt response = self.do_chat() self.close_tab() return response def close_tab(self): """关闭当前标签页""" if self.tab: self.tab.close() def finish(self): """关闭浏览器""" self.close_tab() if self.browser: self.browser.quit() # ====== 一个可运行的具体子类示例 ====== class QwenChatBot(ChatBot): def do_chat(self): """在 https://chat.qwen.ai/ 页面输入 prompt,按回车,等待结果""" # 1. 定位输入框(示例:textarea 或 input) log('正在浏览器打开新tab...') time.sleep(2) input_box = self.tab.ele('tag:textarea') or self.tab.ele('tag:input') if not input_box: log('未找到输入框') return [] # 2. 输入 prompt 并发送回车键 input_box.input(self.prompt) log(f'prompt: {self.prompt}') input_box.input(Keys.ENTER) log('正在等待结果...') # 3. 等待响应加载 sleep_time = 100 while sleep_time > 0: log(f'等待结果加载中... 剩余时间:{sleep_time}s') if self.tab.ele('#send-message-button'): break time.sleep(1) sleep_time -= 1 # 4. 获取聊天内容 response_content = self.tab.ele('#response-content-container').ele('tag:div').text log(f'获取结果成功:{response_content}') return response_content class DeepSeekChatBot(ChatBot): def do_chat(self): """在 https://chat.deepseek.com/ 页面输入 prompt,按回车,等待结果""" # 1. 定位输入框(示例:textarea 或 input) log('正在浏览器打开新tab...') time.sleep(2) input_box = self.tab.ele('tag:textarea') or self.tab.ele('tag:input') if not input_box: log('未找到输入框') return [] # 2. 输入 prompt 并发送回车键 input_box.input(self.prompt) log(f'prompt: {self.prompt}') input_box.input(Keys.ENTER) log('正在等待结果...') # 3. 等待响应加载 sleep_time = 100 while sleep_time > 0: log(f'等待结果加载中... 剩余时间:{sleep_time}s') # if self.tab.ele('tag:path@d^="M8.3125"'): if self.tab.html.__contains__('M8.3125'): break time.sleep(1) sleep_time -= 1 # 4. 获取聊天内容 response_content = self.tab.ele('tag:div@class=ds-markdown').text log(f'获取结果成功:{response_content}') return response_content if __name__ == '__main__': prompt = ''' # 心理学每日一课 ## 系统指令 你是一位资深心理学教授,专精于将复杂的心理学概念转化为通俗易懂、生动实用的知识。你的任务是按照**严格的JSON格式**输出每日心理学知识点。 ## 核心要求 1. 输出必须是**纯净的JSON对象**,不包含任何额外的解释、问候或Markdown标记 2. 严格遵循指定的JSON结构,键名和层级必须完全一致 3. 内容应当:权威准确、贴近生活、启发思考、实用性强 ## 内容规范 - **知识点选择**:优先选择有实证基础、生活关联度高的核心概念 - **难度级别**:保持在大众可理解范围内,避免过度专业术语 - **案例真实性**:案例应基于真实心理现象,具有典型性和教育意义 - **建议可行性**:行动建议应当具体、可操作、有针对性 ## 输出格式 ```json { "metadata": { "topic_area": "知识点所属领域", "difficulty": "入门|中等|进阶", "date_context": "适用场景或时期" }, "content": { "concept_name": "标准化的心理学概念名称", "core_explanation": { "definition": "清晰准确的定义描述", "mechanism": "心理机制或原理说明", "significance": "理论价值和现实意义" }, "practical_application": { "case_study": "具体的生活情境案例", "psychological_analysis": "基于理论的案例分析", "warning_signs": "相关的警示信号或表现", "coping_strategies": "具体的应对或应用方法" }, "learning_extensions": { "reflection_question": "促进行我觉察的反思问题", "action_step": "今日可执行的小行动", "related_concepts": ["相关概念1", "相关概念2"] } } } ''' deepseek = DeepSeekChatBot('https://chat.deepseek.com/') content = deepseek.chat(prompt) log(content)