#author("2026-08-31T22:06:28+09:00","default:guide","guide") * Pkript/API/data [#rba0c4d7] #author("2026-09-04T00:05:50+09:00","default:mcp","bot-mcp") * Pkript/API/data [#t07e53af] リクエストをまたいで値を永続化するAPI。キーと値のペアを :config/pkript/data/<キー> ページにJSONで保存する。 リクエストをまたいで値を永続化するAPI。キー1つが :config/pkript/data/<キー> ページ1枚に対応し、値はJSONで保存される。 ** リファレンス [#b183f922] ** リファレンス [#t2d3b41e] *** data.get(key, [default]) [#q3399d1a] *** data.get(key, [default]) [#lb6f6002] #pkript(highlight){{ #highlight{{ data.get(key, [default]) }} |~引数|~型|~説明|h |key|String|取得対象のキー| |default|any|キーが存在しない場合の戻り値(省略時 null)| 戻り値: 保存された値、またはデフォルト値 読み出しにアクセス制御はない。どのスクリプトからもどのキーも読める。 PKRIPT_ALLOW_DATA が 0 の場合は常にデフォルト値を返す。 *** data.set(key, value) [#y9aae398] *** data.set(key, value) [#abcf92cd] #pkript(highlight){{ #highlight{{ data.set(key, value) }} |~引数|~型|~説明|h |key|String|書き込み対象のキー| |value|any|保存する値(JSON化して保存される)| 戻り値: なし 呼び出し条件: action + POST + wiki.token() のトークン + スクリプトの信頼度(wiki.write と同じ)。 呼び出し条件: action + POST + wiki.token() のトークン + スクリプトの信頼度(wiki.write と同じ)。ページの描画中は書き込めない。 PKRIPT_ALLOW_DATA が 0 の場合は拒否される。 *** data.has(key) [#ic66d98a] *** data.has(key) [#j79c350b] #pkript(highlight){{ #highlight{{ data.has(key) }} - key: String 戻り値: Boolean: キーが存在するか *** data.remove(key) [#m529c053] *** data.remove(key) [#m607830b] #pkript(highlight){{ #highlight{{ data.remove(key) }} - key: String 戻り値: Boolean: 削除した場合 true、存在しなかった場合 false 呼び出し条件は data.set と同じ。 *** data.keys([prefix]) [#d3b273ed] *** data.keys([prefix]) [#afd58bcc] #pkript(highlight){{ #highlight{{ data.keys([prefix]) }} - prefix: String: 絞り込みに使うキーの接頭辞(省略可) 戻り値: Array<String>: キーの配列(辞書順ソート済み) 戻り値: Array<String>: キーの配列(辞書順ソート済み) *** data.canWrite(key) [#c8df0965] *** data.canWrite(key) [#j39d0cd6] #pkript(highlight){{ #highlight{{ data.canWrite(key) }} - key: String 戻り値: Boolean action / POST / トークンは確認しない(フォーム描画中は常に偽のため)。 *** キーの制約 [#e1acbfe2] *** キーの制約 [#j3a53e8d] - 使用できる文字: [A-Za-z0-9_-] を / でつないだもの - 最大バイト数: 128バイト - 接頭辞(PKRIPT_DATA_PREFIX)の外のページは指定できない ** 使用法 [#u88309ed] ** 使用法 [#df6292c0] *** カウンターを実装する [#a03fe963] *** カウンターを実装する [#ze23a52e] #pkript(highlight){{ #highlight{{ function plugin_counter_action(e) { const page = e.vars["page"]; const n = data.get("counter/" + page, 0) + 1; data.set("counter/" + page, n); wiki.redirect(page); } }} *** 書き込めるときだけフォームを表示する [#kd01f171] *** 書き込めるときだけフォームを表示する [#n031de67] #pkript(highlight){{ #highlight{{ function plugin_vote_convert(e) { if (!data.canWrite("vote/" + e.args[0])) return "<p>投票は締め切られています</p>"; return "<form method=\"post\">...</form>"; } }} *** キー一覧を取得して集計する [#uc9e4cd9] *** キー一覧を取得して集計する [#zf6ab6c6] #pkript(highlight){{ #highlight{{ const keys = data.keys("counter/"); const rows = keys.map((k) => "<tr><td>" + htmlsc(k) + "</td><td>" + data.get(k, 0) + "</td></tr>").join(""); return "<table>" + rows + "</table>"; }} ** 注意点 [#h0e42256] ** 注意点 [#l4a6cecf] 秘密データの保存には使用しないこと。data.get() はアクセス制御なしで誰でも読める。