somasoma
somasoma

Reputation: 1

LINEBOTのデータをPHPで取得したいが、session_id('指定のID') を設定しても、意図したセッションが再開されない

LINEのmessagingAPIを使用して、ユーザーがLINEで入力したメッセージをXサーバー上のPHPで取得したいのですが、session_idが変わってしまいます。LINEBOTのデータをPHPで取得したいが、session_id('指定のID') を設定しても、意図したセッションが再開されないため、対応策をご教示いただきたいです。

フォルダ構成 /home/ユーザー名/ドメイン/ ├── log/ │ ├── error.log (エラーログファイル) │ ├── xserver_php/ │ ├── session/ (セッションデータ保存用フォルダ) │ └── public_html/ (Web公開ディレクトリ) ├── linebot.php (今回のPHPスクリプト) ├──template ├── sample.html

やりたいこと linebot.php内の質問1をLINEのトーク画面に表示→回答を取得→質問2を表示(質問10まで繰り返し)→その値をtemplate配下のファイルに流し込む

困っていること session_id('指定のID') を設定しても、意図したセッションが再開されない。 強制的にsession_idが変わってしまうので、質問リストの配列の1番初めのリストしか取得できない

ソース(linebot.php) ※パスなどは伏せます

<?php

ini_set('session.gc_maxlifetime', 3600);
ini_set('session.save_path', '/home/~~~~~~/~~~~~~/xserver_php/session');
ini_set('session.use_cookies', 0); // クッキーを無効化

$logFile = '/home/~~~~~~/~~~~~~/log/error.log';`your text`

$input = file_get_contents('php://input');
$events = json_decode($input, true);
$accessToken = 'アクセストークンの値';

error_log("input: " . $input. PHP_EOL, 3, $logFile);

// 質問リスト
$questions = [
    "質問1のテキスト",
    "質問2のテキスト",
    "質問3のテキスト",
    "質問4のテキスト",
    "質問5のテキスト",
    "質問6のテキスト",
    "質問7のテキスト",
    "質問8のテキスト",
    "質問9のテキスト",
    "質問10のテキスト"
];

if (!empty($events['events'])) {
    foreach ($events['events'] as $event) {
        if ($event['type'] == 'message' && $event['message']['type'] == 'text') {
            $userMessage = trim($event['message']['text']);
            $replyToken = $event['replyToken'];
            $userId = $event['source']['userId'];

            // セッションIDをユーザーごとに設定
            session_id('session12345'); // セッションIDをユーザーごとに固定
            session_start(); // セッションを再開

            // セッションデータの初期化
            if (!isset($_SESSION['responses']) || !is_array($_SESSION['responses'])) {
                $_SESSION['responses'] = [];
            }

            // 現在の質問インデックスを取得
            $currentIndex = count($_SESSION['responses']);

            // 初回の質問
            if ($currentIndex === 0) {
                replyMessage($replyToken, $questions[0]);
                error_log("Session Data Before Write: " . json_encode($_SESSION));
                session_write_close();
                continue;
            }

            // ユーザーの回答を保存
       error_log("Save Current Message". $userMessage.PHP_EOL, 3, $logFile);
            $_SESSION['responses'][] = $userMessage;
            session_write_close(); // セッションを保存して閉じる

            // 次の質問を送信
            error_log("Send Next Message". PHP_EOL, 3, $logFile);
            if ($currentIndex < count($questions) - 1) {
                replyMessage($replyToken, $questions[$currentIndex]);
            } else {
                replyMessage($replyToken, "回答が完了しました。ありがとうございました!");
                session_destroy();
            }
        }
    }
}

// LINE API メッセージ返信関数
function replyMessage($replyToken, $message) {
    global $accessToken;
    global $logFile;
    $url = 'https://api.line.me/v2/bot/message/reply';

    error_log("replyToken: " . $replyToken. PHP_EOL, 3, $logFile);
    error_log("message: " . $message. PHP_EOL, 3, $logFile);

    $data = [
        'replyToken' => $replyToken,
        'messages' => [['type' => 'text', 'text' => $message]]
    ];

    $headers = [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $accessToken
    ];

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}

error_log("Session Data: " . json_encode($_SESSION));
?>

Upvotes: -1

Views: 35

Answers (0)

Related Questions