前言由于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配置文件放一起,这种逻辑简直跟狗屎一样.
解决方案 新版解决方案:新版和旧版主要区别在对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 SIGINTtrap handle_error ERRif ! 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 ERRif ! 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/ 来在线计算.