Compare commits

...

2 Commits

Author SHA1 Message Date
6996641a07 add Readme
All checks were successful
Gitea Actions Demo / deploy (push) Successful in 15s
2025-11-12 21:00:33 +08:00
4fb7c9fc68 add gitea workflow 2025-11-12 20:53:23 +08:00
32 changed files with 224 additions and 0 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
.git
.gitea
.gitignore
Readme.md
Dockerfile
docker-compose.yml

View File

@ -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

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__

19
Dockerfile Normal file
View File

@ -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"]

View File

@ -1,3 +1,9 @@
# Peter
电影里面的蜘蛛侠叫Peter Parker.
## environment
- conda create -n peter python=3.12
- conda activate peter
- pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

View File

View File

155
deepseek.py Normal file
View File

@ -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)

7
docker-compose.yml Normal file
View File

@ -0,0 +1,7 @@
version: "3.8"
services:
app:
image: peter:latest
container_name: peter
restart: always

View File

View File

View File

View File