From fbdd85c5450c3462a3d64a195bb0e538e69860c0 Mon Sep 17 00:00:00 2001 From: fscarmen <62703343+fscarmen@users.noreply.github.com> Date: Fri, 16 Sep 2022 17:39:27 +0800 Subject: [PATCH] Update unlock.sh --- unlock.sh | 897 +++++++++++++++++++++++++++++------------------------- 1 file changed, 487 insertions(+), 410 deletions(-) diff --git a/unlock.sh b/unlock.sh index 4857025..49501c0 100644 --- a/unlock.sh +++ b/unlock.sh @@ -3,273 +3,322 @@ export LANG=en_US.UTF-8 # 当前脚本版本号和新增功能 -VERSION='1.08' +VERSION='1.09' # 最大支持流媒体 SUPPORT_NUM='2' -# 设置关联数组 T 用于中英文 -declare -A T - -T[E0]="\n Language:\n 1.English (default) \n 2.简体中文\n" -T[C0]="${T[E0]}" -T[E1]="Support change IP for Client WARP mode" -T[C1]="支持 Client WRAP 模式下更换 IP" -T[E2]="The script must be run as root, you can enter sudo -i and then download and run again. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" -T[C2]="必须以root方式运行脚本,可以输入 sudo -i 后重新下载运行,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" -T[E3]="Choose:" -T[C3]="请选择:" -T[E4]="\n Neither the WARP network interface nor Socks5 are installed, please select the installation script:\n 1. fscarmen (Default)\n 2. kkkyg\n 3. P3terx\n 4. Misaka\n 0. Exit\n" -T[C4]="\n WARP 网络接口和 Socks5 都没有安装,请选择安装脚本:\n 1. fscarmen (默认)\n 2. kkkyg\n 3. P3terx\n 4. Misaka\n 0. 退出\n" -T[E5]="The script supports Debian, Ubuntu, CentOS or Alpine systems only. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" -T[C5]="本脚本只支持 Debian、Ubuntu、CentOS 或 Alpine 系统,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" -T[E6]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv6 Interface\n" -T[C6]="\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv6 网络接口\n" -T[E7]="Installing \$c..." -T[C7]="安装 \$c 中……" -T[E8]="It is necessary to upgrade the latest package library before install \$c.It will take a little time,please be patiently..." -T[C8]="先升级软件库才能继续安装 \$c,时间较长,请耐心等待……" -T[E9]="Failed to install \$c. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" -T[C9]="安装 \$c 失败,脚本中止,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" -T[E10]="\n Media unlock daemon installed successfully. The running log of the scheduled task will be saved in /root/result.log\n" -T[C10]="\n 媒体解锁守护进程已安装成功。定时任务运行日志将保存在 /root/result.log\n" -T[E11]="\n The media unlock daemon is completely uninstalled.\n" -T[C11]="\n 媒体解锁守护进程已彻底卸载\n" -T[E12]="\n 1. Mode 1: Check it every 5 minutes.\n 2. Mode 2: Create a jobs with systemd service. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 3. Mode 3: Create a jobs with nohup to run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 4. Mode 4: Create a screen named [u] and run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 5. Mode 5: Install pm2 daemon. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 6. Uninstall\n 0. Exit\n" -T[C12]="\n 1. 模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功\n 2. 模式2: 创建 systemd 服务。进程一直在后台,当刷成功后,每隔1小时检查一次\n 3. 模式3: 用 nohup 创建一个 jobs。进程一直在后台,当刷成功后,每隔1小时检查一次\n 4. 模式4: 创建一个名为 [u] 的 Screen 会话。进程一直在后台,当刷成功后,每隔1小时检查一次\n 5. 模式5: 安装 pm2 守护进程,安装依赖需较长时间。进程一直在后台,当刷成功后,每隔1小时检查一次\n 6. 卸载\n 0. 退出\n" -T[E13]="\\\n The current region is \$REGION. Confirm press [y] . If you want another regions, please enter the two-digit region abbreviation. \(such as hk,sg. Default is \$REGION\):" -T[C13]="\\\n 当前地区是:\$REGION,需要解锁当前地区请按 y , 如需其他地址请输入两位地区简写 \(如 hk,sg,默认:\$REGION\):" -T[E14]="Wrong input." -T[C14]="输入错误" -T[E15]="\n Select the stream media you wanna unlock (Multiple selections are possible, such as 123. The default is select all)\n 1. Netflix\n 2. Disney+\n" -T[C15]="\n 选择你期望解锁的流媒体 (可多选,如 123,默认为全选)\n 1. Netflix\n 2. Disney+\n" -T[E16]="The script Born to make stream media unlock by WARP. Detail:[https://github.com/fscarmen/warp_unlock]\n Features:\n * Support a variety of main stream streaming media detection.\n * Multiple ways to unlock.\n * Support WARP Socks5 Proxy to detect and replace IP.\n * log output\n" -T[C16]="本项目专为 WARP 解锁流媒体而生。详细说明:[https://github.com/fscarmen/warp_unlock]\n 脚本特点:\n * 支持多种主流串流影视检测\n * 多种方式解锁\n * 支持 WARP Socks5 Proxy 检测和更换 IP\n * 日志输出\n" -T[E17]="Version" -T[C17]="脚本版本" -T[E18]="New features" -T[C18]="功能新增" -T[E19]="\\\n Stream media unlock daemon is running in mode: \$UNLOCK_MODE_NOW.\\\n" -T[C19]="\\\n 流媒体解锁守护正在以模式: \$UNLOCK_MODE_NOW 运行中\\\n" -T[E20]="Media unlock daemon installed successfully. A session window u has been created, enter [screen -Udr u] and close [screen -SX u quit]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n" -T[C20]="\n 媒体解锁守护进程已安装成功,已创建一个会话窗口 u ,进入 [screen -Udr u],关闭 [screen -SX u quit],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n" -T[E21]="Media unlock daemon installed successfully. A jobs has been created, check [pgrep -laf warp_unlock] and close [kill -9 \$(pgrep -f warp_unlock)]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n" -T[C21]="\n 媒体解锁守护进程已安装成功,已创建一个jobs,查看 [pgrep -laf warp_unlock],关闭 [kill -9 \$(pgrep -f warp_unlock)],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n" -T[E22]="The script runs on today: \$TODAY. Total:\$TOTAL\\\n" -T[C22]="脚本当天运行次数:\$TODAY,累计运行次数:\$TOTAL\\\n" -T[E23]="Please choose to brush WARP IP:\n 1. WARP IPv4 Interface\n 2. WARP IPv6 Interface\n" -T[C23]="\n 请选择刷 WARP IP 方式:\n 1. WARP IPv4 网络接口\n 2. WARP IPv6 网络接口\n" -T[E24]="No WARP method specified." -T[C24]="没有指定的 WARP 方式" -T[E25]="No unlock method specified." -T[C25]="没有指定的解锁模式" -T[E26]="Expected region abbreviation should be two digits (eg hk,sg)." -T[C26]="期望地区简码应该为两位 (如 hk,sg)" -T[E27]="No unlock script is installed." -T[C27]="解锁脚本还没有安装" -T[E28]="Unlock script is installed." -T[C28]="解锁脚本已安装" -T[E29]="\\\n Please enter Bot Token if you need push the logs to Telegram. Leave blank to skip:" -T[C29]="\\\n 如需要把日志推送到 Telegram 机器人,请输入 Bot Token,不需要直接回车:" -T[E30]="\\\n Enter USERID:" -T[C30]="\\\n 输入 USERID:" -T[E31]="\\\n Enter custom name:" -T[C31]="\\\n 自定义名称:" -T[E40]="Mode 1: Check it every 5 minutes" -T[C40]="模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功" -T[E41]="Mode 2: Create a screen named [u] and run" -T[C41]="模式2: 创建一个名为 [u] 的 Screen 在后台刷" -T[E42]="Mode 3: Create a jobs with nohup to run in the background" -T[C42]="模式3: 用 nohup 创建一个 jobs 在后台刷" -T[E43]="Media unlock daemon installed successfully. A systemd service has been created, check [systemctl status warp_unlock] and close [systemctl disable --now warp_unlock]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n" -T[C43]="\n 媒体解锁守护进程已安装成功,已创建一个 systemd 服务,查看 [systemctl status warp_unlock],关闭 [systemctl disable --now warp_unlock],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n" -T[E44]="Media unlock daemon installed successfully. pm2 daemon is running, check pm2 [list] and close [pm2 delete warp_unlock; pm2 unstartup systemd;]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n" -T[C44]="\n 媒体解锁守护进程已安装成功,pm2 守护进程正在工作中,查看 [pm2 list],关闭 [pm2 delete warp_unlock; pm2 unstartup systemd; ],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n" -T[E45]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n" -T[C45]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n" -T[E46]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv6 Interface\n" -T[C46]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv6 网络接口\n" -T[E47]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv6 Interface\n" -T[C47]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv6 网络接口\n" -T[E48]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n" -T[C48]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n" -T[E49]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n" -T[C49]="\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n" -T[E50]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n" -T[C50]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n" -T[E51]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface\n" -T[C51]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口\n" -T[E52]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface\n" -T[C52]="\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口\n" -T[E53]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n 4. WARP IPv6 Interface\n" -T[C53]="\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n 4. WARP IPv6 网络接口\n" -T[E54]="No option. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" -T[C54]="没有该选项,脚本退出,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" +E[0]="Language:\n 1.English (default) \n 2.简体中文" +C[0]="${E[0]}" +E[1]="Support change IP for warp-go mode" +C[1]="支持 warp-go 模式下更换 IP" +E[2]="The script must be run as root, you can enter sudo -i and then download and run again. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" +C[2]="必须以root方式运行脚本,可以输入 sudo -i 后重新下载运行,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" +E[3]="Choose:" +C[3]="请选择:" +E[4]="Neither the WARP network interface nor Socks5 are installed, please select the installation script:\n 1. fscarmen's wgcf warp (Default)\n 2. fscarmen's warp-go\n 3. P3terx\n 4. Misaka\n 0. Exit" +C[4]="WARP 网络接口和 Socks5 都没有安装,请选择安装脚本:\n 1. fscarmen's wgcf warp (默认)\n 2. fscarmen's warp-go\n 3. P3terx\n 4. Misaka\n 0. 退出" +E[5]="The script supports Debian, Ubuntu, CentOS or Alpine systems only. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" +C[5]="本脚本只支持 Debian、Ubuntu、CentOS 或 Alpine 系统,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" +E[6]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv6 Interface" +C[6]="请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv6 网络接口" +E[7]="Installing \$c..." +C[7]="安装 \$c 中……" +E[8]="It is necessary to upgrade the latest package library before install \$c.It will take a little time,please be patiently..." +C[8]="先升级软件库才能继续安装 \$c,时间较长,请耐心等待……" +E[9]="Failed to install \$c. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" +C[9]="安装 \$c 失败,脚本中止,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" +E[10]="Media unlock daemon installed successfully. The running log of the scheduled task will be saved in /root/result.log" +C[10]="媒体解锁守护进程已安装成功。定时任务运行日志将保存在 /root/result.log" +E[11]="The media unlock daemon is completely uninstalled." +C[11]="媒体解锁守护进程已彻底卸载" +E[12]="\n 1. Mode 1: Check it every 5 minutes.\n 2. Mode 2: Create a jobs with systemd service. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 3. Mode 3: Create a jobs with nohup to run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 4. Mode 4: Create a screen named [u] and run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 5. Mode 5: Install pm2 daemon. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 6. Uninstall\n 0. Exit\n" +C[12]="\n 1. 模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功\n 2. 模式2: 创建 systemd 服务。进程一直在后台,当刷成功后,每隔1小时检查一次\n 3. 模式3: 用 nohup 创建一个 jobs。进程一直在后台,当刷成功后,每隔1小时检查一次\n 4. 模式4: 创建一个名为 [u] 的 Screen 会话。进程一直在后台,当刷成功后,每隔1小时检查一次\n 5. 模式5: 安装 pm2 守护进程,安装依赖需较长时间。进程一直在后台,当刷成功后,每隔1小时检查一次\n 6. 卸载\n 0. 退出\n" +E[13]="The current region is \$REGION. Confirm press [y] . If you want another regions, please enter the two-digit region abbreviation. \(such as hk,sg. Default is \$REGION\):" +C[13]="当前地区是:\$REGION,需要解锁当前地区请按 y , 如需其他地址请输入两位地区简写 \(如 hk,sg,默认:\$REGION\):" +E[14]="Wrong input." +C[14]="输入错误" +E[15]="Select the stream media you wanna unlock (Multiple selections are possible, such as 123. The default is select all)\n 1. Netflix\n 2. Disney+" +C[15]="选择你期望解锁的流媒体 (可多选,如 123,默认为全选)\n 1. Netflix\n 2. Disney+" +E[16]="The script Born to make stream media unlock by WARP. Detail:[https://github.com/fscarmen/warp_unlock]\n Features:\n * Support a variety of main stream streaming media detection.\n * Multiple ways to unlock.\n * Support WARP Socks5 Proxy to detect and replace IP.\n * log output\n" +C[16]="本项目专为 WARP 解锁流媒体而生。详细说明:[https://github.com/fscarmen/warp_unlock]\n 脚本特点:\n * 支持多种主流串流影视检测\n * 多种方式解锁\n * 支持 WARP Socks5 Proxy 检测和更换 IP\n * 日志输出\n" +E[17]="Version" +C[17]="脚本版本" +E[18]="New features" +C[18]="功能新增" +E[19]="\\\n Stream media unlock daemon is running in mode: \$UNLOCK_MODE_NOW.\\\n" +C[19]="\\\n 流媒体解锁守护正在以模式: \$UNLOCK_MODE_NOW 运行中\\\n" +E[20]="Media unlock daemon installed successfully. A session window u has been created, enter [screen -Udr u] and close [screen -SX u quit]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log" +C[20]="媒体解锁守护进程已安装成功,已创建一个会话窗口 u ,进入 [screen -Udr u],关闭 [screen -SX u quit],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log" +E[21]="Media unlock daemon installed successfully. A jobs has been created, check [pgrep -laf warp_unlock] and close [kill -9 \$(pgrep -f warp_unlock)]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log" +C[21]="媒体解锁守护进程已安装成功,已创建一个jobs,查看 [pgrep -laf warp_unlock],关闭 [kill -9 \$(pgrep -f warp_unlock)],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log" +E[22]="The script runs on today: \$TODAY. Total:\$TOTAL" +C[22]="脚本当天运行次数:\$TODAY,累计运行次数:\$TOTAL" +E[23]="Please choose to brush WARP IP:\n 1. WARP IPv4 Interface\n 2. WARP IPv6 Interface" +C[23]="请选择刷 WARP IP 方式:\n 1. WARP IPv4 网络接口\n 2. WARP IPv6 网络接口" +E[24]="No WARP method specified." +C[24]="没有指定的 WARP 方式" +E[25]="No unlock method specified." +C[25]="没有指定的解锁模式" +E[26]="Expected region abbreviation should be two digits (eg hk,sg)." +C[26]="期望地区简码应该为两位 (如 hk,sg)" +E[27]="No unlock script is installed." +C[27]="解锁脚本还没有安装" +E[28]="Unlock script is installed." +C[28]="解锁脚本已安装" +E[29]="Please enter Bot Token if you need push the logs to Telegram. Leave blank to skip:" +C[29]="如需要把日志推送到 Telegram 机器人,请输入 Bot Token,不需要直接回车:" +E[30]="Enter USERID:" +C[30]="输入 USERID:" +E[31]="Enter custom name:" +C[31]="自定义名称:" +E[32]="The account type is Teams and does not support changing IP\n 1. Change to free (default)\n 2. Change to plus\n 3. Quit" +C[32]="账户类型为 Teams,不支持更换 IP\n 1. 更换为 free (默认)\n 2. 更换为 plus\n 3. 退出" +E[33]="Input errors up to 5 times.The script is aborted." +C[33]="输入错误达5次,脚本退出" +E[34]="License should be 26 characters, please re-enter WARP+ License. Otherwise press Enter to continue. \(\${i} times remaining\): " +C[34]="License 应为26位字符,请重新输入 WARP+ License \(剩余\${i}次\): " +E[35]="Please customize the WARP+ device name (Default is [warp-go] if left blank):" +C[35]="请自定义 WARP+ 设备名 (如果不输入,默认为 [warp-go]):" +E[36]="" +C[36]="" +E[37]="" +C[37]="" +E[38]="" +C[38]="" +E[39]="" +C[39]="" +E[40]="Mode 1: Check it every 5 minutes" +C[40]="模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功" +E[41]="Mode 2: Create a screen named [u] and run" +C[41]="模式2: 创建一个名为 [u] 的 Screen 在后台刷" +E[42]="Mode 3: Create a jobs with nohup to run in the background" +C[42]="模式3: 用 nohup 创建一个 jobs 在后台刷" +E[43]="Media unlock daemon installed successfully. A systemd service has been created, check [systemctl status warp_unlock] and close [systemctl disable --now warp_unlock]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log" +C[43]="媒体解锁守护进程已安装成功,已创建一个 systemd 服务,查看 [systemctl status warp_unlock],关闭 [systemctl disable --now warp_unlock],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log" +E[44]="Media unlock daemon installed successfully. pm2 daemon is running, check pm2 [list] and close [pm2 delete warp_unlock; pm2 unstartup systemd;]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log" +C[44]="媒体解锁守护进程已安装成功,pm2 守护进程正在工作中,查看 [pm2 list],关闭 [pm2 delete warp_unlock; pm2 unstartup systemd; ],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log" +E[45]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy" +C[45]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理" +E[46]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv6 Interface" +C[46]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv6 网络接口" +E[47]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv6 Interface\n" +C[47]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv6 网络接口" +E[48]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface" +C[48]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口" +E[49]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface" +C[49]="请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n" +E[50]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface" +C[50]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口" +E[51]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface" +C[51]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口" +E[52]="Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface" +C[52]="请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口" +E[53]="Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n 4. WARP IPv6 Interface" +C[53]="请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n 4. WARP IPv6 网络接口" +E[54]="No option. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]" +C[54]="没有该选项,脚本退出,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]" # 自定义字体彩色,read 函数,友道翻译函数,安装依赖函数 -red(){ echo -e "\033[31m\033[01m$1\033[0m"; } -green(){ echo -e "\033[32m\033[01m$1\033[0m"; } -yellow(){ echo -e "\033[33m\033[01m$1\033[0m"; } -reading(){ read -rp "$(green "$1")" "$2"; } -translate(){ [[ -n "$1" ]] && curl -ksm8 "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=${1//[[:space:]]/}" | cut -d \" -f18 2>/dev/null; } -check_dependencies(){ for c in $@; do -type -p $c >/dev/null 2>&1 || (yellow " $(eval echo "${T[${L}7]}") " && ${PACKAGE_INSTALL[b]} "$c") || (yellow " $(eval echo "${T[${L}8]}") " && ${PACKAGE_UPDATE[b]} && ${PACKAGE_INSTALL[b]} "$c") -! type -p $c >/dev/null 2>&1 && yellow " $(eval echo "${T[${L}9]}") " && exit 1; done; } +red() { echo -e "\033[31m\033[01m$*\033[0m"; } +error() { echo -e "\033[31m\033[01m$*\033[0m" && exit 1; } +info() { echo -e "\033[32m\033[01m$*\033[0m"; } +hint() { echo -e "\033[33m\033[01m$*\033[0m"; } +reading() { read -rp "$(info "$1")" "$2"; } +text() { eval echo "\${${L}[$*]}"; } +text_eval() { eval echo "\$(eval echo "\${${L}[$*]}")"; } +translate() { [ -n "$1" ] && curl -ksm8 "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=$1" | cut -d \" -f18 2>/dev/null; } +check_dependencies() { + for c in $*; do + type -p $c >/dev/null 2>&1 || (hint " $(text_eval 7) " && ${PACKAGE_INSTALL[b]} $c 2>/dev/null) || (hint " $(text_eval 8) " && ${PACKAGE_UPDATE[b]} && ${PACKAGE_INSTALL[b]} $c 2>/dev/null) + ! type -p $c >/dev/null 2>&1 && error " $(text_eval 9) " && exit 1 + done +} # 脚本当天及累计运行次数统计 -statistics_of_run-times(){ - COUNT=$(curl -ksm1 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffscarmen%2Fwarp_unlock%2Fmain%2Funlock.sh&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false" 2>&1) && - TODAY=$(expr "$COUNT" : '.*\s\([0-9]\{1,\}\)\s/.*') && TOTAL=$(expr "$COUNT" : '.*/\s\([0-9]\{1,\}\)\s.*') +statistics_of_run-times() { + COUNT=$(curl -ksm1 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffscarmen%2Fwarp_unlock%2Fmain%2Funlock.sh&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false" 2>&1) && + TODAY=$(expr "$COUNT" : '.*\s\([0-9]\{1,\}\)\s/.*') && TOTAL=$(expr "$COUNT" : '.*/\s\([0-9]\{1,\}\)\s.*') } -# 选择语言,先判断 /etc/wireguard/language 里的语言选择,没有的话再让用户选择,默认英语 -select_laguage(){ - [[ -z "$L" ]] && case $(cat /etc/wireguard/language 2>&1) in - E ) L=E;; C ) L=C;; - * ) L=E && yellow " ${T[${L}0]} " && reading " ${T[${L}3]} " LANGUAGE - [[ $LANGUAGE = 2 ]] && L=C;; - esac +# 选择语言,先判断 warp 脚本里的语言选择,没有的话再让用户选择,默认英语 +select_laguage() { + if [[ -z "$L" ]]; then + if [ -e /opt/warp-go/language ]; then + L=$(cat /opt/warp-go/language 2>&1) + elif [ -e /etc/wireguard/language ]; then + L=$(cat /etc/wireguard/language 2>&1) + else + case $(cat /etc/wireguard/language 2>&1) in + E ) L=E;; + C ) L=C;; + * ) L=E && hint "\n $(text 0) \n" && reading " $(text 3) " LANGUAGE + [[ $LANGUAGE = 2 ]] && L=C;; + esac + fi + fi } -check_system_info(){ -# 多方式判断操作系统,试到有值为止。只支持 Debian 10/11、Ubuntu 18.04/20.04 或 CentOS 7/8 ,如非上述操作系统,退出脚本 - CMD=( "$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" - "$(hostnamectl 2>/dev/null | grep -i system | cut -d : -f2)" - "$(lsb_release -sd 2>/dev/null)" - "$(grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2)" - "$(grep . /etc/redhat-release 2>/dev/null)" - "$(grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d')" - ) - - for a in "${CMD[@]}"; do - SYS="$a" && [[ -n $SYS ]] && break - done - - REGEX=("debian" "ubuntu" "centos|red hat|kernel|oracle linux|amazon linux|alma|rocky") - RELEASE=("Debian" "Ubuntu" "CentOS") - PACKAGE_UPDATE=("apt -y update" "apt -y update" "yum -y update") - PACKAGE_INSTALL=("apt -y install" "apt -y install" "yum -y install") - - for ((b=0; b<${#REGEX[@]}; b++)); do - [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[b]} ]] && SYSTEM="${RELEASE[b]}" && break - done - [[ -z $SYSTEM ]] && red " ${T[${L}5]} " && exit 1 +check_system_info() { + # 多方式判断操作系统,试到有值为止。只支持 Debian 10/11、Ubuntu 18.04/20.04 或 CentOS 7/8 ,如非上述操作系统,退出脚本 + CMD=( "$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" + "$(hostnamectl 2>/dev/null | grep -i system | cut -d : -f2)" + "$(lsb_release -sd 2>/dev/null)" + "$(grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2)" + "$(grep . /etc/redhat-release 2>/dev/null)" + "$(grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d')" + ) + + for a in "${CMD[@]}"; do + SYS="$a" && [[ -n $SYS ]] && break + done + + REGEX=("debian" "ubuntu" "centos|red hat|kernel|oracle linux|amazon linux|alma|rocky") + RELEASE=("Debian" "Ubuntu" "CentOS") + PACKAGE_UPDATE=("apt -y update" "apt -y update" "yum -y update") + PACKAGE_INSTALL=("apt -y install" "apt -y install" "yum -y install") + + for ((b=0; b<${#REGEX[@]}; b++)); do + [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[b]} ]] && SYSTEM="${RELEASE[b]}" && break + done + [[ -z $SYSTEM ]] && error " $(text 5) " } # 检查是否有安装任一版本的 python 依赖,如全部没有,则安装 python3 -check_python(){ - PY=("python" "python2") - for g in "${PY[@]}"; do type -p $g >/dev/null 2>&1 && PYTHON=$g && break; done - [ -z "$PYTHON" ] && PYTHON=python3 && check_dependencies $PYTHON +check_python() { + PY=("python" "python2") + for g in "${PY[@]}"; do type -p $g >/dev/null 2>&1 && PYTHON=$g && break; done + [ -z "$PYTHON" ] && PYTHON=python3 && check_dependencies $PYTHON } # 检查解锁是否已运行,如果是则判断模式,以前给更换模式赋值 -check_unlock_running(){ - [ -e /etc/wireguard/warp_unlock.sh ] && - UNLOCK_MODE_NOW=$(grep -s "MODE=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - EXPECT=$(grep -s "EXPECT=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - TOKEN=$(grep -s "TOKEN=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - USERID=$(grep -s "USERID=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - CUSTOM=$(grep -s "CUSTOM=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - NIC=$(grep -s "NIC=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - RESTART=$(grep -s "RESTART=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) && - PYTHON=$(grep -s "PYTHON=" /etc/wireguard/warp_unlock.sh | cut -d \" -f2) +check_unlock_running() { + [ -e /usr/bin/warp_unlock.sh ] && + UNLOCK_MODE_NOW=$(grep -s "MODE=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + EXPECT=$(grep -s "EXPECT=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + TOKEN=$(grep -s "TOKEN=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + USERID=$(grep -s "USERID=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + CUSTOM=$(grep -s "CUSTOM=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + NIC=$(grep -s "NIC=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + RESTART=$(grep -s "RESTART=" /usr/bin/warp_unlock.sh | cut -d \" -f2) && + PYTHON=$(grep -s "PYTHON=" /usr/bin/warp_unlock.sh | cut -d \" -f2) } # 判断是否已经安装 WARP 网络接口或者 Socks5 代理,如已经安装组件尝试启动。再分情况作相应处理 -check_warp(){ - if [[ -z "${STATUS[@]}" ]]; then - if type -p wg-quick >/dev/null 2>&1; then - [[ -z $(wg 2>/dev/null) ]] && wg-quick up wgcf >/dev/null 2>&1 - TRACE4=$(curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") - TRACE6=$(curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") - [[ $TRACE4 =~ on|plus ]] && STATUS[0]=1 || STATUS[0]=0 - [[ $TRACE6 =~ on|plus ]] && STATUS[1]=1 || STATUS[1]=0 - else STATUS=(0 0) - fi - - # 在已安装 Client 的前提下,区分模式 Mode - if type -p warp-cli >/dev/null 2>&1; then - ! systemctl is-active warp-svc >/dev/null 2>&1 && systemctl start warp-svc && sleep 5 - if [[ $(warp-cli --accept-tos settings) =~ WarpProxy ]]; then - [[ $(ss -nltp) =~ 'warp-svc' ]] && CLIENT_PORT=$(ss -nltp | grep warp-svc | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[2]=1 || STATUS[2]=0 - else - [[ $(ip a) =~ 'CloudflareWARP' ]] && STATUS[2]=1 || STATUS[2]=0 - fi - else STATUS[2]=0 - fi - - type -p wireproxy >/dev/null 2>&1 && [[ ! $(ss -nltp) =~ 'wireproxy' ]] && systemctl restart wireproxy - [[ $(ss -nltp) =~ 'wireproxy' ]] && WIREPROXY_PORT=$(ss -nltp | grep wireproxy | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[3]=1 || STATUS[3]=0 - fi - - fscarmen(){ wget -N https://raw.githubusercontent.com/fscarmen/warp/main/menu.sh && bash menu.sh; exit; } - kkkyg(){ wget -N https://cdn.jsdelivr.net/gh/kkkyg/CFwarp/CFwarp.sh && bash CFwarp.sh; exit; } - p3terx(){ bash <(curl -fsSL git.io/warp.sh) menu; exit; } - misaka(){ wget -N https://raw.githubusercontents.com/Misaka-blog/Misaka-WARP-Script/master/misakawarp.sh && bash misakawarp.sh; exit; } - - CASE_IPV4(){ NIC='-ks4m8'; RESTART="wgcf_restart"; } - CASE_IPV6(){ NIC='-ks6m8'; RESTART="wgcf_restart"; } - CASE_CLIENT(){ NIC='-ks4m8 --interface CloudflareWARP' && RESTART="client_restart" && [[ $(warp-cli --accept-tos settings) =~ WarpProxy ]] && NIC="-sx socks5h://localhost:$CLIENT_PORT"; } - CASE_WIREPROXY(){ NIC="-sx socks5h://localhost:$WIREPROXY_PORT"; RESTART="wireproxy_restart"; } - - INSTALL_CHECK=("0 0 0 0" "1 1 1 1" "0 1 1 1" "1 0 1 1" "1 1 0 1" "1 1 1 0" "0 0 1 1" "0 1 0 1" "0 1 1 0" "1 0 0 1" "1 0 1 0" "1 1 0 0" "0 0 0 1" "0 0 1 0" "0 1 0 0" "1 0 0 0") - SHOW=("${T[${L}4]}" "${T[${L}53]}" "${T[${L}47]}" "${T[${L}50]}" "${T[${L}51]}" "${T[${L}52]}" "${T[${L}45]}" "${T[${L}46]}" "${T[${L}6]}" "${T[${L}48]}" "${T[${L}49]}" "${T[${L}23]}") - NUM=("0|1|2|3|4" "1|2|3|4" "1|2|3" "1|2|3" "1|2|3" "1|2|3" "1|2" "1|2" "1|2" "1|2" "1|2" "1|2") - DO1=("fscarmen" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV4" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV4") - DO2=("kkkyg" "CASE_CLIENT" "CASE_CLIENT" "CASE_CLIENT" "CASE_IPV4" "CASE_IPV4" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV6" "CASE_IPV4" "CASE_IPV4" "CASE_IPV6") - DO3=("p3terx" "CASE_IPV4" "CASE_IPV6" "CASE_IPV4" "CASE_IPV6" "CASE_IPV6") - DO4=("misaka" "CASE_IPV6") - DO0=("exit") - - for ((f=0; f<${#INSTALL_CHECK[@]}; f++)); do - [[ ${STATUS[@]} = "${INSTALL_CHECK[f]}" ]] && break - done +check_warp() { + if [[ -z "${STATUS[@]}" ]]; then + if [[ $(ip a) =~ ": WARP:"|": wgcf:" ]]; then + WARP="--interface wgcf" + if [[ $(ip a) =~ ": WARP:" ]]; then + WARP="--interface WARP" + # 检测账户类型为 Team 的不能更换 + if grep -qE 'Type[ ]+=[ ]+team' /opt/warp-go/warp.conf; then + hint "\n $(text 32) \n" && reading " $(text 3) " CHANGE_ACCOUNT + case "$CHANGE_ACCOUNT" in + 2 ) [[ -z $LICENSE ]] && reading " $(text 42) " LICENSE + local i=5 + until [[ $LICENSE =~ ^[A-Z0-9a-z]{8}-[A-Z0-9a-z]{8}-[A-Z0-9a-z]{8}$ ]]; do + (( i-- )) || true + [[ $i = 0 ]] && error " $(text 33) " && exit 1 || reading " $(text 34) " LICENSE + done + [[ -n $LICENSE && -z $NAME ]] && reading " $(text 35) " NAME + [[ -n $NAME ]] && NAME="${NAME//[[:space:]]/_}" || NAME=${NAME:-'warp-go'} + echo "$LICENSE" > /opt/warp-go/License + echo "$NAME" > /opt/warp-go/Device_Name;; + 3 ) exit 0;; + esac + fi + fi + TRACE4=$(curl -ks4m8 $WARP https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") + TRACE6=$(curl -ks6m8 $WARP https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") + [[ $TRACE4 =~ on|plus ]] && STATUS[0]=1 || STATUS[0]=0 + [[ $TRACE6 =~ on|plus ]] && STATUS[1]=1 || STATUS[1]=0 + else + STATUS=(0 0) + fi + + # 在已安装 Client 的前提下,区分模式 Mode + if type -p warp-cli >/dev/null 2>&1; then + ! systemctl is-active warp-svc >/dev/null 2>&1 && systemctl start warp-svc && sleep 5 + if [[ $(warp-cli --accept-tos settings) =~ WarpProxy ]]; then + [[ $(ss -nltp) =~ 'warp-svc' ]] && CLIENT_PORT=$(ss -nltp | grep warp-svc | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[2]=1 || STATUS[2]=0 + else + [[ $(ip a) =~ 'CloudflareWARP' ]] && STATUS[2]=1 || STATUS[2]=0 + fi + else STATUS[2]=0 + fi + + type -p wireproxy >/dev/null 2>&1 && [[ ! $(ss -nltp) =~ 'wireproxy' ]] && systemctl restart wireproxy + [[ $(ss -nltp) =~ 'wireproxy' ]] && WIREPROXY_PORT=$(ss -nltp | grep wireproxy | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[3]=1 || STATUS[3]=0 + fi + + wgcf_warp() { wget -N --no-check-certificate https://raw.githubusercontent.com/fscarmen/warp/main/menu.sh && bash menu.sh; exit; } + warp-go() { wget -N --no-check-certificate https://raw.githubusercontent.com/fscarmen/warp/main/warp-go.sh && bash warp-go.sh; exit; } + p3terx() { bash <(curl -fsSL git.io/warp.sh) menu; exit; } + misaka() { wget -N --no-check-certificate https://raw.githubusercontents.com/Misaka-blog/Misaka-WARP-Script/master/misakawarp.sh && bash misakawarp.sh; exit; } + + CASE_IPV4() { NIC="-ks4m8 $WARP"; RESTART="warp_restart"; } + CASE_IPV6() { NIC="-ks6m8 $WARP"; RESTART="warp_restart"; } + CASE_CLIENT() { NIC='-ks4m8 --interface CloudflareWARP' && RESTART="client_restart" && [[ $(warp-cli --accept-tos settings) =~ WarpProxy ]] && NIC="-sx socks5h://localhost:$CLIENT_PORT"; } + CASE_WIREPROXY() { NIC="-sx socks5h://localhost:$WIREPROXY_PORT"; RESTART="wireproxy_restart"; } + + INSTALL_CHECK=("0 0 0 0" "1 1 1 1" "0 1 1 1" "1 0 1 1" "1 1 0 1" "1 1 1 0" "0 0 1 1" "0 1 0 1" "0 1 1 0" "1 0 0 1" "1 0 1 0" "1 1 0 0" "0 0 0 1" "0 0 1 0" "0 1 0 0" "1 0 0 0") + SHOW=("\n $(text 4) \n" "\n $(text 53) \n" "\n $(text 47) \n" "\n $(text 50) \n" "\n $(text 51) \n" "\n $(text 52) \n" "\n $(text 45) \n" "\n $(text 46) \n" "\n $(text 6) \n" "\n $(text 48) \n" "\n $(text 49) \n" "\n $(text 23) \n") + NUM=("0|1|2|3|4" "1|2|3|4" "1|2|3" "1|2|3" "1|2|3" "1|2|3" "1|2" "1|2" "1|2" "1|2" "1|2" "1|2") + DO1=("wgcf_warp" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV4" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV4") + DO2=("warp-go" "CASE_CLIENT" "CASE_CLIENT" "CASE_CLIENT" "CASE_IPV4" "CASE_IPV4" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV6" "CASE_IPV4" "CASE_IPV4" "CASE_IPV6") + DO3=("p3terx" "CASE_IPV4" "CASE_IPV6" "CASE_IPV4" "CASE_IPV6" "CASE_IPV6") + DO4=("misaka" "CASE_IPV6") + DO0=("exit") + + for ((f=0; f<${#INSTALL_CHECK[@]}; f++)); do + [[ ${STATUS[@]} = "${INSTALL_CHECK[f]}" ]] && break + done - # 默认只安装一种 WARP 形式时,不用选择。如两种或以上则让用户选择哪个方式的解锁 - CHOOSE2=1 - if echo "$f" | grep -qvwE "12|13|14|15" ; then - yellow "${SHOW[f]}" && reading " ${T[${L}3]} " CHOOSE2 - echo "$CHOOSE2" | grep -qvwE "${NUM[f]}" && red " ${T[${L}54]} " && exit 1 - fi - $(eval echo \${DO$CHOOSE2[f]}) + # 默认只安装一种 WARP 形式时,不用选择。如两种或以上则让用户选择哪个方式的解锁 + CHOOSE2=1 + if echo "$f" | grep -qvwE "12|13|14|15"; then + hint "${SHOW[f]}" && reading " $(text 3) " CHOOSE2 + echo "$CHOOSE2" | grep -qvwE "${NUM[f]}" && error " $(text 54) " + fi + $(eval echo \${DO$CHOOSE2[f]}) } -# 期望解锁流媒体, 变量 SUPPORT_NUM 限制选项枚举的次数,不填默认全选, 解锁状态保存在 /etc/wireguard/status.log -input_streammedia_unlock(){ - if [[ -z "${STREAM_UNLOCK[@]}" ]]; then - yellow " ${T[${L}15]} " && reading " ${T[${L}3]} " CHOOSE4 - for ((d=0; d<"$SUPPORT_NUM"; d++)); do - ( [[ -z "$CHOOSE4" ]] || echo "$CHOOSE4" | grep -q "$((d+1))" ) && STREAM_UNLOCK[d]='1' || STREAM_UNLOCK[d]='0' - [[ $d = 0 ]] && echo 'null' > /etc/wireguard/status.log || echo 'null' >> /etc/wireguard/status.log - done - fi - UNLOCK_SELECT=$(for ((e=0; e<"$SUPPORT_NUM"; e++)); do +# 期望解锁流媒体, 变量 SUPPORT_NUM 限制选项枚举的次数,不填默认全选, 解锁状态保存在 /usr/bin/status.log +input_streammedia_unlock() { + if [[ -z "${STREAM_UNLOCK[@]}" ]]; then + hint "\n $(text 15) \n" && reading " $(text 3) " CHOOSE4 + for ((d=0; d<"$SUPPORT_NUM"; d++)); do + ( [[ -z "$CHOOSE4" ]] || echo "$CHOOSE4" | grep -q "$((d+1))" ) && STREAM_UNLOCK[d]='1' || STREAM_UNLOCK[d]='0' + [[ $d = 0 ]] && echo 'null' > /usr/bin/status.log || echo 'null' >> /usr/bin/status.log + done + fi + UNLOCK_SELECT=$(for ((e=0; e<"$SUPPORT_NUM"; e++)); do [[ "${STREAM_UNLOCK[e]}" = 1 ]] && echo -e "[[ ! \${R[*]} =~ 'No' ]] && check$e;" || echo -e "#[[ ! \${R[*]} =~ 'No' ]] && check$e;" - done) + done) } # 期望解锁地区 -input_region(){ - if [[ -z "$EXPECT" ]]; then - REGION=$(curl -ksm8 https://ip.gs/country-iso 2>/dev/null) - reading " $(eval echo "${T[${L}13]}") " EXPECT - until [[ -z $EXPECT || $EXPECT = [Yy] || $EXPECT =~ ^[A-Za-z]{2}$ ]]; do - reading " $(eval echo "${T[${L}13]}") " EXPECT - done - [[ -z $EXPECT || $EXPECT = [Yy] ]] && EXPECT="$REGION" - fi - } +input_region() { + if [[ -z "$EXPECT" ]]; then + REGION=$(curl -ksm8 https://ip.gs/country-iso 2>/dev/null) + reading "\n $(text_eval 13) " EXPECT + until [[ -z $EXPECT || $EXPECT = [Yy] || $EXPECT =~ ^[A-Za-z]{2}$ ]]; do + reading "\n $(text_eval 13) " EXPECT + done + [[ -z $EXPECT || $EXPECT = [Yy] ]] && EXPECT="$REGION" + fi +} # Telegram Bot 日志推送 -input_tg(){ - [[ -z $CUSTOM ]] && reading " $(eval echo "${T[${L}29]}") " TOKEN - [[ -n $TOKEN && -z $USERID ]] && reading " $(eval echo "${T[${L}30]}") " USERID - [[ -n $USERID && -z $CUSTOM ]] && reading " $(eval echo "${T[${L}31]}") " CUSTOM - } +input_tg() { + [[ -z $CUSTOM ]] && reading "\n $(text_eval 29) " TOKEN + [[ -n $TOKEN && -z $USERID ]] && reading "\n $(text_eval 30) " USERID + [[ -n $USERID && -z $CUSTOM ]] && reading "\n $(text_eval 31) " CUSTOM +} # 根据用户选择在线生成解锁程序,放在 /etc/wireguard/unlock.sh -export_unlock_file(){ +export_unlock_file() { input_streammedia_unlock input_region @@ -285,7 +334,7 @@ sh -c "$TASK" # 生成 warp_unlock.sh 文件,判断当前流媒体解锁状态,遇到不解锁时更换 WARP IP,直至刷成功。5分钟后还没有刷成功,将不会重复该进程而浪费系统资源 # 感谢以下两位作者: lmc999 [https://github.com/lmc999/RegionRestrictionCheck] 和 luoxue-bot [https://github.com/luoxue-bot/warp_auto_change_ip] # 根据 lmc999 脚本检测 Netflix Title,如获取不到,使用兜底默认值 -cat </etc/wireguard/warp_unlock.sh +cat </usr/bin/warp_unlock.sh #!/usr/bin/env bash MODE="$CHOOSE1" EXPECT="$EXPECT" @@ -305,81 +354,104 @@ RESULT_TITLE=\${RESULT_TITLE:-'81215567'}; REGION_TITLE=\${REGION_TITLE:-'800184 timedatectl set-timezone Asia/Shanghai if [[ \$(pgrep -laf ^[/d]*bash.*warp_unlock | awk -F, '{a[\$2]++}END{for (i in a) print i" "a[i]}') -le 2 ]]; then - -log_output="\\\$(date +'%F %T'). \\\\\tIP: \\\$WAN \\\\\tCountry: \\\$COUNTRY \\\\\t\\\$CONTENT" -tg_output="💻 \\\$CUSTOM. ⏰ \\\$(date +'%F %T'). 🛰 \\\$WAN 🌏 \\\$COUNTRY. \\\$CONTENT" - -log_message(){ echo -e "\$(eval echo "\$log_output")" | tee -a /root/result.log; [[ \$(cat /root/result.log | wc -l) -gt \$LOG_LIMIT ]] && sed -i "1,10d" /root/result.log; } -tg_message(){ curl -s -X POST "https://api.telegram.org/bot\$TOKEN/sendMessage" -d chat_id=\$USERID -d text="\$(eval echo "\$tg_output")" -d parse_mode="HTML" >/dev/null 2>&1; } - -check_ip(){ -unset IP_INFO WAN COUNTRY ASNORG -IP_INFO="\$(curl \$NIC https://ip.gs/json 2>/dev/null)" -WAN=\$(expr "\$IP_INFO" : '.*ip\":\"\([^"]*\).*') -COUNTRY=\$(expr "\$IP_INFO" : '.*country\":\"\([^"]*\).*') -ASNORG=\$(expr "\$IP_INFO" : '.*asn_org\":\"\([^"]*\).*') -} - -wgcf_restart(){ systemctl restart wg-quick@wgcf; sleep 2; ss -nltp | grep 'dnsmasq' >/dev/null 2>&1 && systemctl restart dnsmasq >/dev/null 2>&1; sleep 2; check_ip; } - -client_restart(){ - [[ \$(warp-cli --accept-tos settings) =~ WarpProxy ]] && CLIENT_PROXY=1 - warp-cli --accept-tos delete >/dev/null 2>&1 - [[ \$CLIENT_PROXY != 1 ]] && ( ip -4 rule delete from 172.16.0.2/32 lookup 51820; ip -4 rule delete table main suppress_prefixlength 0 ) - warp-cli --accept-tos register >/dev/null 2>&1 && - [[ -e /etc/wireguard/license ]] && warp-cli --accept-tos set-license \$(cat /etc/wireguard/license) >/dev/null 2>&1 - sleep 10 - [[ \$CLIENT_PROXY != 1 ]] && ( ip -4 rule add from 172.16.0.2 lookup 51820; ip -4 route add default dev CloudflareWARP table 51820; ip -4 rule add table main suppress_prefixlength 0 ) - check_ip -} - -wireproxy_restart(){ systemctl restart wireproxy; sleep 5; check_ip; } - -check0(){ -RESULT[0]=""; REGION[0]=""; R[0]=""; -RESULT[0]=\$(curl --user-agent "\${UA_Browser}" \$NIC -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/\$RESULT_TITLE" 2>&1) -if [[ \${RESULT[0]} = 200 ]]; then -REGION[0]=\$(curl --user-agent "\${UA_Browser}" \$NIC -fs --max-time 10 --write-out %{redirect_url} --output /dev/null "https://www.netflix.com/title/\$REGION_TITLE" | sed 's/.*com\/\([^-/]\{1,\}\).*/\1/g' | tr '[:lower:]' '[:upper:]') -REGION[0]=\${REGION[0]:-'US'} -fi -echo "\${REGION[0]}" | grep -qi "\$EXPECT" && R[0]="\$UNLOCK_STATUS" || R[0]="\$NOT_UNLOCK_STATUS" -CONTENT="Netflix: \${R[0]}." -log_message -[[ -n "\$CUSTOM" ]] && [[ \${R[0]} != \$(sed -n '1p' /etc/wireguard/status.log) ]] && tg_message -sed -i "1s/.*/\${R[0]}/" /etc/wireguard/status.log -} - -check1(){ -unset PreAssertion assertion disneycookie TokenContent isBanned is403 fakecontent refreshToken disneycontent tmpresult previewcheck isUnabailable region inSupportedLocation -R[1]="" -PreAssertion=\$(curl \$NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>&1) -[[ "\$PreAssertion" == "curl"* ]] && R[1]="\$NOT_UNLOCK_STATUS" -if [[ \${R[1]} != "\$NOT_UNLOCK_STATUS" ]]; then -assertion=\$(echo \$PreAssertion | \$PYTHON -m json.tool 2> /dev/null | grep assertion | cut -f4 -d'"') -PreDisneyCookie=\$(curl \$NIC --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p') -disneycookie=\$(echo \$PreDisneyCookie | sed "s/DISNEYASSERTION/\${assertion}/g") -TokenContent=\$(curl \$NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycookie") -isBanned=\$(echo \$TokenContent | \$PYTHON -m json.tool 2> /dev/null | grep 'forbidden-location') -is403=\$(echo \$TokenContent | grep '403 ERROR') -[[ -n "\$isBanned\$is403" ]] && R[1]="\$NOT_UNLOCK_STATUS" -fi - -if [[ \${R[1]} != "\$NOT_UNLOCK_STATUS" ]]; then -fakecontent=\$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p') -refreshToken=\$(echo \$TokenContent | \$PYTHON -m json.tool 2> /dev/null | grep 'refresh_token' | awk '{print \$2}' | cut -f2 -d'"') -disneycontent=\$(echo \$fakecontent | sed "s/ILOVEDISNEY/\${refreshToken}/g") -tmpresult=\$(curl \$NIC --user-agent "\${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycontent" 2>&1) -previewcheck=\$(curl \$NIC -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview) -isUnabailable=\$(echo \$previewcheck | grep 'unavailable') -region=\$(echo \$tmpresult | \$PYTHON -m json.tool 2> /dev/null | grep 'countryCode' | cut -f4 -d'"') -inSupportedLocation=\$(echo \$tmpresult | \$PYTHON -m json.tool 2> /dev/null | grep 'inSupportedLocation' | awk '{print \$2}' | cut -f1 -d',') -[[ "\$region" == "JP" || ( -n "\$region" && "\$inSupportedLocation" == "true" ) ]] && R[1]="\$UNLOCK_STATUS" || R[1]="\$NOT_UNLOCK_STATUS" -fi -CONTENT="Disney+: \${R[1]}." -log_message -[[ -n "\$CUSTOM" ]] && [[ \${R[1]} != \$(sed -n '2p' /etc/wireguard/status.log) ]] && tg_message -sed -i "2s/.*/\${R[1]}/" /etc/wireguard/status.log -} + log_output="\\\$(date +'%F %T'). \\\\\tIP: \\\$WAN \\\\\tCountry: \\\$COUNTRY \\\\\t\\\$CONTENT" + tg_output="💻 \\\$CUSTOM. ⏰ \\\$(date +'%F %T'). 🛰 \\\$WAN 🌏 \\\$COUNTRY. \\\$CONTENT" + + log_message() { echo -e "\$(eval echo "\$log_output")" | tee -a /root/result.log; [[ \$(cat /root/result.log | wc -l) -gt \$LOG_LIMIT ]] && sed -i "1,10d" /root/result.log; } + tg_message() { curl -s -X POST "https://api.telegram.org/bot\$TOKEN/sendMessage" -d chat_id=\$USERID -d text="\$(eval echo "\$tg_output")" -d parse_mode="HTML" >/dev/null 2>&1; } + + check_ip() { + unset IP_INFO WAN COUNTRY ASNORG + IP_INFO="\$(curl \$NIC https://ip.gs/json 2>/dev/null)" + WAN=\$(expr "\$IP_INFO" : '.*ip\":\"\([^"]*\).*') + COUNTRY=\$(expr "\$IP_INFO" : '.*country\":\"\([^"]*\).*') + ASNORG=\$(expr "\$IP_INFO" : '.*asn_org\":\"\([^"]*\).*') + } + + warp_restart() { + if [[ \$(ip a) =~ ": WARP:" ]];then + cp -f /opt/warp-go/warp.conf{,.tmp1} + k=0 + until [[ -e /opt/warp-go/warp.conf.tmp2 ]]; do + ((k++)) || true + [[ \$k = 11 ]] && rm -f /opt/warp-go/warp.conf.tmp* && echo -e " Failed to register warp account. Script aborted. " && exit 1 + /opt/warp-go/warp-go --register --config=/opt/warp-go/warp.conf.tmp2 --license=\$(cat /opt/warp-go/License 2>/dev/null) --device-name=\$(cat /opt/warp-go/Device_Name 2>/dev/null) >/dev/null 2>&1 + [[ \$? != 0 ]] && sleep 10 + done + sed -i '1,6!d' /opt/warp-go/warp.conf.tmp2 + tail -n +7 /opt/warp-go/warp.conf.tmp1 >> /opt/warp-go/warp.conf.tmp2 + mv /opt/warp-go/warp.conf.tmp2 /opt/warp-go/warp.conf + /opt/warp-go/warp-go --config=/opt/warp-go/warp.conf.tmp1 --remove >/dev/null 2>&1 + rm -f /opt/warp-go/warp.conf.tmp* + systemctl restart warp-go + sleep 10 + else + systemctl restart wg-quick@wgcf + sleep 2 + ss -nltp | grep 'dnsmasq' >/dev/null 2>&1 && systemctl restart dnsmasq >/dev/null 2>&1 + sleep 2 + fi + check_ip + } + + client_restart() { + [[ \$(warp-cli --accept-tos settings) =~ WarpProxy ]] && CLIENT_PROXY=1 + warp-cli --accept-tos delete >/dev/null 2>&1 + [[ \$CLIENT_PROXY != 1 ]] && ( ip -4 rule delete from 172.16.0.2/32 lookup 51820; ip -4 rule delete table main suppress_prefixlength 0 ) + warp-cli --accept-tos register >/dev/null 2>&1 && + [[ -e /etc/wireguard/license ]] && warp-cli --accept-tos set-license \$(cat /etc/wireguard/license) >/dev/null 2>&1 + sleep 10 + [[ \$CLIENT_PROXY != 1 ]] && ( ip -4 rule add from 172.16.0.2 lookup 51820; ip -4 route add default dev CloudflareWARP table 51820; ip -4 rule add table main suppress_prefixlength 0 ) + check_ip + } + + wireproxy_restart() { systemctl restart wireproxy; sleep 5; check_ip; } + + check0() { + RESULT[0]=""; REGION[0]=""; R[0]=""; + RESULT[0]=\$(curl --user-agent "\${UA_Browser}" \$NIC -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/\$RESULT_TITLE" 2>&1) + if [[ \${RESULT[0]} = 200 ]]; then + REGION[0]=\$(curl --user-agent "\${UA_Browser}" \$NIC -fs --max-time 10 --write-out %{redirect_url} --output /dev/null "https://www.netflix.com/title/\$REGION_TITLE" | sed 's/.*com\/\([^-/]\{1,\}\).*/\1/g' | tr '[:lower:]' '[:upper:]') + REGION[0]=\${REGION[0]:-'US'} + fi + echo "\${REGION[0]}" | grep -qi "\$EXPECT" && R[0]="\$UNLOCK_STATUS" || R[0]="\$NOT_UNLOCK_STATUS" + CONTENT="Netflix: \${R[0]}." + log_message + [[ -n "\$CUSTOM" ]] && [[ \${R[0]} != \$(sed -n '1p' /usr/bin/status.log) ]] && tg_message + sed -i "1s/.*/\${R[0]}/" /usr/bin/status.log + } + + check1() { + unset PreAssertion assertion disneycookie TokenContent isBanned is403 fakecontent refreshToken disneycontent tmpresult previewcheck isUnabailable region inSupportedLocation + R[1]="" + PreAssertion=\$(curl \$NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>&1) + [[ "\$PreAssertion" == "curl"* ]] && R[1]="\$NOT_UNLOCK_STATUS" + if [[ \${R[1]} != "\$NOT_UNLOCK_STATUS" ]]; then + assertion=\$(echo \$PreAssertion | \$PYTHON -m json.tool 2> /dev/null | grep assertion | cut -f4 -d'"') + PreDisneyCookie=\$(curl \$NIC --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p') + disneycookie=\$(echo \$PreDisneyCookie | sed "s/DISNEYASSERTION/\${assertion}/g") + TokenContent=\$(curl \$NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycookie") + isBanned=\$(echo \$TokenContent | \$PYTHON -m json.tool 2> /dev/null | grep 'forbidden-location') + is403=\$(echo \$TokenContent | grep '403 ERROR') + [[ -n "\$isBanned\$is403" ]] && R[1]="\$NOT_UNLOCK_STATUS" + fi + + if [[ \${R[1]} != "\$NOT_UNLOCK_STATUS" ]]; then + fakecontent=\$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p') + refreshToken=\$(echo \$TokenContent | \$PYTHON -m json.tool 2> /dev/null | grep 'refresh_token' | awk '{print \$2}' | cut -f2 -d'"') + disneycontent=\$(echo \$fakecontent | sed "s/ILOVEDISNEY/\${refreshToken}/g") + tmpresult=\$(curl \$NIC --user-agent "\${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycontent" 2>&1) + previewcheck=\$(curl \$NIC -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview) + isUnabailable=\$(echo \$previewcheck | grep 'unavailable') + region=\$(echo \$tmpresult | \$PYTHON -m json.tool 2> /dev/null | grep 'countryCode' | cut -f4 -d'"') + inSupportedLocation=\$(echo \$tmpresult | \$PYTHON -m json.tool 2> /dev/null | grep 'inSupportedLocation' | awk '{print \$2}' | cut -f1 -d',') + [[ "\$region" == "JP" || ( -n "\$region" && "\$inSupportedLocation" == "true" ) ]] && R[1]="\$UNLOCK_STATUS" || R[1]="\$NOT_UNLOCK_STATUS" + fi + CONTENT="Disney+: \${R[1]}." + log_message + [[ -n "\$CUSTOM" ]] && [[ \${R[1]} != \$(sed -n '2p' /usr/bin/status.log) ]] && tg_message + sed -i "2s/.*/\${R[1]}/" /usr/bin/status.log + } ${MODE2[0]} check_ip @@ -396,29 +468,29 @@ ${MODE2[1]} fi EOF -chmod +x /etc/wireguard/warp_unlock.sh + chmod +x /usr/bin/warp_unlock.sh } # 输出执行结果 -result_output(){ - green " $RESULT_OUTPUT " - green " $(eval echo "${T[${L}22]}") " +result_output() { + info " $RESULT_OUTPUT " + info " $(text_eval 22) \n" } # 卸载 -uninstall(){ - screen -QX u quit >/dev/null 2>&1 && screen -wipe >/dev/null 2>&1 - type -p wg-quick >/dev/null 2>&1 && systemctl restart wgcf >/dev/null 2>&1 - type -p warp-cli >/dev/null 2>&1 && ( warp-cli --accept-tos delete >/dev/null 2>&1; sleep 1; warp-cli --accept-tos register >/dev/null 2>&1 ) - sed -i '/warp_unlock.sh/d' /etc/crontab - kill -9 $(pgrep -f warp_unlock.sh) >/dev/null 2>&1 - rm -f /etc/wireguard/warp_unlock.sh /root/result.log /etc/wireguard/status.log /etc/systemd/system/warp_unlock.service - systemctl disable --now warp_unlock >/dev/null 2>&1 - pm2 delete warp_unlock >/dev/null 2>&1 - pm2 unstartup systemd >/dev/null 2>&1 - - # 输出执行结果,如是切换模式则不显示 - [ "$UN" = 1 ] && green " ${T[${L}11]} " +uninstall() { + screen -QX u quit >/dev/null 2>&1 && screen -wipe >/dev/null 2>&1 + type -p wg-quick >/dev/null 2>&1 && systemctl restart wgcf >/dev/null 2>&1 + type -p warp-cli >/dev/null 2>&1 && ( warp-cli --accept-tos delete >/dev/null 2>&1; sleep 1; warp-cli --accept-tos register >/dev/null 2>&1 ) + sed -i '/warp_unlock.sh/d' /etc/crontab + kill -9 $(pgrep -f warp_unlock.sh) >/dev/null 2>&1 + rm -f /usr/bin/warp_unlock.sh /root/result.log /usr/bin/status.log /etc/systemd/system/warp_unlock.service + systemctl disable --now warp_unlock >/dev/null 2>&1 + pm2 delete warp_unlock >/dev/null 2>&1 + pm2 unstartup systemd >/dev/null 2>&1 + + # 输出执行结果,如是切换模式则不显示 + [ "$UN" = 1 ] && info "\n $(text 11) \n" } # 传参 1/2 @@ -431,32 +503,37 @@ select_laguage # 传参 2/2 while getopts ":CcEeUu46SsPpM:m:A:a:N:n:T:t:" OPTNAME; do - case "$OPTNAME" in - 'C'|'c' ) L='C';; - 'E'|'e' ) L='E';; - 'U'|'u' ) if [ ! -e /etc/wireguard/warp_unlock.sh ]; then red " ${T[${L}27]} " && exit 1 - else UN=1; uninstall; exit 0; fi;; - '4' ) TRACE4=$(curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") - [[ ! $TRACE4 =~ on|plus ]] && red " ${T[${L}24]} " && exit 1 || STATUS=(1 0 0 0);; - '6' ) TRACE6=$(curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") - [[ ! $TRACE6 =~ on|plus ]] && red " ${T[${L}24]} " && exit 1 || STATUS=(0 1 0 0);; - 'S'|'s' ) [[ ! $(ss -nltp) =~ 'warp-svc' ]] && red " ${T[${L}24]} " && exit 1 || STATUS=(0 0 1 0);; - 'P'|'p' ) [[ ! $(ss -nltp) =~ 'wireproxy' ]] && red " ${T[${L}24]} " && exit 1 || STATUS=(0 0 0 1);; - 'M'|'m' ) [ -z "$UNLOCK_MODE_NOW" ] && check_unlock_running - if [ -n "$UNLOCK_MODE_NOW" ]; then - red " ${T[${L}28]} " && exit 1 - else [[ $OPTARG != [1-5] ]] && red " ${T[${L}25]} " && exit 1 || CHOOSE1=$OPTARG - fi;; - 'A'|'a' ) [[ ! "$OPTARG" =~ ^[A-Za-z]{2}$ ]] && red " ${T[${L}26]} " && exit 1 || EXPECT="$OPTARG";; - 'N'|'n' ) for ((d=0; d<"$SUPPORT_NUM"; d++)); do - [[ $d = 0 ]] && echo 'null' > /etc/wireguard/status.log || echo 'null' >> /etc/wireguard/status.log; done - echo "$OPTARG" | grep -qi 'n' && STREAM_UNLOCK[0]='1' || STREAM_UNLOCK[0]='0' - echo "$OPTARG" | grep -qi 'd' && STREAM_UNLOCK[1]='1' || STREAM_UNLOCK[1]='0';; - 'T'|'t' ) TOKEN="$(echo $OPTARG | cut -d'@' -f1)" - USERID="$(echo $OPTARG | cut -d'@' -f2)" - CUSTOM="$(echo $OPTARG | cut -d'@' -f3)" - CUSTOM="${CUSTOM:-'Stream Media Unlock'}";; - esac + case "$OPTNAME" in + 'C'|'c' ) L='C';; + 'E'|'e' ) L='E';; + 'U'|'u' ) if [ ! -e /usr/bin/warp_unlock.sh ]; then + error " $(text 27) " + else + UN=1; uninstall; exit 0 + fi;; + '4' ) TRACE4=$(curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") + [[ ! $TRACE4 =~ on|plus ]] && error " $(text 24) " || STATUS=(1 0 0 0);; + '6' ) TRACE6=$(curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g") + [[ ! $TRACE6 =~ on|plus ]] && error " $(text 24) " || STATUS=(0 1 0 0);; + 'S'|'s' ) [[ ! $(ss -nltp) =~ 'warp-svc' ]] && error " $(text 24) " || STATUS=(0 0 1 0);; + 'P'|'p' ) [[ ! $(ss -nltp) =~ 'wireproxy' ]] && error " $(text 24) " || STATUS=(0 0 0 1);; + 'M'|'m' ) [ -z "$UNLOCK_MODE_NOW" ] && check_unlock_running + if [ -n "$UNLOCK_MODE_NOW" ]; then + error " $(text 28) " + else + [[ $OPTARG != [1-5] ]] && error " $(text 25) " || CHOOSE1=$OPTARG + fi;; + 'A'|'a' ) [[ ! "$OPTARG" =~ ^[A-Za-z]{2}$ ]] && error " $(text 26) " || EXPECT="$OPTARG";; + 'N'|'n' ) for ((d=0; d<"$SUPPORT_NUM"; d++)); do + [[ $d = 0 ]] && echo 'null' > /usr/bin/status.log || echo 'null' >> /usr/bin/status.log + done + echo "$OPTARG" | grep -qi 'n' && STREAM_UNLOCK[0]='1' || STREAM_UNLOCK[0]='0' + echo "$OPTARG" | grep -qi 'd' && STREAM_UNLOCK[1]='1' || STREAM_UNLOCK[1]='0';; + 'T'|'t' ) TOKEN="$(echo $OPTARG | cut -d'@' -f1)" + USERID="$(echo $OPTARG | cut -d'@' -f2)" + CUSTOM="$(echo $OPTARG | cut -d'@' -f3)" + CUSTOM="${CUSTOM:-'Stream Media Unlock'}";; + esac done # 主程序运行 2/2 @@ -465,86 +542,86 @@ check_unlock_running check_dependencies curl check_warp MODE2=("while true; do" "sleep 1h; done") -[ -n "$UNLOCK_MODE_NOW" ] && MENU_SHOW="$(eval echo "${T[${L}19]}")${T[${L}12]}" || MENU_SHOW="${T[${L}12]}" - -action1(){ - unset MODE2 - [ -n "$UNLOCK_MODE_NOW" ] && uninstall - TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"*/5 * * * * root bash /etc/wireguard/warp_unlock.sh\" >> /etc/crontab" - RESULT_OUTPUT="${T[${L}10]}" - export_unlock_file - result_output +[ -n "$UNLOCK_MODE_NOW" ] && MENU_SHOW="$(text_eval 19)$(text 12)" || MENU_SHOW="$(text 12)" + +action1() { + unset MODE2 + [ -n "$UNLOCK_MODE_NOW" ] && uninstall + TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"*/5 * * * * root bash /usr/bin/warp_unlock.sh\" >> /etc/crontab" + RESULT_OUTPUT="\n $(text 10) \n" + export_unlock_file + result_output } -action2(){ - [ -n "$UNLOCK_MODE_NOW" ] && uninstall - TASK="cat < /etc/systemd/system/warp_unlock.service +action2() { + [ -n "$UNLOCK_MODE_NOW" ] && uninstall + TASK="cat < /etc/systemd/system/warp_unlock.service [Unit] Description = WARP unlock After = network.target [Service] -ExecStart = /etc/wireguard/warp_unlock.sh +ExecStart = /usr/bin/warp_unlock.sh Restart = always Type = simple [Install] WantedBy = multi-user.target EOF" - RESULT_OUTPUT="${T[${L}43]}" - export_unlock_file - systemctl enable --now warp_unlock >/dev/null 2>&1 & - result_output + RESULT_OUTPUT="\n $(text 43) \n" + export_unlock_file + systemctl enable --now warp_unlock >/dev/null 2>&1 & + result_output } -action3(){ - [ -n "$UNLOCK_MODE_NOW" ] && uninstall - TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root nohup bash /etc/wireguard/warp_unlock.sh &\" >> /etc/crontab" - RESULT_OUTPUT="${T[${L}21]}" - export_unlock_file - nohup bash /etc/wireguard/warp_unlock.sh >/dev/null 2>&1 & - result_output +action3() { + [ -n "$UNLOCK_MODE_NOW" ] && uninstall + TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root nohup bash /usr/bin/warp_unlock.sh &\" >> /etc/crontab" + RESULT_OUTPUT="\n $(text 21) \n" + export_unlock_file + nohup bash /usr/bin/warp_unlock.sh >/dev/null 2>&1 & + result_output } -action4(){ - [ -n "$UNLOCK_MODE_NOW" ] && uninstall - TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root screen -USdm u bash /etc/wireguard/warp_unlock.sh\" >> /etc/crontab" - RESULT_OUTPUT="${T[${L}20]}" - check_dependencies screen - export_unlock_file - screen -USdm u bash /etc/wireguard/warp_unlock.sh - result_output +action4() { + [ -n "$UNLOCK_MODE_NOW" ] && uninstall + TASK="sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root screen -USdm u bash /usr/bin/warp_unlock.sh\" >> /etc/crontab" + RESULT_OUTPUT="\n $(text 20) \n" + check_dependencies screen + export_unlock_file + screen -USdm u bash /usr/bin/warp_unlock.sh + result_output } -action5(){ - [ -n "$UNLOCK_MODE_NOW" ] && uninstall - TASK="" - RESULT_OUTPUT="${T[${L}44]}" - node -v >/dev/null 2>&1 || ${PACKAGE_INSTALL[b]} nodejs - npm -v >/dev/null 2>&1 || check_dependencies npm - npm install -g pm2 - export_unlock_file - pm2 start /etc/wireguard/warp_unlock.sh - pm2 save; pm2 startup - result_output +action5() { + [ -n "$UNLOCK_MODE_NOW" ] && uninstall + TASK="" + RESULT_OUTPUT="\n $(text 44) \n" + node -v >/dev/null 2>&1 || ${PACKAGE_INSTALL[b]} nodejs + npm -v >/dev/null 2>&1 || check_dependencies npm + npm install -g pm2 + export_unlock_file + pm2 start /usr/bin/warp_unlock.sh + pm2 save; pm2 startup + result_output } -action6(){ UN=1; uninstall; } +action6() { UN=1; uninstall; } -action0(){ exit 0; } +action0() { exit 0; } # 菜单显示 -menu(){ - clear - yellow " ${T[${L}16]} " - red "======================================================================================================================\n" - green " ${T[${L}17]}:$VERSION ${T[${L}18]}:${T[${L}1]}\n " - red "======================================================================================================================\n" - [[ -z "$CHOOSE1" ]] && yellow " $MENU_SHOW " && reading " ${T[${L}3]} " CHOOSE1 - case "$CHOOSE1" in - [0-6] ) action$CHOOSE1;; - * ) red " ${T[${L}14]} "; sleep 1; menu;; - esac +menu() { + clear + hint " $(text 16) " + red "======================================================================================================================\n" + info " $(text 17): $VERSION $(text 18): $(text 1)\n " + red "======================================================================================================================\n" + [[ -z "$CHOOSE1" ]] && hint " $MENU_SHOW " && reading " $(text 3) " CHOOSE1 + case "$CHOOSE1" in + [0-6] ) action$CHOOSE1;; + * ) red " $(text 14) "; sleep 1; menu;; + esac } menu