俄罗斯地区php-telegram-bot/core开发的Bot被屏蔽后如何发消息?
解决俄罗斯部署的Telegram Bot无法发送消息的问题
我之前也碰到过一模一样的情况,俄罗斯地区对Telegram官方API的直连限制确实会导致Bot发不出消息,通过给Guzzle客户端配置代理就能解决这个问题,我给你整理了完整的实现方案:
完整代码示例
首先要在设置Guzzle客户端的时候加上代理配置,推荐用socks5类型的代理(在俄罗斯地区稳定性比HTTP代理高很多),代码如下:
<?php require 'vendor/autoload.php'; use Longman\TelegramBot\Telegram; use Longman\TelegramBot\Request; // 初始化Bot实例 $telegram = new Telegram('你的API密钥', '你的Bot用户名'); // 配置带代理的Guzzle客户端 $proxyClient = new \GuzzleHttp\Client([ 'base_uri' => 'https://api.telegram.org', // 替换成你的实际代理信息,支持带账号密码的认证代理 'proxy' => [ 'http' => 'socks5://代理用户名:代理密码@代理地址:端口', 'https' => 'socks5://代理用户名:代理密码@代理地址:端口', ], // 可选:设置超时时间,防止请求长时间卡住无响应 'timeout' => 15, ]); // 给Request组件绑定这个带代理的客户端 Request::setClient($proxyClient); // 测试发送消息 $messageData = [ 'chat_id' => 12345678, // 替换成目标用户的chat_id 'text' => '这是通过代理发送的测试消息', ]; try { $sendResult = Request::sendMessage($messageData); echo "消息发送成功:" . $sendResult->getDescription(); } catch (\Longman\TelegramBot\Exception\TelegramException $e) { echo "发送失败:" . $e->getMessage(); }
关键注意事项
- 代理类型选择:优先用socks5代理,HTTP代理在俄罗斯地区大概率也会被屏蔽,socks5的穿透性和稳定性更好。
- 代理可用性测试:配置前先手动验证代理是否能访问Telegram API,比如用curl命令:
如果能返回Bot的基础信息,说明代理是可用的。curl -x socks5://代理用户名:代理密码@代理地址:端口 https://api.telegram.org/bot<你的API密钥>/getMe - 代理认证信息:如果你的代理需要账号密码,一定要按
用户名:密码@地址:端口的格式正确填写,漏填或格式错误都会导致代理失效。 - SSL验证:尽量不要关闭
verify选项(默认是开启状态),除非代理使用自签证书,否则会带来安全风险。
另外,如果你不想用代理,也可以尝试Telegram的备用API地址https://api.core.telegram.org,但这个地址在俄罗斯同样可能被屏蔽,所以代理还是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Evgeniy
相关产品推荐
相关产品推荐

