惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
美团技术团队
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
小众软件
小众软件
T
Tailwind CSS Blog
WordPress大学
WordPress大学

LanYunのBlog

优化macOS Dock栏的显示与隐藏 解决macOS全屏模式下某些情况显示原始鼠标指针的问题 Yarn从Classic迁移到Modern nginx自编译 用santa对二进制进行监控和授权 ESXI 8.0安装黑群晖DSM 7.x openwrt编译过程记录 编译monero For macOS ARM 自建busuanzi不蒜子平台统计平台 浅记博客更新日志 (机翻)Kubo配置文件 修改brew services中服务的启动参数 技术杂记📝 为Arch Linux配置邮件服务 自编译NutClient-ESXI,更改邮件逻辑 解决ESXI和群晖使用SSH密钥登录问题 为J4125软路由ESXI中群晖提供UPS服务 在arch linux上搭建rustdesk server 解决虚拟机扩容中GPT PMBR大小不符问题 搭建Tuic V5 优雅地为macOS提供python多版本的支持 修复root路径下文件权限问题 解决macOS 14上利用Whisky运行steam时有关问题 在macOS中用PhpStorm配置Xdebug调试 利用CloudFlare Workers快速自建一个IP获取器 如何自动续期证书? 从0开始速配VPS用于网站等 搭建一个基于ChatGPT的QQ机器人(Yunzai-Bot) For Mac 010 Editor For Mac 13.0.1 Crack 破解 关于部署Cloudflare Zero Trust遇到的问题浅记录📝
解决Surge模块不能同步问题
LanYun · 2023-08-04 · via LanYunのBlog

前言

由于surge 开发者无视一些体验需求,只搞技术,没办法,只能曲线解决了.

起因(建议不看,有不好情绪😠): 在迁移apple账号的时候,特么的surge的授权(绑了授权邮箱)掉了,你说掉就掉吧,他妈的把老子安装的在线模块给删了,只给老子留个本地模块,我草尼玛,搞了那么多在线模块,老子怎么记得住,为了防盗版就这么恶心?本来都打算将就用,结果直接给爷👴在线模块弄没了,他妈的,然后就有本文用本地模块更新.由于不知道啥时候通过iCloud同步配置的文件夹不会同步在Mac上的icloud上,导致没法通过mac修改ios上的配置文件,这就很难受了,因为我的配置文件都是经过脚本自动化处理过了,只好用dropbox来进行同步,然后用Mountain Duck软件映射到本地路径(没办法,官方的dropbox在我macOS 14上闪退,极其难受)来控制配置文件.最难受的是正式版surge没法用dropbox,应该是bug,测试版能用,而我换id了,原来那个id中我没点停止测试,导致我新id一直测试不上,然后又碰上老刘的tf系统维护,等了一天多,最后终于搞定.(神特么等90天,等90天真傻逼,原id手动点停止测试,然后重新申请再换id接受申请就可以了.)

需求: 相同iCloud,ios不同设备间模块同步

前提: Mac设备,有dropbox账号,本地已映射dropbox路径

实现: 不借助iCloud,实现ios不同设备间本地模块定时更新自动同步.

实现 > 需求. ✅成功!

得到模块链接

要实现模块同步,首先你得有模块.本地模块没得说,隔空投送到mac就行了,而这里主要说一下远程模块链接提取.方法是没有方法🤡,像个傻逼一样一个一个手动提取,提取出来保存到一个文件中,待会用.我反正再也不用这个在线安装模块功能了,简直傻逼功能.

Dropbox同步

① 首先,将你原本iOS surge的Rule,Profiles,sgmodule等文件夹备份,随便备份到哪里.如果你不需要备份就跳过.

② iOS端surge的配置同步切换到Dropbox,会提示是否合并,直接合并.

③ 修改文件夹分类,可以参考我下面.自定义Rule规则文件和conf配置文件直接放Profiles文件夹中,模块放到sgmodule文件夹中,其中有custom子文件夹用于自定义的模块可以被检测到.

吐槽:surge的文件管理跟狗屎一样,Rule单独列一个文件夹检测不到,非要放到Profiles文件夹才能检测到,还不能放到子文件夹里面,只能直接和conf配置文件放一起,这种逻辑简直跟狗屎一样.

image-20230804165548973

解决方案

新版解决方案:

新版和旧版主要区别在对qx等其他模块的处理上.

由于懒,故略写,可自行看项目: Script-Hub

至于我为什么换新的解决办法,主要是会对raw.githubusercontent.com等github域名进行MitM解密,而某些应用为了安全,锁定了证书链,导致tls连接中断.还有一点旧版qx转换模块作者不维护了,故打算换成新项目.

可看作者的安装模块的wiki.这里不再赘述.

安装好后,即可用网址: https://script.hub/ 进行转换.

下面给出新版bash脚本代码,仅供参考.

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
#!/bin/bash


handle_error() {
echo ""
echo '⚠️ 脚本发生错误!,请手动检查错误,2分钟后退出...'
[[ "$(uname)" == "Darwin" ]] && osascript -e 'display notification "模块同步脚本" with title "❌ 脚本发生错误!" sound name "Glass"'
sleep 120
exit 1
}


function handle_ctrl_c {
echo ""
echo "接收到 Ctrl+C,开始退出..."
exit 1
}


trap handle_ctrl_c SIGINT


trap handle_error ERR


if ! command -v wget &> /dev/null; then

if [ -f "/opt/homebrew/bin/wget" ]; then
alias wget="/opt/homebrew/bin/wget"
else
echo "❌ 未安装wget! " && exit 1
fi
fi


function NetCheck {
local count="${1:-1}"
local timeout="${2:-1}"
local host="${3:-"223.5.5.5"}"

if [ -z "$host" ]; then
host="223.5.5.5"
fi


if ping -c "${count}" -W "${timeout}" "${host}" >/dev/null 2>&1; then

return 0
else

return 1
fi
}

if ! NetCheck "$@"; then
echo "❌ 网络连通异常"
exit 1
else
echo "✅ 网络连通正常"
fi

user=$(whoami)
Dest_1="/Users/${user}/Library/Application Support/Surge/Profiles/sgmodule"
Dest_2="/Users/${user}/Library/Group Containers/xxxxx/Library/Application Support/duck/Volumes.noindex/Dropbox/应用/Surge Profiles/sgmodule"


urls=(
"http://script.hub/file/_start_/https://raw.githubusercontent.com/89996462/Quantumult-X/main/ycdz/bdwk.js/_end_/bdwk.sgmodule?n=百度文库+解锁VIP文档阅读权限&type=qx-rewrite&target=surge-module"
"https://raw.githubusercontent.com/Rabbit-Spec/Surge/Master/Module/Spec/Bilibili-Login/Moore/Bilibili-Login.sgmodule"
)

function download_background {
url="$1"
filename=$(basename "${url}")

if [[ "$url" == *'?'* ]]; then
filename=$(basename "${url%%\?*}")


fi

remote_file_size=$(wget --header="User-Agent: Surge" --spider "${url}" 2>&1 | grep -oE '长度:[0-9]+' | awk -F ':' '{print $2}')

if [ -s "${filename}" ]; then
local_file_size=$(wc -c < "${filename}")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename} 文件大小相同"
return 0
fi
fi

wget -q --background "$url" -O "${filename}" --header="User-Agent: Surge"

}

success=true
error_message=""
echo "⚙️ 开始后台下载."


for url in "${urls[@]}"; do
cd "${Dest_1}" || exit 1
find . -name ".DS_Store" -type f -delete &
download_background "$url"
done


while pgrep -x wget > /dev/null; do
sleep 1
done
files=$(ls)


for file in $files; do

if [ ! -s "$file" ]; then
success=false
error_message+="\n⚠️ ${file} 文件下载失败!"
fi
done

if $success; then
echo "✅所有文件下载成功"
find . -name ".DS_Store" -type f -delete
rsync --size-only -r --delete --progress "${Dest_1}/" "${Dest_2}"
echo "✅文件夹同步完成"
read -r -t 5 -n 1 || true
else
echo "$(date)${error_message}" > file_error.log
echo '❌ 存在文件下载失败,请检查file_error.log!'
echo '❌ 已停止文件夹同步!'
read -r -t 10 -n 1 || true
fi

貌似旧版中的bash代码有些小bug,懒的改了,在新版已修复.

旧版解决方案:

自动更新代码

下面用bash脚本写的.主要在Mac上的bash跑,如果要linux跑,那么请注意,有些命令语法和linux不一样,请自行修改(我懒的改了)

这里主要给小白解释一下.

Dest_1 是Mac本地surge的模块路径地址 Dest_2 是本地映射的dropbox路径地址

urls 是个数组用来保存你上面弄的模块链接,按照我这种格式添加url就行了.

基本上要改的就这3个地方: Dest_1 Dest_2 urls

如果下载有问题那么 Dest_1 路径下有file_error.log日志文件,可以看看是哪个文件出错了,对应修复即可.

如果Mac端surge模块中安装并启用了QX重写&规则集转化这个模块,那么下面脚本也能处理qx结尾的文件.

浅浅说一下这个脚本功能吧.

批量下载urls数组中的链接到Dest_1路径下,期间遇到链接有?参数的,直接删除参数,遇到非sgmodule结尾自动处理成sgmodule,有文件下载失败会记录日志文件.如果下载都没问题就会同步到Dest_2路径下.

已知特性: 由于通过qx转换的模块文件中的name内容经过替换,故无法通过文件大小来判断是否为最新版,也就是说每次运行这个脚本,qx转换的模块文件必定会进行下载替换.

⚠️注意: 请确保你系统中已安装wget,命令查询where wget,如果没有,请用brew进行安装.安装好后.将下面wget替换为你wget的实际路径(例如:/opt/homebrew/bin/wget). 不用,我写了判断了.

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
#!/bin/bash


handle_error() {
echo ""
echo '⚠️ 脚本发生错误!,请手动检查错误,2分钟后退出...'
[[ "$(uname)" == "Darwin" ]] && osascript -e 'display notification "模块同步脚本" with title "⚠️脚本发生错误❌~" sound name "Glass"'
sleep 120
exit 1
}


trap handle_error ERR


if ! command -v wget &> /dev/null; then

if [ -f "/opt/homebrew/bin/wget" ]; then
wget="/opt/homebrew/bin/wget"
else
echo "❌ 未安装wget" && exit 1
fi
fi

user=$(whoami)
Dest_1="/Users/${user}/Library/Application Support/Surge/Profiles/sgmodule"
Dest_2="/Users/${user}/Library/Group Containers/xxxxx/Library/Application Support/duck/Volumes.noindex/Dropbox/应用/Surge Profiles/sgmodule"

urls=(
"https://raw.githubusercontent.com/89996462/Quantumult-X/main/ycdz/bdwk.jsqx"
"https://raw.githubusercontent.com/Rabbit-Spec/Surge/Master/Module/Spec/Bilibili-Login/Moore/Bilibili-Login.sgmodule"
)


function download_background {
url="$1"
filename=$(basename "${url}")

if [[ "$url" == *'?'* ]]; then
echo "⚠️ 链接中存在参数,开始去除"
url="${url%%\?*}"
fi

remote_file_size=$(wget --header="User-Agent: Surge" --spider "${url}" 2>&1 | grep -oE '长度:[0-9]+' | awk -F ':' '{print $2}')

if [ -s "${filename}.sgmodule" ]; then
local_file_size=$(wc -c < "${filename}.sgmodule")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename}.sgmodule 文件大小相同"
return 0
fi
fi
if [ -s "${filename}" ]; then
local_file_size=$(wc -c < "${filename}")
if [ -n "$remote_file_size" ] && [ -n "$local_file_size" ] && [ "$remote_file_size" -eq "$local_file_size" ]; then
echo "⚙️ ${filename} 文件大小相同"
return 0
fi
fi

if [[ "$url" == *".jsqx" ]]; then

wget -q "$url" -O "${filename}.sgmodule" --header="User-Agent: Surge"
function_name=$(curl -s "${url/qx/}" | grep -o ':.*' | sed 's/://' | head -n 1)

sed -i '' -E 's/^#\!name=.*$/'"#\!name=${function_name}"'/' "${filename}.sgmodule"

elif [[ "$url" != *".sgmodule" ]]; then
wget -q --background "$url" -O "${filename}.sgmodule" --header="User-Agent: Surge"
else
wget -q --background "$url" -O "${filename}" --header="User-Agent: Surge"
fi

}

success=true
error_message=""
echo "⚙️ 开始后台下载."


for url in "${urls[@]}"; do
cd "${Dest_1}" || exit 1
download_background "$url"
done


while pgrep -x wget > /dev/null; do
sleep 1
done
files=$(ls)


for file in $files; do

if [ ! -s "$file" ]; then
success=false
error_message+="\n⚠️ ${file} 文件下载失败!"
fi
done

if $success; then
echo "✅所有文件下载成功"
rsync --size-only -r --delete --progress "$Dest_1/" "$Dest_2"
echo "✅文件夹同步完成"
else
echo "$(date)${error_message}" > file_error.log
echo '❌ 有文件下载失败,请检查file_error.log!'
echo '❌ 已停止文件夹同步!'
fi

如何使用代码

将上面代码保存到文件,文件名(你可以自己取)为 一键更新模块.sh

cd到这个文件的目录下,然后赋权 chmod 777 ./一键更新模块.sh

然后bash ./一键更新模块.sh测试一下效果,没问题就可以接下添加定时启动了

输入命令crontab -e添加内容

1
2
10 1 * * */7 /opt/homebrew/bin/bash ~/Library/Application\ Support/Surge/Profiles/一键更新模块.sh

意思是 每7天 1点10分 会运行这个脚本

关于crontab时间计算,可以访问 https://tool.lu/crontab/ 来在线计算.