-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Description
问题概述
在部分路由器(如 RT-AX86U)上,系统自带的 curl 编译时未启用 proxy 特性,导致 setproxy() 设置的 http_proxy/https_proxy 环境变量被 curl 完全忽略。Bot 的所有 HTTP 请求实际走直连,在需要代理访问 api.telegram.org 的网络环境下全部失败。
另外 bot_tg.sh 缺少 answerCallbackQuery 调用,按钮点击后 loading 指示器不消失。
复现环境
- RT-AX86U + Merlin 固件
- ShellCrash + Mihomo(混合模式)
firewall_area=1- curl 8.4.0,Features 中无
proxy(curl --version可确认) - wget (GNU Wget 1.24.5) 正常支持
http_proxy
$ curl --version
curl 8.4.0 (arm-buildroot-linux-gnueabi)
Features: alt-svc HSTS IPv6 Largefile NTLM SSL threadsafe TLS-SRP UnixSockets
# ↑ 注意:没有 "proxy"
具体问题
1. curl 判断条件未检测 proxy 特性
web_json.sh、web_get_lite.sh、bot_tg.sh 中均使用 if curl --version >/dev/null 2>&1 判断是否用 curl。当 curl 存在但不支持 proxy 时,setproxy 设置的环境变量被忽略,请求直连失败。
建议修改判断条件:
if curl --version >/dev/null 2>&1 && { [ -z "$http_proxy" ] || curl --version 2>&1 | grep -qi proxy; }; then
# curl
else
# wget fallback
fi逻辑:curl 存在 且(不需要代理 或 curl 支持 proxy)→ 用 curl,否则 → wget。
2. web_upload() 无 setproxy 调用、无 wget fallback
web_upload() 是唯一没有调用 setproxy 的 HTTP 函数,且只有 curl 实现。wget 不支持 -F multipart form,需要手动构造 body 配合 --post-file 实现。
3. HTTP timeout 过短(3秒)
经代理链路访问 Telegram API 耗时约 5-7 秒,web_json.sh 和 web_get_lite.sh 的 3 秒 timeout 不够。建议改为 10 秒。
4. 缺少 answerCallbackQuery
bot_tg.sh 处理按钮回调后未调用 answerCallbackQuery,Telegram 客户端 loading 指示器一直显示。
修复参考
分支: https://github.com/cyrilkong/ShellCrash/tree/fix/telegram-bot-gfw
共 3 个 commit,修改 3 个文件:
scripts/libs/web_json.sh— timeout + curl proxy 检测scripts/libs/web_get_lite.sh— timeout + curl proxy 检测scripts/menus/bot_tg.sh—_curl_ok()辅助函数、web_uploadwget fallback、answer_callback()、按钮回调确认