Reputation: 1
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