You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram Bot Webhook调用时PHP Session ID持续变化问题求助

解决Telegram Bot Webhook调用时PHP Session ID变化的问题

问题根源

Telegram的Webhook请求由Telegram服务器主动发起,并非来自用户的客户端(如浏览器),所以请求中不会携带用户的Session Cookie。PHP的Session依赖Cookie识别会话,因此每次Webhook调用都会生成新的Session ID,导致无法复用之前的Session数据。

解决方案:基于Chat ID的文件存储替代Session

既然暂不想用数据库,可以利用Telegram消息中唯一的chatId作为标识,将用户状态存储到本地文件中,实现类似Session的持久化效果。

修改步骤

  1. 移除Session相关代码:删掉session_start()和$_SESSION的所有调用,改用文件读写处理状态。
  2. 创建状态存储目录:在项目根目录新建user_states文件夹,确保PHP拥有该目录的读写权限。
  3. 封装状态读写函数:编写两个函数分别负责读取、保存用户状态。

修改后的webhook.php代码示例

<?php
require 'vendor/autoload.php';
require 'variables.php';

// 确保状态存储目录存在,不存在则创建
$stateDir = __DIR__ . '/user_states';
if (!is_dir($stateDir)) {
    mkdir($stateDir, 0755, true);
}

// 读取指定用户的状态
function getUserState($chatId) {
    global $stateDir;
    $stateFile = $stateDir . '/' . $chatId . '.json';
    if (file_exists($stateFile)) {
        return json_decode(file_get_contents($stateFile), true);
    }
    return [];
}

// 保存指定用户的状态
function saveUserState($chatId, $state) {
    global $stateDir;
    $stateFile = $stateDir . '/' . $chatId . '.json';
    file_put_contents($stateFile, json_encode($state));
}

$bot = new TelegramBot\Api\BotApi($apiToken);

$update = json_decode(file_get_contents('php://input'), true);

if(isset($update['message'])) {
    $message = $update['message'];
    $chatId = $message['chat']['id'];
    // 读取当前用户的状态
    $userState = getUserState($chatId);
    $statusNewAsta = $userState["statusNewAsta"] ?? null;

    if (isset($message['text']))
        switch ($message['text'])
        {
            case '/start': 
                commandStart($chatId); 
                // 如需重置用户状态,可在此处调用 saveUserState($chatId, []);
                break;
            case '/newAsta': 
                if(in_array($chatId,$adminIds)) {
                    commandNewAsta($chatId);
                    // 保存状态为等待输入名称
                    $userState["statusNewAsta"] = "waiting_name";
                    saveUserState($chatId, $userState);
                } else {
                    $bot->sendMessage($chatId,'Non puoi eseguire questo comando!');
                }
                break;
            default: 
                if(in_array($chatId,$adminIds) && isset($statusNewAsta)) {
                    switch ($statusNewAsta)
                    {
                        case "waiting_name": 
                            getNameNewAsta($chatId,$message['text']);
                            // 完成当前步骤后,清空或更新状态
                            $userState["statusNewAsta"] = null;
                            saveUserState($chatId, $userState);
                            break;
                    }
                }
                break;
        }
}

注意事项

  • 确保user_states目录权限正确,可通过chmod 755 user_states命令设置权限。
  • 每个用户的状态以[chatId].json文件名存储,JSON格式支持结构化保存复杂状态数据。
  • 用户完成流程后,建议清空对应状态文件或重置状态,避免无用数据堆积。

内容的提问来源于stack exchange,提问作者Cesare Diodato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:23