Telegram机器人发送PDF报400错误:文件URL/标识符异常排查
首先直接给结论:服务器端口不需要必须是80,你遇到的wrong file identifier/HTTP URL specified错误,大概率是你的文件URL不符合Telegram API的访问要求,而非端口本身的问题。下面是具体的排查方向和解决办法:
可能的问题原因及验证方式
服务器端口未对外开放
Telegram的服务器需要能访问到你服务器的7070端口,如果你在防火墙、安全组里没开放这个端口,或者只允许局域网访问,Telegram就无法获取文件。你可以用以下方式验证:- 用非局域网的设备(比如手机开流量)访问
http://109.169.XX.XX:7070/pdfs/sample.pdf,看能不能直接下载PDF。 - 用curl命令测试端口连通性:
curl -v http://109.169.XX.XX:7070/pdfs/sample.pdf,如果出现连接超时或者拒绝连接,说明端口没开放。
- 用非局域网的设备(比如手机开流量)访问
文件访问权限或Web服务器配置限制
你的Web服务器(比如Nginx、Apache)可能对/pdfs目录设置了访问限制,或者文件本身的权限不足,导致Telegram访问时返回403或其他错误码。可以用curl查看响应状态:curl -I http://109.169.XX.XX:7070/pdfs/sample.pdf正常应该返回
HTTP/1.1 200 OK,如果是403、404等状态码,就需要调整Web服务器配置或文件权限。响应头不符合要求
Telegram API要求文件URL返回正确的Content-Type头,PDF文件应该是application/pdf。如果你的服务器返回的是text/plain或者其他错误类型,Telegram会拒绝识别这个文件。同样用上面的curl命令查看Content-Type字段是否正确。存在重定向
如果访问你的PDF URL时出现301/302重定向(比如自动跳转到HTTPS,或者其他路径),Telegram API不支持这种带重定向的URL,必须直接返回文件内容。用curl命令可以看到是否有Location头字段,就是有重定向。
解决步骤
- 检查服务器防火墙/安全组,确保7070端口对所有公网IP开放(如果担心安全,可以只开放Telegram的服务器IP段,但直接开放更便捷)。
- 调整Web服务器配置,确保
/pdfs目录允许匿名访问,没有身份验证或IP限制。 - 确保访问PDF URL时直接返回文件内容,没有重定向;如果之前有强制HTTPS的配置,可以暂时针对这个路径关闭,或者改成HTTPS URL(Telegram更推荐HTTPS,但HTTP也支持)。
- 确认Web服务器返回正确的Content-Type,比如在Nginx中可以为pdf文件添加配置:
location /pdfs { types { application/pdf pdf; } }
补充:你的代码片段参考
你提到的请求数据结构大致如下(确保document字段直接填写你的文件URL即可,不需要额外处理):
$data = [ 'chat_id' => '你的聊天ID', 'document' => 'http://109.169.XX.XX:7070/pdfs/sample.pdf' ];
内容的提问来源于stack exchange,提问作者Alihossein shahabi

