endofyear/README.md

217 lines
6.8 KiB
Markdown
Raw Permalink Normal View History

# EndOfYear
EndOfYear 点燃个人博客的年度辉煌!
![EndOfYear](static/endofyear.jpg)
## 使用方法
### 要求
- **确保 RSS 源提供完整的文章内容**为了保证数据分析的准确性RSS 源需要输出文章的全部内容。
- **在 GitHub 上运行**:由于 GitHub 运行环境可能无法访问某些 RSS 源,请考虑在本地 Docker 环境中运行。
- **适当设置 RSS 文章数量**:如果您的目的是生成年度报告,请根据博客的实际情况调整 RSS 输出的文章数量。
### 在 GitHub 上的使用步骤
1. 将项目 Fork 到您的个人仓库。
2. 在仓库首页,找到并打开 `config.ini` 文件。点击右上角的 🖋️ 符号进行在线编辑。
- `web` 字段:将其**设置为 `false` 以启用静态网站模式**(适用于 GitHub 运行)。
- `rss` 字段:填写您的 RSS 源地址,确保源地址提供全文输出。
```ini
[default]
web = false
[blog]
rss = https://blog.7wate.com/rss.xml
```
3. 编辑完成后,点击页面右上角的 **Commit changes** 将更改提交到 `main` 分支。
4. 提交后GitHub Actions 会自动运行并生成静态网站文件,最终推送至 `html` 分支。
5. 在 GitHub 仓库的 Settings 中开启 Pages 功能,并将源设置为 `html` 分支的根目录。
6. 稍后访问 GitHub Pages 分配的网址,即可看到生成的内容。
### 使用 Docker
1. **拉取 Docker 镜像**:从 [endofyear](https://hub.docker.com/r/sevenwate/endofyear) Docker Hub 页面拉取最新镜像。
```shell
docker pull sevenwate/endofyear:latest
```
2. **运行 Docker 容器**:映射容器的 7777 端口到宿主机的端口,并设置 `rss` 环境变量。
```shell
# 将 RSS 地址替换为您自己的。
docker run -p 7777:7777 --env rss=https://blog.7wate.com/rss.xml sevenwate/endofyear:latest
```
3. **访问本地网站**:在浏览器中访问 `localhost:7777`,即可查看结果。
## Q&A
### Github Actions 运行失败
请首先检查 Actions 日志的第六步输出,这里包含了导致运行失败的详细错误信息。
### Docker 运行无法访问 Web 服务
如果在使用 Docker 时无法访问 Web 服务,请按照以下步骤进行故障排除:
1. **检查端口映射**:确保您已正确设置容器的端口映射到宿主机。
2. **确认 rss 环境变量**:请检查是否已正确配置 `rss` 环境变量。
3. **查看 Docker 日志**:如果以上步骤均无法解决问题,请查看 Docker 容器的运行日志以获取更多信息。
### 博客数据分析不准确
目前提供的博客数据分析功能已经相对完善且准确。未来,我计划结合 AI 进一步优化分析效果,以提供更精准的数据维度。
### 主题不够丰富
由于个人时间有限,目前**我仅能承诺每年末前更新一款主题。**尽管如此,我仍然致力于为您的写作之旅带来愉悦和丰富的体验,并感谢您的理解和支持!
## 流程
EndOfYear 通过 RSS 获取博客文章数据,对文章数据进行统计、分析和整理,最终输出为 HTML客观地反映了博客一年的写作情况。
```mermaid
sequenceDiagram
participant User
participant Flask as Flask Server
participant Config as Configuration
participant Generator as Data Generator
participant Scraper as Data Scraper
participant Analyzer as Data Analyzer
User->>Flask: Access Service
Flask->>User: Redirect to painting theme
User->>Flask: Request painting theme
Flask->>Config: Invoke Data Generator
Config->>Generator: Run Data Scraper
Generator->>Scraper: Fetch RSS data
Scraper->>Analyzer: Analyze Data
Analyzer->>Scraper: Return Analyzed Data
Scraper->>Generator: Send Structured Data
Generator->>Flask: Return Data to Flask
Flask->>Flask: Render HTML Page with Data
Flask->>User: Return Rendered HTML Page
```
1. 用户访问 Flask 服务。
2. Flask 根路由跳转 painting 主题。
3. Config 模块运行数据生成器Generator
4. Generator 模块运行数据抓取器Scraper来获取RSS数据。
5. Scraper 将抓取的数据结合Analyzer对数据进行分析。
6. Analyzer 将分析后的数据返回给 Scraper。
7. Generator 整理Scraper结构化数据后将其返回给 Flask。
8. Flask 使用Generator的数据渲染 HTML 页面。
9. Flask 返回渲染后的 HTML 页面给用户。
## 主题开发
EndOfYear 使用 Python 结合 Flask 利用 Jinja2 模板进行数据渲染,目前提供四个数据模型。
```mermaid
erDiagram
Site ||--o{ Generator : contains
Blog ||--o{ Generator : contains
Post ||--o{ Generator : contains
Custom ||--o{ Generator : contains
Site {
string service
string title
}
Blog {
string name
string link
int life
int article_count
int article_word_count
string top_post_keys
string category
}
Post {
string title
string content
string[] keys
string time
string date
}
Custom {
string yiyan
}
Generator {
Site site
Blog blog
Post special_post
Post sentiment_post
Post long_post
Post short_post
Custom custom
}
```
如果进行主题开发可以使用 Jinja2 的模板语言,结合下面的数据定制一款专属主题。
| 数据 | 描述 |
|----------------|---------|
| site | 站点数据 |
| blog | 博客数据 |
| special_post | 特殊日期文件 |
| sentiment_post | 情感分最高文章 |
| long_post | 篇幅最长文章 |
| short_post | 篇幅最短文章 |
| custom | 自定义数据 |
如果有额外数据需求,可以修改 `custom` 模型,并在 `main.py` 中传参,最后在 HTML 模板中使用。以下是一个简单的模板示例:
```html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>{{ site.title }}</title>
</head>
<body>
亲爱的{{ blog.name }}
</body>
</html>
```
## 路线图
EndOfYear 目前处于初始阶段,如果您有兴趣,可以为其做出贡献。计划路线如下:
### V1
- [x] 结合互联网公开博客的数据源对 EndOfYear 进行全面、规模性的测试。
- [x] 默认主题进一步细化数据分析维度和数据颗粒度,精准描绘用户画像。
- [x] EndOfYear 渲染数据的规范,约束主题开发,提高主题的兼容性。
- [x] 进一步丰富和完善主题。
### V2
- [ ] 剥离主题,提供更好地主题开发方式。
- [ ] EndOfYear 项目网站首页,使用文档,主题开发等。
- [ ] 实现轻量化的运行部署,一键运行。
- [ ] 探索以插件的方式附加到博客系统的方法。
## 协议
EndOfYear 采用 GPL 3.0 协议。