Skip to content

[Bug] Telegram Bot: curl 无 proxy 特性时 setproxy 失效,且缺少 answerCallbackQuery #1227

@cyrilkong

Description

@cyrilkong

问题概述

在部分路由器(如 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 中无 proxycurl --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.shweb_get_lite.shbot_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.shweb_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_upload wget fallback、answer_callback()、按钮回调确认

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions