从源代码构建
如果您想要从头搭建一个保存站,请阅读此章节。
说明(必读)
提示
本文档假设您已经安装了 Node.js、npm、MariaDB/MySQL、Redis 等相关软件。 如果您不确定如何安装这些软件,请参考相关文档或教程。
注意!!!
由于某些特殊原因,保存专栏、剪贴板、个人主页,生成 Token 等功能需要您能够访问国际互联网。如果您处于中国大陆,且在本地构建测试的,请打开您代理的 TUN(虚拟网卡) 模式。服务器请选择海外地区。
如果您不需要这些功能,可以忽略此提示。
详见下表。
表格
| 功能 | 是否需要访问国际互联网 |
|---|---|
| 保存专栏 | 是 |
| 保存剪贴板 | 是 |
| 保存个人主页 | 是 |
| 生成 Token | 是 |
| 保存题目信息 | Unkown |
| 保存陶片放逐 | 否 |
| 保存犇犇 | 否 |
准备工作
在终端中执行如下命令:
git clone https://github.com/laikit-dev/luogu-saver.git #克隆仓库
cd luogu-saver #进入目录
npm install #安装依赖
cp ormconfig.example.json ormconfig.json
cp contentConfig.example.json contentConfig.json
cp config.example.js config.js #极其重要
cp accounts.example.json accounts.json修改默认值
修改 ormconfig.json
vim ormconfig.json代码:
{
"type": "mariadb",
"synchronize": true,
"logging": true
}修改 type 为您的数据库类型。(常见:mysql、mariadb、sqlite)。
修改 config.js
vim config.js代码:
export default {
debug: true,
port: 55086,
database: {
host: 'localhost',
port: 3306,
user: 'luogu_saver',
password: 'your_password',
database: 'luogu_save'
},
pagination: {
search: 10,
problem: 50
},
request: {
concurrency: 2,
maxRequestToken: 20,
tokenRefillInterval: 1000
},
jwtSecret: 'your_jwt_secret',
requestHeader: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'x-luogu-type': 'content-only'
},
queue: {
processInterval: 200,
maxLength: 500
},
recent: {
article: {
default: 20,
max: 2000
}
},
redis: {
host: '127.0.0.1',
port: 6379,
password: null,
db: 0
},
service: { // 用于爬取犇犇
name: "luogu-saver",
api_url: "https://api-benben.imken.dev",
crawler_url: "https://spider-benben.imken.dev",
ws_url: "wss://spider-benben.imken.dev",
callback_timeout: 30000
},
rss: {
article: {
recentHours: 24
}
}
}- 修改
port为您喜欢的端口。 - 修改
database为您自己的数据库信息。推荐使用 MariaDB 或 MySQL。 - 修改
jwtSecret为您喜欢的密钥。 - 修改
redis为您自己的 Redis 信息。 - 其他内容请自行修改。
注意
未安装或不想使用 Redis?请不要修改此部分内容,我们将自动取消 Redis 的使用,无需您手动配置。
不知道配置数据库,可以加入 QQ 群(1017248143)讨论。
修改 accounts.json
注意
这个玩意是爬取题解能否提交用的,需要用到您的洛谷账号。如果不需要题解信息爬取,可以不修改。请勿泄露 __client_id。
vim accounts.json代码如下:
[
{ "_uid": "114514", "__client_id": "1145141919810" }
]修改 _uid 为您的洛谷 UID,修改 __client_id 为您的洛谷 Client ID。 如何获取 Client ID?
登录您的洛谷账号。
点击您键盘上的
F12按钮,打开开发者工具。点击
Application或应用程序标签 ->Cookie->https://www.luogu.com.cn-> 找到__client_id,复制值即可。
- Edge 浏览器示例:

- Chrome 浏览器示例:

修改 contentConfig.json
contentConfig.json 是一些设置文件,一般情况下无需修改。
运行
在终端中执行如下命令:
node app.js出现 Server is running on port xxx 说明成功。此时访问 http://127.0.0.1:端口号 即可。
管理员操作
添加/取消管理员
提示
仅需在第一次运行时用命令行工具添加管理员。后续可以直接在后台操作。需要先注册一个用户(Token)。注意您的 Token 与 luogu.me 并不相同两者互不影响。
命令行操作
进入您的数据库软件的终端,执行如下命令:
use luogu_save;这里的 luogu_save 为您数据库的名称。在这里获取数据库名称:
export default {
debug: true,
port: 55086,
database: {
host: 'localhost',
port: 3306,
user: 'luogu_saver',
password: 'your_password',
database: 'luogu_save' // here
},
pagination: {
search: 10,
problem: 50
},
// 后略……
}接下来执行:
UPDATE token SET role = 1 WHERE id = 'your_token';
/* role = 1 为管理员,如果要取消管理员,把 1 改成 0 即可!*/比如你的 Token 是 dfhsugfuidsgfiusodfgafio,那么命令为:
/* 给予管理权 */
UPDATE token SET role = 1 WHERE id = 'dfhsugfuidsgfiusodfgafio';
/* 取消管理权 */
UPDATE token SET role = 0 WHERE id = 'dfhsugfuidsgfiusodfgafio';没有傻瓜不会了吧。
后台面板
请先确保您的账号是管理员。
登录您的账号,进入后台(https://127.0.0.1:端口号/admin),点击 Token 管理,找到您要操作的用户,点齿轮,再点 设为管理员。
取消管理员同理。
置顶文章
被指定的文章会在“最近更新”中置顶显示。原则上不限制置顶数量,但是为了美观,不建议超过 6 篇。
进入您的数据库软件的终端,执行如下命令:
use luogu_save; /*这里的 `luogu_save` 为您数据库的名称。*/
UPDATE article SET priority = 100 WHERE id = 'your_article_id';这个命令会将指定文章的优先级设置为 100。根据 getRecentArticles 函数的实现,文章按照 priority 降序排列,然后按updated_at 降序排列,所以设置一个较高的 priority 值会使文章出现在最近更新列表的顶部。默认值为 0,代表不置顶。
- 您需要将
your_article_id替换为您想置顶的文章 ID。如https://www.luogu.me/article/ilovecz6,那么文章 ID 为ilovecz6。
其他操作
请在后台自行探索。操作很简单。
后续步骤
恭喜您,您已经搭建了一个保存站。
更新
请在终端中执行如下命令:
git pull
npm install #以防缺少新依赖,小版本更新不需要(节省时间)
node app.js #启动配置 PM2
PM2 是一个 Node.js 的进程管理工具,它可以帮助您管理您的 Node.js 应用程序。
管理后台的重启服务功能也依赖 PM2。
在终端执行:
npm install -g pm2
pm2 start app.js --name luogu-saver即可。
配置 Systemctl
Systemctl 是一个 Linux 的进程管理工具,它可以帮助您管理您的 Node.js 应用程序。
AI 声明
此部分内容由 AI 生成,未经验证。
创建systemd服务文件
# 创建服务文件
sudo nano /etc/systemd/system/luogu-saver.service服务文件内容
[Unit]
Description=Luogu Saver Node.js Application
After=network.target
[Service]
Type=simple
User=你的用户名
WorkingDirectory=/path/to/luogu-saver
ExecStart=/usr/bin/node app.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target启用和启动服务
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启用服务(开机自启)
sudo systemctl enable luogu-saver
# 启动服务
sudo systemctl start luogu-saver
# 检查状态
sudo systemctl status luogu-saver