MoreRSS

site iconNoise修改

开发者,开发了Rss-Translation(众多RSS翻译项目之一)。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Noise的 RSS 预览

MAC摸鱼神器-半透明web浏览器

2025-04-12 10:00:00

cov111er

TransparentSafari是一个比较有意思的项目,没有过多介绍,一般人还真难发现它,发行包才136kb大小,用途嘛…可以适当摸鱼,透明度可以自由调节,网址书签可以在内部添加

项目地址:https://github.com/976431yang/TransparentSafari

3432332r

131321

高度完善的轻量说说笔记系统及memos的开源替代品-你的私人朋友圈

2025-04-12 10:00:00

T1HaBIgPGZEXlfc

前言:近期碰到一个喜欢的一个项目,看到可以类似memos的轻松发布自己的内容…本着喜欢就改造的原则,这个版本的说说笔记就诞生了,使用它,你的数据将由你自由掌控,且可完全免费一键部署,重要的是碎片化的信息记录加自动化就会变的非常高自由度,感兴趣的话不妨来试试

介绍

这是基于Ech0基本框架的二次开发、魔改及完善,类似朋友圈样式风格,支持后台配置修改如背景图、个性签名等,支持api 获取内容、更新操作等,支持对b站视频、网易云音乐、youtube等的解析添加、支持一键复制,一键生成内容图片、支持http post发送内容到平台,支持对接webhook、telegram、企业微信、飞书的一键推送,支持内容热力图组件等个性化组件,它完全属于个人的自定化使用,会加入定制化的一些功能,由于代码已重构,不同步于原版

预览:https://note.noisework.cn

源码:https://github.com/rcy1314/echo-noise

原版介绍

Ech0 是一款专为轻量级分享而设计的开源自托管平台,支持快速发布与分享你的想法、文字与链接。简单直观的操作界面,轻松管理你的内容,让分享变得更加自由,确保数据完全掌控,随时随地与世界连接。

原版地址:https://github.com/lin-snow/Ech0


268shot99

整体改版

编辑器部分:

  1. 自适应高度和拖拽调整功能
  2. 扩展的工具栏功能
  3. 完整的响应式支持
  4. 平滑的过渡动画效果
  5. 优化的间距和字体设置
  6. md格式图片即时预览
  7. 添加定制化的组件

主页部分:

  1. 调整页面内容自适应高度和宽度
  2. 添加随机背景图的展示并带有模糊效果
  3. 增加md 格式下对网易云音乐、哔哩哔哩视频、youtube、qq 音乐的解析渲染
  4. 调整信息条目的背景ui 及显示尺寸的优化
  5. 调整ui及加载响应页面的整体显示效果
  6. 添加朋友圈样式主图banner,并和背景图使用相同
  7. 所有链接都可通过新标签页打开
  8. 长内容的折叠展开处理
  9. 完善的二次编辑及预览保存
  10. 一键复制及生成内容图片的功能化组件
  11. 增加标签系统路由及组件

代码部分

  1. 调整jwk验证为session方式,同时调整token的验证机制
  2. 调整优化数据库的迁移及连接处理
  3. 增加不同的路由及调整控制器
  4. 增加额外的外挂插件文件
  5. 增加定期清理缓存

特征

  • 一键部署无服务器平台-fly.io、zeabur、railway、vercel

  • 外部扩展-支持快捷指令及popclip一键发布内容到站点

  • 支持推送渠道(webhook、tg、企业微信、飞书)

  • 标签系统和图片api 路由

  • 支持链接远程数据库PostgreSQL、MySQL的连接支持,默认SQLite

  • 个性化前端组件如发布日历-热力图组件,默认不显示,点击日历图标后显示

    1743765992985_副本

    01.45.31

  • 内容二次编辑及一键复制一键生成内容图片

  • 数据库文件的一键备份、上传

    ehS1BxwbUKyD2Vm


安装部署

💡 部署完成后访问 ip:1314 即可使用

docker部署

一键部署

1
2
3
4
5
6
docker run -d \
--name Ech0-Noise \
--platform linux/amd64 \
-p 1314:1314 \
-v /opt/data/noise.db:/app/data/noise.db \
noise233/echo-noise

/opt/data/noise.db是你本地的原有数据库文件,如果没有,可以去掉这个挂载命令,它也会自动创建

说明:如果你是经常使用附件图片发布内容的则可以这样:-v /opt/data:/app/data \

默认用户名:admin

默认用户密码:admin

docker-componse构建部署

在该目录下执行以下命令启动服务(不修改环境变量时默认使用本地数据库.db 文件):

1
docker-compose up -d

无服务器平台+postgres免费数据库部署

数据库使用 Neon PostgreSQL 云数据库服务,其它也支持

请先前往官网https://console.neon.tech部署好你的基础数据库

以下部署文件已放入根目录下的noise文件夹内

部署成功示例:

SDOAt8BsdIiCzXF

Fly.io部署

fly.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
app = 'ech0-noise'    # 修改为你的自定义容器名
primary_region = 'hkg'

[experimental]
auto_rollback = true

[build]
image = 'noise233/echo-noise'
dockerfile = 'Dockerfile'

[env]
CGO_ENABLED = '1'
DB_HOST = 'example.aws.neon.tech' # 修改为数据库的HOST地址
DB_NAME = 'noise' # 修改为数据库的名称
DB_PASSWORD = 'example' # 修改为数据库的密码
DB_PORT = '5432'
DB_SSL_MODE = 'require'
DB_TYPE = 'postgres'
DB_USER = 'noise_owner' # 修改为数据库的用户名
TZ = 'Asia/Shanghai'

[http_service]
internal_port = 1314
force_https = true
auto_stop_machines = 'stop'
auto_start_machines = true
min_machines_running = 0

[[services]]
protocol = 'tcp'
internal_port = 1314

[[services.ports]]
port = 1314

[[vm]]
memory = '512mb'
cpu_kind = 'shared'
cpus = 1

部署命令
在准备好 fly.toml 文件后,你可以使用以下命令来部署你的应用到 Fly.io:

初始化 Fly.io 应用(如果尚未初始化)

fly launch

部署应用

fly deploy

确保你已经安装并配置好了 Fly.io 的 CLI 工具,并且已经登录到你的 Fly.io 账号。如果你还没有安装 Fly.io CLI,可以通过以下命令安装:

1
curl -L https://fly.io/install.sh | sh

安装完成后,使用 fly auth login 登录到你的 Fly.io 账号。

zeabur部署

zeabur.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
app = "ech0-noise"

[build]
dockerfile = "Dockerfile"
image = "noise233/echo-noise"

[env]
DB_TYPE = "postgres"
DB_HOST = 'example.aws.neon.tech' # 修改为数据库的HOST地址
DB_PORT = "5432"
DB_USER = 'noise_owner' # 修改为数据库的用户名
DB_PASSWORD = 'example' # 修改为数据库的密码
DB_NAME = 'noise' # 修改为数据库的名称
DB_SSL_MODE = "require"
CGO_ENABLED = "1"
TZ = "Asia/Shanghai"

[http_service]
internal_port = 1314
force_https = true

[[services]]
protocol = "tcp"
internal_port = 1314

[[services.ports]]
port = 1314

[[vm]]
memory = "512mb"
cpu_kind = "shared"
cpus = 1

部署命令:

1
zeabur deploy

Railway部署

railway.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
app = "ech0-noise"

[build]
dockerfile = "Dockerfile"
image = "noise233/echo-noise"

[env]
DB_TYPE = "postgres"
DB_HOST = 'example.aws.neon.tech' # 修改为数据库的HOST地址
DB_PORT = "5432"
DB_USER = 'noise_owner' # 修改为数据库的用户名
DB_PASSWORD = 'example' # 修改为数据库的密码
DB_NAME = 'noise' # 修改为数据库的名称
DB_SSL_MODE = "require"
CGO_ENABLED = "1"
TZ = "Asia/Shanghai"

[service]
internal_port = 1314
protocol = "tcp"

[service.ports]
port = 1314

[vm]
memory = "512mb"
cpu_kind = "shared"
cpus = 1

部署命令:

1
railway up

预览

注意⚠️

如果你是直接在平台拉取项目部署而不是通过命令部署,你需要拷贝fork本项目并将fly.toml、railway.toml、zeabur.toml文件放入根目录下才能一键部署

数据库连接部分

本地数据库直接docker部署即可

远程数据库服务则可以通过环境变量连接

连接远程 PostgreSQL:

1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
--name Ech0-Noise \
--platform linux/amd64 \
-p 1314:1314 \
-e DB_TYPE=postgres \
-e DB_HOST=your.postgres.host \
-e DB_PORT=5432 \
-e DB_USER=your_username \
-e DB_PASSWORD=your_password \
-e DB_NAME=noise \
-v /opt/data/images:/app/data/images \
noise233/echo-noise

连接远程 MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
--name Ech0-Noise \
--platform linux/amd64 \
-p 1314:1314 \
-e DB_TYPE=mysql \
-e DB_HOST=your.mysql.host \
-e DB_PORT=3306 \
-e DB_USER=your_username \
-e DB_PASSWORD=your_password \
-e DB_NAME=noise \
-v /opt/data/images:/app/data/images \
noise233/echo-noise

注意事项:

  1. 确保远程数据库允许外部连接
  2. 检查防火墙设置
  3. 使用正确的数据库连接信息
  4. 建议使用加密连接
  5. 注意数据库的字符集设置

对于 Neon PostgreSQL (地址https://console.neon.tech )这样的云数据库服务,需要使用特定的连接参数。以下是连接命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d \
--name Ech0-Noise \
--platform linux/amd64 \
-p 1314:1314 \
-e DB_TYPE=postgres \
-e DB_HOST=your.host \
-e DB_PORT=5432 \
-e DB_USER=user_owner \
-e DB_PASSWORD=password \
-e DB_NAME=yourname \
-e DB_SSL_MODE=require \
-v /opt/data/images:/app/data/images \
noise233/echo-noise

注意事项:

  1. 添加了 DB_SSL_MODE=require 环境变量,因为 Neon 要求 SSL 连接
  2. 使用了连接 URL 中提供的主机名、用户名、密码和数据库名
  3. 保持图片目录的挂载

数据的备份恢复

对于所有数据库类型(SQLite/PostgreSQL/MySQL),点击后台数据库下载按钮后,都会先备份数据库文件

  • 然后会将包含数据库备份和图片打包成 zip 文件
  • zip 文件中会包含:
    • 数据库备份文件(.db/.sql)
    • images 目录下的所有图片
1
2
3
4
5
备份过程:
本地 -> 执行备份命令 -> 生成备份文件 -> 打包下载

恢复过程:
上传备份文件 -> 解压缩 -> 执行恢复命令 -> 导入到云数据库

恢复要求:

  • SQLite本地数据库备份和上传时默认使用的文件名是一致为noise.db
  • 非本地数据库PostgreSQL/MySQL请命名为database.sql并放入database.zip来恢复
  • 如果备份时zip中有图片文件夹则同时会恢复 images 目录下的所有图片

⚠️ :因PostgreSQL/MySQL云服务会有SSL连接、兼容版本号、数据表格式等要求,后台一键备份恢复不一定能满足你需要连接的远程数据库,请尽量前往服务商处下载备份

API指南🧭

先到后台获取api token,然后可以参考下面的命令运行或使用其它服务(记得将https://your.localhost.com 更改为你自己的服务地址)

1743847126537

1
2
3
4
5
6
7
8
# 发送纯文本信息
curl -X POST 'https://your.localhost.com/api/token/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer c721249bd66e1133fba430ea9e3c32f1' \
-d '{
"content": "测试信息",
"type": "text"
}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 方式1:使用 Markdown 语法发送文本
curl -X POST 'https://your.localhost.com/api/token/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: c721249bd66e1133fba430ea9e3c32f1' \
-d '{
"content": "# 标题\n这是一段文字\n![图片描述](https://example.com/image.jpg)",
"type": "text"
}'

# 方式2:使用 type: image 发送图片消息
curl -X POST 'https://your.localhost.com/api/token/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: c721249bd66e1133fba430ea9e3c32f1' \
-d '{
"content": "图片描述文字",
"type": "image",
"image": "https://example.com/image.jpg"
}'

如果你想使用session 认证方式

1
2
3
4
5
6
7
curl -v -X POST 'https://your.localhost.com/api/messages' \
-H 'Content-Type: application/json' \
--cookie "your_session_cookie" \
-d '{
"content": "测试信息",
"type": "text"
}'

对于图文混合消息,可以这样发送:

1
2
3
4
5
6
7
curl -X POST 'https://your.localhost.com/api/token/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: c721249bd66e1133fba430ea9e3c32f1' \
-d '{
"content": "# 这是标题\n\n这是一段文字说明\n\n![图片描述](https://example.com/image.jpg)\n\n继续写文字内容",
"type": "text"
}'
1
2
3
4
5
6
7
8
9
10
或者使用 multipart 类型:

curl -X POST 'https://your.localhost.com/api/token/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: c721249bd66e1133fba430ea9e3c32f1' \
-d '{
"content": "# 这是标题\n\n这是一段文字说明",
"type": "multipart",
"image": "https://example.com/image.jpg"
}

API 文档(待增加)

公共接口

1. 获取前端配置

  • 路径: /api/frontend/config
  • 方法: GET
  • 描述: 获取前端配置信息
  • 示例请求:
    1
    curl http://localhost:8080/api/frontend/config

2. 用户登录

  • 路径: /api/login
  • 方法: POST
  • 描述: 用户登录接口
  • 请求体:
    1
    2
    3
    4
    {
    "username": "admin",
    "password": "password"
    }
  • 示例请求:
    1
    2
    3
    curl -X POST http://localhost:8080/api/login \
    -H "Content-Type: application/json" \
    -d '{"username":"admin","password":"password"}'

3. 用户注册

  • 路径: /api/register
  • 方法: POST
  • 描述: 用户注册接口
  • 请求体:
    1
    2
    3
    4
    5
    {
    "username": "newuser",
    "password": "password",
    "email": "[email protected]"
    }
  • 示例请求:
    1
    2
    3
    curl -X POST http://localhost:8080/api/register \
    -H "Content-Type: application/json" \
    -d '{"username":"newuser","password":"password","email":"[email protected]"}'

4. 获取系统状态

  • 路径: /api/status
  • 方法: GET
  • 描述: 获取系统运行状态
  • 示例请求:
    1
    curl http://localhost:8080/api/status

5. 消息相关公共接口

5.1 获取所有消息

  • 路径: /api/messages
  • 方法: GET
  • 描述: 获取所有公开消息
  • 示例请求:
    1
    curl http://localhost:8080/api/messages

5.2 获取单条消息

  • 路径: /api/messages/:id
  • 方法: GET
  • 描述: 获取指定ID的消息
  • 示例请求:
    1
    curl http://localhost:8080/api/messages/1

5.3 分页获取消息

  • 路径: /api/messages/page
  • 方法: POST或GET
  • 描述: 分页获取消息列表
  • 请求体:
    1
    2
    3
    4
    {
    "page": 1,
    "pageSize": 10
    }
  • 示例请求:
    1
    2
    3
    curl -X POST http://localhost:8080/api/messages/page \
    -H "Content-Type: application/json" \
    -d '{"page":1,"pageSize":10}'

5.4 获取消息日历数据

  • 路径: /api/messages/calendar
  • 方法: GET
  • 描述: 获取消息发布热力图数据
  • 示例请求:
    1
    curl http://localhost:8080/api/messages/calendar

5.5 搜索消息

  • 路径: /api/messages/search
  • 方法: GET
  • 参数:
    • keyword: 搜索关键词
    • page: 页码
    • pageSize: 每页数量
  • 示例请求:
    1
    curl "http://localhost:8080/api/messages/search?keyword=测试&page=1&pageSize=10"

6. RSS 相关接口

6.1 获取 RSS 订阅

  • 路径: /rss
  • 方法: GET
  • 描述: 获取 RSS 订阅内容
  • 示例请求:
    1
    curl http://localhost:1314/rss

需要认证的接口

1. 消息操作接口

1.1 发布消息

  • 路径: /api/messages
  • 方法: POST
  • 描述: 发布新消息
  • 请求体:
    1
    2
    3
    4
    5
    {
    "content": "消息内容",
    "private": false,
    "imageURL": ""
    }
  • 示例请求:
    1
    2
    3
    4
    curl -X POST http://localhost:8080/api/messages \
    -H "Content-Type: application/json" \
    -H "Cookie: session=xxx" \
    -d '{"content":"测试消息","private":false}'

1.2 更新消息

  • 路径: /api/messages/:id
  • 方法: PUT
  • 描述: 更新指定消息
  • 请求体:
    1
    2
    3
    {
    "content": "更新后的内容"
    }
  • 示例请求:
    1
    2
    3
    4
    curl -X PUT http://localhost:8080/api/messages/1 \
    -H "Content-Type: application/json" \
    -H "Cookie: session=xxx" \
    -d '{"content":"更新后的内容"}'

1.3 删除消息

  • 路径: /api/messages/:id
  • 方法: DELETE
  • 描述: 删除指定消息
  • 示例请求:
    1
    2
    curl -X DELETE http://localhost:8080/api/messages/1 \
    -H "Cookie: session=xxx"

2. 用户相关接口

2.1 获取用户信息

  • 路径: /api/user
  • 方法: GET
  • 描述: 获取当前登录用户信息
  • 示例请求:
    1
    2
    curl http://localhost:8080/api/user \
    -H "Cookie: session=xxx"

2.2 修改密码

  • 路径: /api/user/change_password
  • 方法: PUT
  • 请求体:
    1
    2
    3
    4
    {
    "oldPassword": "旧密码",
    "newPassword": "新密码"
    }
  • 示例请求:
    1
    2
    3
    4
    curl -X PUT http://localhost:8080/api/user/change_password \
    -H "Content-Type: application/json" \
    -H "Cookie: session=xxx" \
    -d '{"oldPassword":"old","newPassword":"new"}'

2.3 更新用户信息

  • 路径: /api/user/update
  • 方法: PUT
  • 示例请求:
    1
    2
    3
    4
    curl -X PUT http://localhost:8080/api/user/update \
    -H "Content-Type: application/json" \
    -H "Cookie: session=xxx" \
    -d '{"username":"newname"}'

2.4 退出登录

  • 路径: /api/user/logout
  • 方法: POST
  • 示例请求:
    1
    2
    curl -X POST http://localhost:8080/api/user/logout \
    -H "Cookie: session=xxx"

3. Token 相关接口

3.1 获取用户 Token

  • 路径: /api/user/token
  • 方法: GET
  • 示例请求:
    1
    2
    curl http://localhost:8080/api/user/token \
    -H "Cookie: session=xxx"

3.2 重新生成 Token

  • 路径: /api/user/token/regenerate
  • 方法: POST
  • 示例请求:
    1
    2
    curl -X POST http://localhost:8080/api/user/token/regenerate \
    -H "Cookie: session=xxx"

4. 系统设置接口

4.1 更新系统设置

  • 路径: /api/settings
  • 方法: PUT
  • 请求体:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "allowRegistration": true,
    "frontendSettings": {
    "siteTitle": "网站标题",
    "subtitleText": "副标题",
    "avatarURL": "头像URL",
    "username": "显示用户名",
    "description": "描述",
    "backgrounds": ["背景图URL"],
    "cardFooterTitle": "页脚标题",
    "cardFooterLink": "页脚链接",
    "pageFooterHTML": "页脚HTML",
    "rssTitle": "RSS标题",
    "rssDescription": "RSS描述",
    "rssAuthorName": "RSS作者",
    "rssFaviconURL": "RSS图标URL",
    "walineServerURL": "评论系统URL"
    }
    }
  • 示例请求:
    1
    2
    3
    4
    curl -X PUT http://localhost:8080/api/settings \
    -H "Content-Type: application/json" \
    -H "Cookie: session=xxx" \
    -d '{"allowRegistration":true,"frontendSettings":{"siteTitle":"我的网站"}}'

5. 备份相关接口

5.1 下载备份

  • 路径: /api/backup/download
  • 方法: GET
  • 示例请求:
    1
    2
    3
    curl http://localhost:8080/api/backup/download \
    -H "Cookie: session=xxx" \
    --output backup.sql

5.2 恢复备份

  • 路径: /api/backup/restore
  • 方法: POST
  • 描述: 从备份文件恢复数据
  • 示例请求:
    1
    2
    3
    curl -X POST http://localhost:8080/api/backup/restore \
    -H "Cookie: session=xxx" \
    -F "[email protected]"

6. 图片上传接口

6.1 上传图片

  • 路径: /api/images/upload
  • 方法: POST
  • 描述: 上传图片文件
  • 示例请求:
    1
    2
    3
    curl -X POST http://localhost:8080/api/images/upload \
    -H "Cookie: session=xxx" \
    -F "[email protected]"

7.推送配置路由使用说明

获取推送配置

  • 路径: /api/notify/config
  • 方法: GET
  • 描述: 获取当前推送渠道配置
  • 示例请求:
1
2
curl -X GET http://localhost:8080/api/notify/config \
-H "Cookie: session=xxx"

保存推送配置

  • 路径: /api/notify/config
  • 方法: PUT
  • 描述: 更新推送渠道配置
  • 请求体示例:
1
2
3
4
5
6
7
8
9
10
11
12
{
"webhookEnabled": true,
"webhookURL": "https://webhook.example.com",
"telegramEnabled": true,
"telegramToken": "bot123:ABC",
"telegramChatID": "-100123456",
"weworkEnabled": false,
"weworkKey": "",
"feishuEnabled": true,
"feishuWebhook": "https://open.feishu.cn/xxx",
"feishuSecret": "signature_key"
}
  • 示例请求:
1
2
3
4
5
6
7
curl -X PUT http://localhost:8080/api/notify/config \
-H "Cookie: session=xxx" \
-H "Content-Type: application/json" \
-d '{
"webhookEnabled": true,
"webhookURL": "https://webhook.example.com"
}'

测试推送

  • 路径: /api/notify/test
  • 方法: POST
  • 描述: 测试指定推送渠道
  • 请求体示例:
1
2
3
{
"type": "telegram"
}
  • 示例请求:
1
2
3
4
curl -X POST http://localhost:8080/api/notify/test \
-H "Cookie: session=xxx" \
-H "Content-Type: application/json" \
-d '{"type": "telegram"}'

发送推送

  • 路径: /api/notify/send
  • 方法: POST
  • 描述: 手动触发推送(需已配置推送渠道)
  • 请求体示例:
1
2
3
4
5
{
"content": "测试消息内容",
"images": ["https://example.com/image.jpg"],
"format": "markdown"
}
  • 示例请求:
1
2
3
4
curl -X POST http://localhost:8080/api/notify/send \
-H "Cookie: session=xxx" \
-H "Content-Type: application/json" \
-d '{"content": "紧急通知!"}'

注意事项:

  1. 所有需要认证的接口都需要在请求头中携带有效的 session cookie
  2. 部分接口可能需要管理员权限
  3. 所有请求示例中的域名和端口号需要根据实际部署情况调整
  4. 文件上传接口需要使用 multipart/form-data 格式
  5. Token 认证接口可以使用 Token 替代 session 进行认证

发布说明

目前会构建两个版本,

稳定版:latest镜像

实验版:last镜像

如果你需要构建自己的镜像发布-示例:

1
docker buildx build --platform linux/amd64,linux/arm64 -t noise233/echo-noise:latest --push --no-cache .

Memos数据库迁移示例

其中,你需要设置设置源数据库和目标数据库的路径,源数据库为memos_prod.db(memos数据)目标数据库为database.db(本站数据库),你还需要修改构建插入的数据中的用户名为你自己的用户名,分别迁移了原文本内容、发布时间,可以在noise/memos迁移文件夹中找到该脚本

,运行python3 main.py即可,

1744202949838

迁移结束后将你的数据库文件和原图片文件夹(有的话)打包为zip格式,进入站点后台选择恢复数据上传即可。

Popclip发送扩展

选中后自动识别安装,发送时会自动添加一个popclip开头的标签,token可在后台找到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// #popclip extension for Send to Shuo
// name: 说说笔记
// icon: square filled 说
// language: javascript
// module: true
// entitlements: [network]
// options: [{
// identifier: "siteUrl",
// label: "服务端地址",
// type: "string",
// defaultValue: "https://note.noisework.cn",
// description: "请确保地址正确,不要带末尾斜杠"
// }, {
// identifier: "token",
// label: "API Token",
// type: "string",
// description: "从设置页面获取最新Token"
// }]

async function sendToShuo(input, options) {
try {
// 参数预处理
const siteUrl = (options.siteUrl || "").replace(/\/+$/g, "");
const token = (options.token || "").trim();
const content = (input.text || "").trim();

// 验证参数
if (!/^https:\/\/[\w.-]+(:\d+)?$/.test(siteUrl)) {
throw new Error("地址格式错误,示例: https://note.noisework.cn");
}
if (!token) throw new Error("Token不能为空");
if (!content) throw new Error("选中文本不能为空");

// 发送请求
await sendRequestWithXMLHttpRequest(siteUrl, token, content);
PopClip.showText("✓ 发送成功");
} catch (error) {
handleRequestError(error);
}
}

// 使用 XMLHttpRequest 实现网络请求
function sendRequestWithXMLHttpRequest(siteUrl, token, content) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
const url = `${siteUrl}/api/token/messages`;

xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", `Bearer ${token}`);

xhr.timeout = 10000; // 设置超时时间(10秒)

// 设置回调函数
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.responseText);
} else {
let errorMsg = `请求失败 (${xhr.status})`;
try {
const data = JSON.parse(xhr.responseText);
errorMsg = data.message || errorMsg;
} catch {}
reject(new Error(errorMsg));
}
}
};

// 处理网络错误
xhr.onerror = () => reject(new Error("网络错误"));

// 处理超时错误
xhr.ontimeout = () => reject(new Error("请求超时"));

try {
// 发送请求
const payload = JSON.stringify({
content: `#Popclip\n${content}`,
type: "text"
});
xhr.send(payload);
} catch (error) {
reject(new Error("请求发送失败: " + error.message));
}
});
}

// 错误处理
function handleRequestError(error) {
console.error("请求错误:", error);

const errorMap = {
"Failed to fetch": "无法连接到服务器",
"aborted": "请求超时",
"网络错误": "网络错误",
"401": "认证失败,请检查Token",
"404": "API地址不存在"
};

const message = Object.entries(errorMap).find(([key]) =>
error.message.includes(key)
)?.[1] || `请求错误: ${error.message.split('\n')[0].slice(0, 50)}`;

PopClip.showText(`❌ ${message}`);
}

exports.actions = [{
title: "发送至说说笔记",
code: sendToShuo,
icon: "square filled 说"
}];

Web组件示例

如果你想将内容作为说说嵌入或结合到你的网站、博客可以参考

说明:host为站点地址,limit为每页内容数量,domId为容器名,下面的代码展示了使用js来请求数据内容到前端并渲染处理的基本框架,其余需要你自己再丰富css样式和你自己的页面

html前端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<link rel="stylesheet" href="./assets/css/note.css">
<!-- note容器部分 -->
<div id="note" class="note page active">
<div class="note-container">
<div class="loading-wrapper" style="text-align: center; padding: 20px;">
加载中...
</div>
</div>
<script type="text/javascript">
var note = {
host: 'https://note.noisework.cn', //请修改为你自己的站点地址
limit: '10',
domId: '#note'
}
</script>
<!-- 添加note.js脚本 -->
<script type="text/javascript" src="./assets/js/note.js"></script>

note.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// Note says content loading script
document.addEventListener('DOMContentLoaded', function() {
// get parameters from global configuration
const config = window.note || {
host: 'https://note.noisework.cn',
limit: '10',
domId: '#note'
};

// 修改容器选择器
const container = document.querySelector('#note .note-container');
let currentPage = 1;
let isLoading = false;
let hasMore = true;

// create load more button
const loadMoreBtn = document.createElement('button');
loadMoreBtn.id = 'load-more-note';
loadMoreBtn.className = 'load-more';
loadMoreBtn.textContent = '加载更多';
loadMoreBtn.style.display = 'none';
loadMoreBtn.addEventListener('click', loadMoreContent);

// create already loaded all prompt
const loadedAll = document.createElement('div');
loadedAll.id = 'loaded-all-note';
loadedAll.className = 'loaded-all';
loadedAll.textContent = '已加载全部';
loadedAll.style.display = 'none';

container.appendChild(loadMoreBtn);
container.appendChild(loadedAll);

// initial load
loadInitialContent();

async function loadInitialContent() {
try {
console.log(`请求URL: ${config.host}/api/messages/page?page=${currentPage}&pageSize=${config.limit}`);
const response = await fetch(`${config.host}/api/messages/page?page=${currentPage}&pageSize=${config.limit}`);

if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}

const result = await response.json();
console.log('API响应数据:', result);

// 修改为检查result.data.items
if (result && result.code === 1 && result.data && result.data.items && Array.isArray(result.data.items)) {
const sortedData = result.data.items.sort((a, b) =>
new Date(b.created_at) - new Date(a.created_at)
);
renderMessages(sortedData);

if (result.data.items.length >= config.limit) {
loadMoreBtn.style.display = 'block';
} else {
loadedAll.style.display = 'block';
hasMore = false;
}
} else {
container.querySelector('.loading-wrapper').textContent = '暂无内容';
hasMore = false;
}
} catch (error) {
console.error('加载内容失败:', error);
container.querySelector('.loading-wrapper').textContent = '加载失败,请刷新重试';
}
}

async function loadMoreContent() {
if (isLoading || !hasMore) return;

isLoading = true;
loadMoreBtn.textContent = '加载中...';
currentPage++;

try {
const response = await fetch(`${config.host}/api/messages/page?page=${currentPage}&pageSize=${config.limit}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();

// 同样修改为检查result.data.items
if (result && result.code === 1 && result.data && result.data.items && Array.isArray(result.data.items)) {
const sortedData = result.data.items.sort((a, b) =>
new Date(b.created_at) - new Date(a.created_at)
);
renderMessages(sortedData);

if (result.data.items.length < config.limit) {
loadMoreBtn.style.display = 'none';
loadedAll.style.display = 'block';
hasMore = false;
}
} else {
loadMoreBtn.style.display = 'none';
loadedAll.style.display = 'block';
hasMore = false;
}
} catch (error) {
console.error('加载更多内容失败:', error);
currentPage--;
} finally {
isLoading = false;
loadMoreBtn.textContent = '加载更多';
}
}

function renderMessages(messages) {
const loadingWrapper = container.querySelector('.loading-wrapper');
if (loadingWrapper) {
loadingWrapper.style.display = 'none';
}

messages.forEach(message => {
const messageElement = createMessageElement(message);
container.insertBefore(messageElement, loadMoreBtn);
});
}

function createMessageElement(message) {
const messageDiv = document.createElement('div');
messageDiv.className = 'rssmergecard';

const contentDiv = document.createElement('div');
contentDiv.className = 'rssmergecard-content';

const title = document.createElement('h3');
title.className = 'rssmergecard-title';
title.textContent = message.username || '匿名用户';

const description = document.createElement('div');
description.className = 'rssmergecard-description';

// 解析Markdown内容和特殊链接
let processedContent = message.content || '无内容';
processedContent = parseMarkdown(processedContent);
processedContent = parseSpecialLinks(processedContent);
description.innerHTML = processedContent;

// 如果有图片则添加图片
if (message.image_url) {
const img = document.createElement('img');
img.src = message.image_url.startsWith('http') ? message.image_url : config.host + message.image_url;
img.style.maxWidth = '100%';
img.style.borderRadius = '6px';
img.style.margin = '10px 0';
description.appendChild(img);
}

const metaDiv = document.createElement('div');
metaDiv.className = 'rssmergecard-meta';

const timeSpan = document.createElement('span');
timeSpan.className = 'rssmergecard-time';
timeSpan.textContent = formatDate(message.created_at);

metaDiv.appendChild(timeSpan);
contentDiv.appendChild(title);
contentDiv.appendChild(description);
contentDiv.appendChild(metaDiv);
messageDiv.appendChild(contentDiv);

return messageDiv;
}

function parseMarkdown(content) {
// 处理标题
content = content.replace(/^#\s(.+)$/gm, '<h1>$1</h1>');
content = content.replace(/^##\s(.+)$/gm, '<h2>$1</h2>');
content = content.replace(/^###\s(.+)$/gm, '<h3>$1</h3>');

// 处理图片 ![alt](url)
content = content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '<img src="$2" alt="$1" style="max-width:100%;border-radius:6px;margin:10px 0;">');

// 处理链接 [text](url)
content = content.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');

// 处理粗体 **text**
content = content.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');

// 处理斜体 *text*
content = content.replace(/\*([^*]+)\*/g, '<em>$1</em>');

// 处理代码块 `code`
content = content.replace(/`([^`]+)`/g, '<code>$1</code>');

return content;
}

function parseSpecialLinks(content) {
// 定义各种平台的正则表达式
const BILIBILI_REG = /https:\/\/www\.bilibili\.com\/video\/((av[\d]{1,10})|(BV[\w]{10}))\/?/g;
const BILIBILI_A_TAG_REG = /<a\shref="https:\/\/www\.bilibili\.com\/video\/((av[\d]{1,10})|(BV[\w]{10}))\/?">.*<\/a>/g;
const QQMUSIC_REG = /<a\shref="https\:\/\/y\.qq\.com\/.*(\/[0-9a-zA-Z]+)(\.html)?".*?>.*?<\/a>/g;
const QQVIDEO_REG = /<a\shref="https:\/\/v\.qq\.com\/.*\/([a-zA-Z0-9]+)\.html".*?>.*?<\/a>/g;
const SPOTIFY_REG = /<a\shref="https:\/\/open\.spotify\.com\/(track|album)\/([\s\S]+)".*?>.*?<\/a>/g;
const YOUKU_REG = /<a\shref="https:\/\/v\.youku\.com\/.*\/id_([a-zA-Z0-9=]+)\.html".*?>.*<\/a>/g;
const YOUTUBE_REG = /<a\shref="https:\/\/(www\.youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})".*?>.*<\/a>/g;
const NETEASE_MUSIC_REG = /<a\shref="https?:\/\/music\.163\.com\/.*?id=(\d+)<\/a>/g;

// 解析各种链接
return content
.replace(BILIBILI_REG, "<div class='video-wrapper'><iframe src='https://www.bilibili.com/blackboard/html5mobileplayer.html?bvid=$1&as_wide=1&high_quality=1&danmaku=0' scrolling='no' border='0' frameborder='no' framespacing='0' allowfullscreen='true' style='position:absolute;height:100%;width:100%;'></iframe></div>")
.replace(YOUTUBE_REG, "<div class='video-wrapper'><iframe src='https://www.youtube.com/embed/$2' title='YouTube video player' frameborder='0' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture' allowfullscreen></iframe></div>")
.replace(NETEASE_MUSIC_REG, "<div class='music-wrapper'><meting-js auto='https://music.163.com/#/song?id=$1'></meting-js></div>")
.replace(QQMUSIC_REG, "<meting-js auto='https://y.qq.com/n/yqq/song$1.html'></meting-js>")
.replace(QQVIDEO_REG, "<div class='video-wrapper'><iframe src='//v.qq.com/iframe/player.html?vid=$1' allowFullScreen='true' frameborder='no'></iframe></div>")
.replace(SPOTIFY_REG, "<div class='spotify-wrapper'><iframe style='border-radius:12px' src='https://open.spotify.com/embed/$1/$2?utm_source=generator&theme=0' width='100%' frameBorder='0' allowfullscreen='' allow='autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture' loading='lazy'></iframe></div>")
.replace(YOUKU_REG, "<div class='video-wrapper'><iframe src='https://player.youku.com/embed/$1' frameborder=0 'allowfullscreen'></iframe></div>");
}

function formatDate(dateString) {
if (!dateString) return '未知时间';
return new Date(dateString).toLocaleString();
}
});

示例note.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* 基础卡片样式 */
.rssmergecard {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
margin-bottom: 20px;
padding: 20px;
transition: all 0.3s ease;
}

.rssmergecard:hover {
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}

/* 标题样式 */
.rssmergecard-title {
color: #333;
font-size: 18px;
margin: 0 0 10px 0;
}

/* 内容样式 - 支持Markdown渲染 */
.rssmergecard-description {
color: #555;
line-height: 1.6;
font-size: 15px;
}

.rssmergecard-description p {
margin: 10px 0;
}

.rssmergecard-description a {
color: #3498db;
text-decoration: none;
}

.rssmergecard-description a:hover {
text-decoration: underline;
}

.rssmergecard-description img {
max-width: 100%;
height: auto;
border-radius: 4px;
}

/* 元信息样式 */
.rssmergecard-meta {
margin-top: 15px;
font-size: 13px;
color: #999;
}

/* 加载更多按钮样式 */
.load-more {
background: #3498db;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
margin: 20px auto;
display: block;
}

.load-more:hover {
background: #2980b9;
}

.loaded-all {
text-align: center;
color: #999;
font-size: 14px;
margin: 20px 0;
}

/* 特殊链接卡片样式 */
.media-card {
background: #f8f9fa;
border-left: 4px solid #3498db;
padding: 15px;
margin: 15px 0;
border-radius: 0 4px 4px 0;
}

.media-card-title {
font-weight: bold;
margin-bottom: 5px;
}

.video-wrapper {
position: relative;
padding-bottom: 56.25%; /* 16:9 */
height: 0;
margin: 15px 0;
}

.video-wrapper iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 8px;
}

.music-wrapper, .spotify-wrapper {
margin: 15px 0;
border-radius: 8px;
overflow: hidden;
min-height: 86px; /* 确保有足够高度显示播放器 */
}

.music-wrapper meting-js {
width: 100%;
height: 86px;
}

ios快捷指令

使用快捷指令发布内容到站内,获取:https://www.icloud.com/shortcuts/8ba1240ab39d4bf2b4a02b69a5cc12bf

idpz8Ea9DQMfyex

问题🙋

数据库可以直接迁移吗

1、直接上传至部署时挂载的路径中,重新启用,或者在容器文件夹/app/data/noise.db直接替换即可

2、使用后台数据库管理备份功能,支持一键下载、上传

​ 数据库文件下载为zip格式,上传也必须为zip,本地数据库恢复包中必须有noise.db文件

关于魔改指南🌈

👉如何自定义化前端数据后添加到数据库?

需要在setting.go、migrate.go、models.go、controllers.go同时写入前端参数的后端定义,并修改前端参数信息为后端可读取的参数,其中controllers.go为控制器

  • database.go 用于数据库连接管理
  • migrate.go 用于数据库迁移和数据初始化

👉前端基本在web目录下,目前模版文件为components目录文件,pages下index.vue为父级模版

👉建议:不要和我一样在同一个文件里修改添加,造成一个文件上千行代码…请尽量使用父子层级来添加代码

两个高度完善的智能化小红书运营工具

2025-01-03 10:00:00

hs

前言:这是两个高度完善的小红书运营工具,已完成商业化进度,功能包括提供完全免费使用的套餐及额外的pro套餐,可在编写文案、自动评论、发布、养号、发布等等带来强大的辅助,值得推荐!

一、Reditor-红薯编辑器

笔记编辑、排版、内容检测、效果预览,一站式搞定,它是专为编辑笔记类内容(如:小红书、公众号图文模式、闲鱼、soul)而生的编辑器。为了提高文字创作者的排版效率、提升美观度和增强内容适读性。

官网:https://reditorapp.com

文档:https://help.reditorapp.com

基础功能

🚫 敏感词检测

👐 超大编辑区域

👁 笔记预览

📑 一键复制

🗂 分组管理

🔍 快捷搜索

📦 笔记容量无限制

🔄 多端同步

高级功能

🤖️ AI创作助手

⬇️ Markdown

👀 排版主题

🧩 笔记碎片

📄 笔记模板

#️⃣ 话题插入

😀 Emoji分组

二、自动薯-小红书自动化助手

这是一个通过谷歌浏览器插件运行的自动化程序,包括Ai智能评论、点赞、关注 一键提升账号活跃度

官网:https://shinewaycargo.com/xhs-auto/

功能预览

预览图1预览图2预览图3

核心功能

🤖 智能浏览

  • 自动滚动浏览内容
  • 模拟真实用户行为
  • 自定义滚动间隔
  • 灵活设置停留时长

💬 智能互动

  • 概率控制评论系统
  • 自动化互动提高效率
  • 智能防重复机制
  • 关键词精准过滤

❤️ 数据管理

  • 自动记录互动笔记
  • 完整历史记录导出
  • 便捷的数据分析
  • 实时状态监控

⚙️ 灵活配置

  • 自定义互动参数
  • 点赞功能开关
  • 互动频率设置
  • 关键词过滤配置

特点

智能化运营

  • 灵活的时间控制

    自定义滚动间隔和停留时长,完全掌控浏览节奏

  • 智能概率系统

    精准控制评论频率,模拟真实用户行为

  • 自动化效率

    智能处理重复性任务,大幅提升运营效率

安全可控

  • 内置安全机制

    智能频率限制,确保账号安全

  • 内容质量把控

    支持关键词过滤,确保互动内容相关性

  • 防重复保护

    自动记录已互动内容,避免重复操作

便捷管理

  • 简洁操作界面

    直观的设计,无需复杂设置

  • 数据分析支持

    完整的数据导出功能,助力运营决策

  • 实时状态监控

    随时掌握运行状态,及时调整策略

podman-跨平台Docker桌面程序

2025-01-03 10:00:00

podman

Podman 是一款无守护程序的开源 Linux 原生工具,同时GUI支持WIN、MAC,旨在使用开放容器计划 (OCI容器容器映像轻松查找、运行、构建、共享和部署应用程序,Podman 控制下的容器可以由 root 或非特权用户运行。Podman 使用 libpod 库管理整个容器生态系统,包括 Pod、容器、容器镜像和容器卷。Podman 专注于帮助您维护和修改 OCI 容器映像的所有命令和功能,例如拉取和标记。它允许您在生产环境中创建、运行和维护这些容器和容器镜像。

官网:https://container-desktop.com

安装说明

你可以通过官网下载适用于WIN或mac的GUI程序

或者

可以从 Podman.io 网站下载

通过 Brew 安装

如果您确实希望使用 Brew,则必须首先安装 Homebrew。一旦您 已设置 brew,您可以使用命令安装 Podman

1
brew install podman

安装后,您需要创建并启动您的第一台 Podman 计算机:

1
2
podman machine init
podman machine start

然后,您可以使用以下方法验证安装信息:

1
podman info

运行示例容器

此示例容器将运行一个非常基本的 httpd 服务器(名为 basic_httpd),该服务器仅提供其索引 页。

1
podman run --name basic_httpd -dt -p 8080:80/tcp docker.io/nginx

由于容器在分离模式下运行,由命令中的 -d 表示,因此 Podman 将在容器 ID 运行后打印容器 ID。请注意,我们使用端口转发是为了能够 访问 HTTP 服务器。要成功运行,至少需要 slirp4netns v0.3.0。podman run

列出正在运行的容器

Podman ps 命令用于列出正在创建和正在运行的容器。

1
podman ps

注意:如果将 -a 添加到 ps 命令,Podman 将显示所有容器。

检查正在运行的容器

您可以“检查”正在运行的容器的元数据和有关自身的详细信息。我们甚至可以使用 inspect 子命令查看分配给容器的 IP 地址。由于容器在无根模式下运行,因此不会分配 IP 地址,并且该值将在 inspect 的输出中列为 “none”。

1
2
3
podman inspect basic_httpd | grep IPAddress\":
"SecondaryIPAddresses": null,
"IPAddress": "",

测试 httpd 服务器

由于我们没有容器的 IP 地址,我们可以测试主机之间的网络通信 操作系统和使用 Curl 的容器。以下命令应显示我们的 容器化 httpd 服务器。

1
curl http://localhost:8080

查看容器的日志

您也可以使用 Podman 查看容器的日志:

1
2
3
4
5
6
podman logs <container_id>
10.88.0.1 - - [07/Feb/2018:15:22:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"
10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"
10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"
10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"
10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"

查看容器的 PID

并且你可以用 top 在容器中观察 httpd pid。

1
2
3
4
podman top <container_id>
UID PID PPID C STIME TTY TIME CMD
0 31873 31863 0 09:21 ? 00:00:00 nginx: master process nginx -g daemon off;
101 31889 31873 0 09:21 ? 00:00:00 nginx: worker process

对容器进行检查点

对容器执行检查点操作会停止容器,同时将容器中所有进程的状态写入磁盘。 这样,容器可以在以后恢复并继续运行,与 检查站。此功能需要在系统上安装 CRIU 3.11 或更高版本。 此功能不支持作为无根功能;因此,如果您想尝试一下,则需要使用相同的命令但使用 sudo 以 root 身份重新创建容器。

要对容器进行检查点操作,请使用:

1
sudo podman container checkpoint <container_id>

还原容器

只能对以前检查点的容器恢复容器。还原的容器将 continue 在它被执行检查点的同一时间点运行。 要恢复容器,请使用:

1
sudo podman container restore <container_id>

还原后,容器将像执行检查点之前一样再次响应请求。

1
curl http://<IP_address>:8080

迁移容器

要将容器从一个主机实时迁移到另一个主机,容器会在源上执行 checkpoint 操作 系统,传输到目标系统,然后在目标系统上恢复 系统。传输 checkpoint 时,可以指定 output-file。

在源系统上:

1
2
sudo podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz
scp /tmp/checkpoint.tar.gz <destination_system>:/tmp

在目标系统上:

1
sudo podman container restore -i /tmp/checkpoint.tar.gz

还原后,容器将像执行检查点之前一样再次响应请求。这 容器将继续在目标系统上运行的时间。

1
curl http://<IP_address>:8080

停止容器

要停止 httpd 容器:

1
podman stop <container_id>

您还可以使用 ps 子命令检查一个或多个容器的状态。在这种情况下,我们应该 使用 -a 参数列出所有容器。

1
podman ps -a

移除容器

要删除 httpd 容器:

1
podman rm <container_id>

您可以通过运行 podman ps -a 来验证容器的删除。

AigcPanel-跨平台一站式AI数字人系统

2025-01-03 10:00:00

AigcPanel 是一个简单易用的一站式AI数字人系统,小白也可使用。 支持视频合成、声音合成、声音克隆,简化本地模型管理、一键导入和使用AI模型。

项目地址:https://github.com/modstart-lib/aigcpanel

img

功能特性

  • 支持视频数字人合成,支持视频画面和声音换口型匹配
  • 支持语音合成、语音克隆,多种声音参数可设置
  • 支持多模型导入、一键启动、模型设置、模型日志查看
  • 支持国际化,支持简体中文、英语
  • 支持多种模型一键启动包:MuseTalkcosyvoice

功能

视频合成

img

语音克隆

img

语音合成

img

模型管理

img

模型添加

img

模型日志

img

关于

img

安装使用

Windows

安装完成后,打开软件,下载模型一键启动包,即可使用。

技术栈

  • electron
  • vue3
  • typescript

本地运行开发

仅在 node 20 测试过

1
2
3
4
5
6
# 安装依赖
npm install
# 调试运行
npm run dev
# 打包
npm run build

苹果破解越狱合集(二)巨魔等不了?可以试试定制安装,支持任意苹果系统

2024-12-31 10:00:00

前言

这是对此前文章的续篇,同时也是对苹果越狱软件安装的科普,此外我们最近和一位开发者合作了,支持个人证书的“优惠”定制秒出,稳定带售后,支持独立软件源,此后会单独出一个IPA下载专栏,请留意

自签名安装-支持所有系统

不越狱通过自签工具安装软件你需要有P12证书,通过证书对APP签名即可安装

常见的签名工具包括:全能签https://qnq.ipadump.com/#/home/qnq?cType=a12 、万能签https://sign.wnqapp.com/ios/ 、轻松签https://esign.yyyue.xyz 、爱思助手https://www.i4.cn/ 、NB助手http://8.218.233.56 、牛蛙助手https://ios222.com

以爱思助手为例

找到工具箱-点击IPA签名

找到导入证书,选择证书导入

1735648162729

导入IPA包进行签名并安装

软件源

谈到软件源就不得不提下魔盒app了

它涵盖了苹果及安卓端的越狱破解,是个全能APP商店

官网:https://app.xkcc.vip (需要自签)安装后会提示输入推广码

你可以点击https://app.xkcc.vip/invitation_register?invitation_code=KIklg4ZV

或输入KIklg4ZV来打开软件,如果你之前购买过证书(私聊)可提供使用指导及赠送

巨魔-越狱用户的专利

作为玩机者对巨魔一类的想必也不陌生了,特别是巨魔商店 lite的发布,也是玩家一直关注的

截止发文,越狱支持iOS14 - 16.6.1 & iOS17.0 Beta系统

安装巨魔可以通过自签工具安装,也可通过https://sidestore.io安装使用

巨魔2代安装

必备条件1:

  • 必须有一台电脑,可以是 WindowsMacOSLinux 三种不同的操作系统都可以。

安装原理

TrollRestore是安装巨魔商店的必备工具,它将用 TrollHelper 二进制文件替换您选择的系统应用,然后您可以打开并使用它安装巨魔商店TrollStore。TrollRestore将使用备份将二进制文件还原到系统应用容器。

安装教程

安装前必须的准备步骤:

  1. 关闭 “查找我的 iPhone”
  2. 确保手机上有 提示APP

WIN

TrollRestore:https://noise.lanzoul.com/iaOkN2jjlisd

  1. 确保电脑安装了 爱思助手,或者已经安装 iTunes
  2. 连接设备,并且在 iOS 设备上点击信任,同意连接电脑。并且确保,查找我的 iPhone 已关闭!
  3. 双击打开 TrollRestore 运行,当它提示你输入要安装的系统应用名字时,输入:Tips
  4. 完成后,iOS 设备将会重启。
  5. 步骤还没有完成,进入系统之后,找到 “提示” 应用程序,点击 install TrollStore,开始安装巨魔2
  6. 安装完成,现在你可以尽情享受巨魔商店了。
  7. 返回桌面,打开桌面蓝色巨魔图标 Trollstore,自动安装 ldid,如果没有,底部 Setting 点进去,点击 install ldid
  8. 往下滑动,点击 install Persitence Helper,选择 Tips,这步是安装巨魔永久性助手,万一巨魔白图标或者打不开,还可以打开提示APP,重新安装巨魔(这步必须做)。

MAC

TrollRestore_英特尔芯片:https://noise.lanzoul.com/iiqbZ2jjlqfi

TrollRestore_M1、M2芯片:https://noise.lanzoul.com/iNws92jjm0xg

  1. 下载上面的 TrollRestore 工具。

  2. 连接你的 iOS 设备到电脑上,并且在 iOS 设备上点击信任,同意连接电脑。并且确保:iPhone 设置里面,iCloud 里面,查找我的 iPhone 已关闭!

  3. 打开 Mac 电脑上的终端,把 TrollRestore 拖入到终端当中,回车运行。

  4. 当它提示要求你输入要安装的系统应用名字时,输入:Tips

    如果你是不支持的 iOS 版本,它会提示类似:iOS 14.4 (18D52) is not supported

  5. 完成后,iOS 设备将会重启。

  6. 步骤还没有完成,进入系统之后,找到 “提示” 应用程序,点击 install TrollStore,开始安装巨魔商店2。

  7. 安装完成,现在你可以尽情享受巨魔商店了。

  8. 返回桌面,打开桌面蓝色巨魔图标 Trollstore,自动安装 ldid,如果没有,底部 Setting 点进去,点击 install ldid

  9. 往下滑动,点击 install Persitence Helper,选择 Tips,这步是安装巨魔永久性助手,万一巨魔白图标或者打不开,还可以打开提示APP,重新安装巨魔(这步必须做)。

linux

TrollRestore_Linux:https://noise.lanzoul.com/i87UR2jjmaqj

  1. 下载上面的 TrollRestore 工具,确保已经安装 Python3,如果没有,使用命令:

    1
    sudo apt install python3 python3-pip libssl-dev build-essential usbmuxd...
  2. 连接你的 iOS 设备到电脑上,并且在 iOS 设备上点击信任,同意连接电脑。并且确保:iPhone 设置里面,iCloud 里面,查找我的 iPhone 已关闭!

  3. 打开 Linux 电脑上的终端,使用命令:

    1
    cd 把TrollRestore_Linux目录拖入到终端当中...
  4. 继续在终端输入:

    1
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/...

    安装必须依赖。(这里使用清华大学源,加速下载)

  5. 安装完依赖之后,在终端输入:

    1
    python3 trollstore.py...
  6. 当它提示要求你输入要替换的系统应用名字时,输入:Tips。

    如果是不支持的 iOS 版本,它会提示类似:iOS 14.4 (18D52) is not supported。

  7. 完成后,iOS 设备将会重启。

  8. 步骤还没有完成,进入系统之后,找到 “提示” 应用程序,点击 install TrollStore,开始安装巨魔商店2。

  9. 安装完成,现在你可以尽情享受巨魔商店了。

  10. 返回桌面,打开桌面蓝色巨魔图标 Trollstore,自动安装 ldid,如果没有,底部 Setting 点进去,点击 install ldid。

  11. 往下滑动,点击 install Persitence Helper,选择 Tips,这步是安装巨魔永久性助手,万一巨魔白图标或者打不开,还可以打开提示APP,重新安装巨魔

巨魔lite安装

1,在sileo越狱商店中安装巨魔商店lite。

越狱源:https://havoc.app/package/trollstorelite

2,打开巨魔商店lite,点击右下角设置,选择第四个蓝色选项“transfer X troll store APP”,开始同步巨魔商店中的数据。

数据同步完成后,点击第二个蓝色选项“Refresh app registrations”

常用软件站

此前也已在导航站收录过一些IPA软件站点了,你可以前往查看

  • IPA之家
    地址: https://ios.tinstu.com
    介绍: 提供ipa资源下载服务,为您收集最全iphone,ipad,ipod软件的ipa文件,ios系统的资源ipa下载

  • 魔盒软件商店
    地址: https://app.xkcc.vip
    介绍: 提供安卓及ipa资源下载服务,有定期更新插件及补丁等

  • 6Z
    地址: https://blog.6ziz.com
    介绍: 6z由intz智能助理引导,全面覆盖苹果ios、iphone和ipad教程、工具&软件和插件源、ipa下载与安装指南。同时,提供新出的手机资讯及新款手机推荐。

  • Decrypt IPA Store
    地址: https://decrypt.day
    介绍: 非常容易找到并下载应用程序的最新解密 ipa

  • iPA库
    地址: https://diyios.com
    介绍: 专注于iOS软件资源下载,包括游戏iPA、软件应用iPA、破解版iPA、砸壳iPA等资源的下载,做最稳定最优秀的iOS系列软件下载网站。

  • 另一个iPA库
    地址: https://www.ipa.pub/
    介绍: 在线iOS软件资源下载,包括游戏iPA、软件应用iPA、破解版iPA、砸壳iPA等资源的下载

  • iPA资源站
    地址: https://www.ipapark.com
    介绍: 提供iPA资源下载服务,为您收集最全iPhone,iPad,iPod软件的IPA文件,IOS系统的资源ipa下载

  • ipa软件下载|ios软件下载
    地址: https://ipadump.com
    介绍: 中文ipa文件下载网站, 提供在线iOS应用下载服务,为您搜集最全、最专业的iPhone软件与IPA文件

  • MACPA
    地址: https://macpa.cn
    介绍: MACPA是一个专为IPA砸壳解密而诞生的平台,提供IOS手机软件应用IPA包的砸壳解密及相关资源的下载、安装、教程等服务,这里是一个优质的砸壳软件社区,在这里你可以找到与你拥有同样兴趣的好朋友一起游玩。

  • appdb
    地址: https://appdb.to
    介绍: iOS、iPadOS和MacOS的最大独立市场。免费独立发布您的应用程序。安全、私密地安装您想要的应用程序。安装和下载iOS、iPadOS、MacOS应用程序和游戏.

  • NB全能助手
    地址: http://8.218.233.56
    介绍: NB全能助手

  • ipa在线签名工具
    地址: https://sign.ipadump.com
    介绍: ipa在线签名工具

  • 万能签
    地址: https://sign.wnqapp.com/ios/
    介绍: 万能签官方端

  • 牛蛙助手
    地址: https://ios222.com
    介绍: 牛蛙助手官网-牛蛙助手是一款专业的ios移动端必备的工具,牛蛙助手免费为苹果用户提供:ios移动端免越狱使用apple id签名,ios移动端免越狱全局修改gps定位信息,牛蛙,牛蛙助手,ios222,牛蛙神器

  • 轻松签
    地址: https://esign.yyyue.xyz
    介绍: 轻松签

  • iOSIPA软件网
    地址: https://www.88ipa.com/
    介绍: 立志做全球最大的IPA分享网站, 提供在线iOS应用下载服务,为您搜集最全、最专业的iPhone,iPad,iPod软件与IPA文件, 支持iOS4,iOS5,iOS6软件,iOS7软件,iOS8,iOS9软件在线安装以及IPA文件下载。

  • iPA商店
    地址: https://ipa.store/
    介绍: iPA商店致力于iOS10以上的iPA资源下载和分享,包括游戏iPA、软件应用IPA、破解版iPA、砸壳IPA等资源的分享和下载,做最稳定最优秀的iPA下载网站。

  • iOS CodeVN
    地址: https://ios.codevn.net
    介绍: 适用于 iPhone/iPad 的免费 iPA 存储库