diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..28db922 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.git +.gitea +.gitignore +Readme.md +Dockerfile +docker-compose.yml \ No newline at end of file diff --git a/.gitea/workflows/deploy-workflow.yml b/.gitea/workflows/deploy-workflow.yml new file mode 100644 index 0000000..d4730b4 --- /dev/null +++ b/.gitea/workflows/deploy-workflow.yml @@ -0,0 +1,30 @@ +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +on: [push] + +jobs: + deploy: + runs-on: ubuntu-latest + container: + image: gitea/runner-images:ubuntu-latest + steps: + - name: clone project code + run: git clone ${{ gitea.server_url }}/${{ gitea.repository }} . + - name: List files + run: ls -la + - name: Stop running containers + run: | + docker compose down || true + - name: Remove old image + run: | + IMAGE_NAME=$(basename "$PWD") + echo "Removing old image: $IMAGE_NAME" + docker images | grep "$IMAGE_NAME" && docker rmi -f $(docker images "$IMAGE_NAME" -q) || echo "No old image found." + - name: Build new image + run: | + docker build -t $(basename "$PWD"):latest . + - name: Start containers + run: | + docker compose up -d + - name: Show container status + run: docker ps \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ca76756 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +# 使用官方轻量级 Python 基础镜像 +FROM python:3.12-slim + +# 设置工作目录(容器内路径) +WORKDIR /app + +# 将项目文件复制到容器中 +COPY . /app + +# (可选)如果你有 requirements.txt,则先复制并安装依赖 +RUN if [ -f requirements.txt ]; then \ + pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/; \ + fi + +# 设置环境变量(防止 Python 缓存文件) +ENV PYTHONUNBUFFERED=1 + +# 启动命令 +CMD ["python", "peter.py"] diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/__init__.py b/database/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/thottopic/__init__.py b/database/thottopic/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/tinformationsource/__init__.py b/database/tinformationsource/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/tnews/__init__.py b/database/tnews/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/tscheduler/__init__.py b/database/tscheduler/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/tvideoscript/__init__.py b/database/tvideoscript/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deepseek.py b/deepseek.py new file mode 100644 index 0000000..81b7818 --- /dev/null +++ b/deepseek.py @@ -0,0 +1,155 @@ +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) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9d616ab --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +version: "3.8" + +services: + app: + image: peter:latest + container_name: peter + restart: always diff --git a/log/__init__.py b/log/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/163_com/__init__.py b/seek/163_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/__init__.py b/seek/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/anjuke_com/__init__.py b/seek/anjuke_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/cnn_com/__init__.py b/seek/cnn_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/fang_com/__init__.py b/seek/fang_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/focus_cn/__init__.py b/seek/focus_cn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/leju_com/__init__.py b/seek/leju_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/mittr_com/__init__.py b/seek/mittr_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/ofweek_com/__init__.py b/seek/ofweek_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/the_paper_com/__init__.py b/seek/the_paper_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/xinhuanet_com/__init__.py b/seek/xinhuanet_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/seek/zhihu_com/__init__.py b/seek/zhihu_com/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task/__init__.py b/task/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task/content/__init__.py b/task/content/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task/default/__init__.py b/task/default/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task/hot_topic/__init__.py b/task/hot_topic/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/utils/__init__.py b/utils/__init__.py deleted file mode 100644 index e69de29..0000000