开发连接RCON的Telegram机器人遇Session无法保存问题
解决Telegram机器人RCON连接中Session无法保存的问题
看起来你在开发Telegram RCON机器人时踩了一个Webhook场景的常见坑——默认的PHP Session在这种环境下根本没法正常工作,我来帮你拆解问题并给出可行的解决方案:
核心问题:Telegram Webhook的无状态特性
Telegram向你的机器人发送Webhook请求时,每一次都是独立的HTTP请求,Telegram服务器不会保存或携带任何Cookie信息。而PHP默认的Session机制完全依赖浏览器Cookie来关联用户会话,这就导致你设置的Session参数和session_start()在Webhook场景下形同虚设,自然无法保存会话数据。
可行的解决方案:基于用户标识的自定义会话存储
既然Cookie走不通,我们换个思路:用用户的chatID作为唯一标识,把RCON连接信息等会话数据存在文件、数据库或者Redis里。这里给你一个基于文件存储的简单示例:
define('BOT_TOKEN', 'xx:xxxxxx'); define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/'); // 读取Telegram请求内容并获取chatID(处理可能的空值) $content = file_get_contents("php://input"); $update = json_decode($content, true); $chatID = $update["message"]["chat"]["id"] ?? $update["callback_query"]["message"]["chat"]["id"] ?? null; if (!$chatID) { exit; // 没有有效chatID时直接退出 } // 自定义会话存储目录(确保服务器对该目录有读写权限) $sessionDir = __DIR__ . '/bot_sessions/'; if (!is_dir($sessionDir)) { mkdir($sessionDir, 0755, true); // 创建目录,设置合适权限 } $sessionFile = $sessionDir . 'session_' . $chatID . '.json'; // 读取已保存的会话数据 $sessionData = []; if (file_exists($sessionFile)) { $sessionData = json_decode(file_get_contents($sessionFile), true) ?? []; } // ------------------------- // 这里是你的业务逻辑示例:比如保存/读取RCON连接信息 // ------------------------- // 示例:保存RCON主机信息 $sessionData['rcon_host'] = '192.168.1.100'; $sessionData['rcon_port'] = 27015; $sessionData['rcon_password'] = 'your_rcon_pass'; // 示例:读取已保存的RCON信息 if (isset($sessionData['rcon_host'])) { // 在这里初始化RCON连接 // $rcon = new Rcon($sessionData['rcon_host'], $sessionData['rcon_port'], $sessionData['rcon_password']); } // 保存会话数据到文件 file_put_contents($sessionFile, json_encode($sessionData));
额外需要检查的点
- 权限问题:确保你的服务器对自定义会话存储目录有读写权限(比如上面的
bot_sessions目录),否则会无法写入文件。 - 会话过期:如果需要自动清理过期会话,可以定期遍历存储目录,删除超过指定时间的文件(比如24小时)。
- 数据安全:如果存储敏感信息(比如RCON密码),建议对数据进行加密后再存储,避免明文泄露。
内容的提问来源于stack exchange,提问作者Mattia
相关产品推荐
相关产品推荐

