add gitea workflow
This commit is contained in:
6
.dockerignore
Normal file
6
.dockerignore
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.git
|
||||||
|
.gitea
|
||||||
|
.gitignore
|
||||||
|
Readme.md
|
||||||
|
Dockerfile
|
||||||
|
docker-compose.yml
|
||||||
30
.gitea/workflows/deploy-workflow.yml
Normal file
30
.gitea/workflows/deploy-workflow.yml
Normal 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
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
__pycache__
|
||||||
19
Dockerfile
Normal file
19
Dockerfile
Normal 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"]
|
||||||
155
deepseek.py
Normal file
155
deepseek.py
Normal 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
7
docker-compose.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: peter:latest
|
||||||
|
container_name: peter
|
||||||
|
restart: always
|
||||||
Reference in New Issue
Block a user