PHP基于Telegram Bot API发送图片:file_get_contents非curl调用失效排查
该PHP代码无法成功发送Telegram图片消息的原因排查
核心问题点
- 接口端点选择错误
当前代码拼接的请求地址是$TELEGRAM/sendMessage,这是Telegram Bot专为纯文本消息设计的接口,参数列表中完全没有photo相关的入参校验逻辑,就算填了图片参数,服务端也会直接判定参数非法,不会触发图片发送流程。发送公网链接类图片必须调用sendPhoto专属端点。 - 参数名和接口场景不匹配
在sendPhoto接口的规则中,图片附带的说明文字对应参数名是caption,而非当前代码使用的text。text是sendMessage接口独有的入参名,传错参数名会导致就算调用接口成功,图片附带的文字内容也无法正常展示。 - 变量初始化存在运行隐患
代码中使用$url .= "图片地址"做拼接赋值,但$url在首次使用拼接操作符前没有做初始定义,在PHP 7.2+及以上版本会抛出未定义变量的警告,部分开启严格错误拦截的运行环境会直接中断脚本执行,根本无法走到调用Telegram接口的步骤。 - 非核心但需要注意的兼容问题
直接通过GET方式拼接请求参数调用接口,虽然可以满足短内容的发送需求,但如果后续发送的图片说明文字较长、包含特殊转义字符,要注意Telegram对GET请求的URL长度限制;同时要确保填写的图片链接是公网可无权限访问的直链,不然Telegram服务端拉取不到图片资源也会发送失败。
修正后的无cURL版本代码
function suspendido($chat_id, $foo) { $TOKEN = "你的实际Bot Token"; $TELEGRAM = "https://api.telegram.org:443/bot$TOKEN"; $photo_url = "https://zrabogados-pruebas.xyz/bot/404.png"; $query = http_build_query(array( 'chat_id' => $chat_id, 'photo' => $photo_url, 'caption' => $foo, 'parse_mode' => "HTML", )); $response = file_get_contents("$TELEGRAM/sendPhoto?$query"); return $response; }
调试提示:调用接口后建议直接打印返回值内容,Telegram服务端会在返回的JSON结构中明确标注具体的错误原因,包括权限不足、Token错误、图片链接不可访问等常见问题,可直接根据返回值定位问题,不用反复修改代码排查。
补充说明:sendPhoto接口的caption参数最大支持1024字符,如果需要发送的文字内容过长,需要拆分消息发送。
内容的提问来源于stack exchange,提问作者JuanFernandoz
相关产品推荐
相关产品推荐

