Real-Time Dashboard
リアルタイム防災ダッシュボード
最新の防災情報をまもりちゃんがわかりやすく解説。毎日自動更新されるデータをチェックしよう。
Earthquake
最新の地震情報
—

Weather
今日の天気
—

Pollen
花粉情報
—

Quiz
今日の防災クイズ
—

Gamification
あなたの防災力は?
防災クイズに答えたり、豆知識を読むことで防災スコアがアップ。レベルを上げてバッジをコレクションしよう!
※ Phase 3(LINE連携後)で本実装予定
⭐ Lv.5 防災中級者
650
防災スコア
Lv.5 防災中級者
650 / 1000
地震マスター
天気博士
花粉ハンター
クイズ王
豆知識通
連続ログイン
防災マスター
全制覇
Blog Articles
最新の防災記事
防災のプロが監修した記事で、もしもの備えを万全に。
🏚️
地震対策
マンションの耐震性チェック — あなたの建物は大丈夫?
準備中☔
天気・気象
ゲリラ豪雨から身を守る5つの行動ルール
準備中🎒
防災知識
2026年版 非常用持ち出し袋の中身リスト完全ガイド
準備中🌸
花粉対策
ヒノキ花粉のピークはいつ?最新の花粉カレンダー
準備中📱
防災アプリ
災害時に役立つスマホアプリ10選【2026年最新版】
準備中🏠
在宅避難
自宅で安全に過ごすための在宅避難マニュアル
準備中Meet Mamori
まもりちゃんとは?
みんなの安全を見守る防災マスコット。季節やシーンに合わせていろんな姿に変身するよ!
通常
いつものまもりちゃん
地震対策
ヘルメットver
台風対策
レインコートver
花粉対策
マスクver
熱中症対策
夏バテ注意ver
クイズ
博士ver
豆知識
メガネver
Live Feed
𝕏 公式アカウント
防災マガジン公式Xの最新情報をチェック。
リアルタイム配信中。
${formatDate(data.last_time)}`; document.getElementById(‘eq-comment’).textContent = getEqComment(data.last_max_scale); const heroBadgeEq = document.getElementById(‘hero-eq-badge’); if (heroBadgeEq) heroBadgeEq.textContent = `🔴 ${scaleLabel} ${data.last_hypocenter}`; } async function renderWeather() { const data = await loadData(‘https://lp.bousai-navi.com/data/weather_history.json’); if (!data || !data.posted || data.posted.length === 0) return; const latest = data.posted[data.posted.length – 1]; const tokyo = latest.cities[‘東京’]; if (!tokyo) return; document.getElementById(‘weather-value’).innerHTML = `${tokyo.today_emoji} ${tokyo.temp_max}`; document.getElementById(‘weather-meta’).innerHTML = `東京 ${tokyo.today_label}
降水確率 ${tokyo.today_pop}`; document.getElementById(‘weather-comment’).textContent = getWeatherComment(tokyo.today_label); const heroBadgeWeather = document.getElementById(‘hero-weather-badge’); if (heroBadgeWeather) heroBadgeWeather.textContent = `${tokyo.today_emoji} 東京 ${tokyo.temp_max}`; } async function renderPollen() { const data = await loadData(‘https://lp.bousai-navi.com/data/pollen_history.json’); if (!data || !data.posted) return; let latest = null; for (let i = data.posted.length – 1; i >= 0; i–) { if (data.posted[i].levels) { latest = data.posted[i]; break; } } if (!latest) return; const maxLevel = latest.max_level || 0; const maxRegion = Object.entries(latest.levels) .sort((a, b) => b[1] – a[1])[0]; document.getElementById(‘pollen-value’).textContent = `レベル${maxLevel}`; document.getElementById(‘pollen-meta’).innerHTML = `${maxRegion[0]}エリア ${POLLEN_LABELS[maxLevel] || ”}
全国${Object.keys(latest.levels).length}地域観測`; document.getElementById(‘pollen-comment’).textContent = getPollenComment(maxLevel); } async function renderQuiz() { const data = await loadData(‘https://lp.bousai-navi.com/data/quiz_history.json’); if (!data || !data.posted) return; const count = data.posted.length; const latest = data.posted[count – 1]; document.getElementById(‘quiz-value’).textContent = `Q.${count}`; document.getElementById(‘quiz-meta’).innerHTML = `${latest.hashtag}
累計 ${count} 問出題`; document.getElementById(‘quiz-comment’).textContent = ‘今日のクイズにチャレンジしてみてね!’; const heroBadgeQuiz = document.getElementById(‘hero-quiz-badge’); if (heroBadgeQuiz) heroBadgeQuiz.textContent = `✅ 累計 ${count} 問`; } async function renderTips() { const data = await loadData(‘https://lp.bousai-navi.com/data/tips_history.json’); if (!data || !data.posted || data.posted.length === 0) return; const latest = data.posted[data.posted.length – 1]; const d = new Date(latest.timestamp); const dateStr = `${d.getFullYear()}年${d.getMonth()+1}月${d.getDate()}日`; document.getElementById(‘tips-date’).textContent = `📅 ${dateStr}の豆知識`; document.getElementById(‘tips-title’).textContent = latest.hashtag.replace(‘#’, ”); document.getElementById(‘tips-body’).textContent = `今日のテーマは「${latest.hashtag.replace(‘#’, ”)}」です。日頃の備えが、いざというとき大きな差になります。`; document.getElementById(‘tips-speech’).textContent = `「${latest.wisdom}」— まもりより`; } document.addEventListener(‘DOMContentLoaded’, () => { renderEarthquake(); renderWeather(); renderPollen(); renderQuiz(); renderTips(); }); const SCALE_MAP = { 10: ‘震度1’, 20: ‘震度2’, 30: ‘震度3’, 40: ‘震度4’, 45: ‘震度5弱’, 50: ‘震度5強’, 55: ‘震度6弱’, 60: ‘震度6強’, 70: ‘震度7’ }; const POLLEN_LABELS = [‘なし’, ‘少ない’, ‘やや多い’, ‘多い’, ‘非常に多い’, ‘極めて多い’]; const MAMORI_COMMENTS = { earthquake: { low: ‘揺れは小さかったけど、避難経路は確認してね!’, mid: ‘少し大きめの揺れだったよ。家具の転倒防止、大丈夫?’, high: ‘大きな地震です!すぐに安全な場所に移動してね!’ }, weather: { clear: ‘お出かけ日和だよ~!水分補給も忘れずにね!’, cloudy: ‘曇りだけど、急な雨に備えて折り畳み傘があると安心だよ!’, rain: ‘雨の日は足元に注意してね!傘を忘れずに!’, snow: ‘雪の日は路面が滑りやすいよ。暖かくしてお出かけしてね!’ }, pollen: { low: ‘花粉は落ち着いてるよ。でも油断は禁物!’, mid: ‘マスクと目薬を忘れずにね!’, high: ‘花粉が多い日!できるだけ外出を控えて、帰ったらすぐ着替えてね!’ } }; function formatDate(dateStr) { const d = new Date(dateStr); return `${d.getFullYear()}年${d.getMonth()+1}月${d.getDate()}日 ${String(d.getHours()).padStart(2,’0′)}:${String(d.getMinutes()).padStart(2,’0′)}`; } function getScaleLabel(scale) { return SCALE_MAP[scale] || `震度${Math.floor(scale/10)}`; } function getEqComment(scale) { if (scale >= 50) return MAMORI_COMMENTS.earthquake.high; if (scale >= 30) return MAMORI_COMMENTS.earthquake.mid; return MAMORI_COMMENTS.earthquake.low; } function getWeatherComment(label) { if (label.includes(‘雪’)) return MAMORI_COMMENTS.weather.snow; if (label.includes(‘雨’)) return MAMORI_COMMENTS.weather.rain; if (label.includes(‘くもり’) || label.includes(‘曇’)) return MAMORI_COMMENTS.weather.cloudy; return MAMORI_COMMENTS.weather.clear; } function getPollenComment(maxLevel) { if (maxLevel >= 4) return MAMORI_COMMENTS.pollen.high; if (maxLevel >= 2) return MAMORI_COMMENTS.pollen.mid; return MAMORI_COMMENTS.pollen.low; } async function loadData(url) { try { const res = await fetch(url); if (!res.ok) throw new Error(res.statusText); return await res.json(); } catch { return null; } } async function renderEarthquake() { const data = await loadData(‘https://lp.bousai-navi.com/data/last_earthquake.json’); if (!data) return; const scaleLabel = getScaleLabel(data.last_max_scale); document.getElementById(‘eq-value’).textContent = scaleLabel; document.getElementById(‘eq-meta’).innerHTML = `${data.last_hypocenter} M${data.last_magnitude}
${formatDate(data.last_time)}`; document.getElementById(‘eq-comment’).textContent = getEqComment(data.last_max_scale); const heroBadgeEq = document.getElementById(‘hero-eq-badge’); if (heroBadgeEq) heroBadgeEq.textContent = `🔴 ${scaleLabel} ${data.last_hypocenter}`; } async function renderWeather() { const data = await loadData(‘https://lp.bousai-navi.com/data/weather_history.json’); if (!data || !data.posted || data.posted.length === 0) return; const latest = data.posted[data.posted.length – 1]; const tokyo = latest.cities[‘東京’]; if (!tokyo) return; document.getElementById(‘weather-value’).innerHTML = `${tokyo.today_emoji} ${tokyo.temp_max}`; document.getElementById(‘weather-meta’).innerHTML = `東京 ${tokyo.today_label}
降水確率 ${tokyo.today_pop}`; document.getElementById(‘weather-comment’).textContent = getWeatherComment(tokyo.today_label); const heroBadgeWeather = document.getElementById(‘hero-weather-badge’); if (heroBadgeWeather) heroBadgeWeather.textContent = `${tokyo.today_emoji} 東京 ${tokyo.temp_max}`; } async function renderPollen() { const data = await loadData(‘https://lp.bousai-navi.com/data/pollen_history.json’); if (!data || !data.posted) return; let latest = null; for (let i = data.posted.length – 1; i >= 0; i–) { if (data.posted[i].levels) { latest = data.posted[i]; break; } } if (!latest) return; const maxLevel = latest.max_level || 0; const maxRegion = Object.entries(latest.levels) .sort((a, b) => b[1] – a[1])[0]; document.getElementById(‘pollen-value’).textContent = `レベル${maxLevel}`; document.getElementById(‘pollen-meta’).innerHTML = `${maxRegion[0]}エリア ${POLLEN_LABELS[maxLevel] || ”}
全国${Object.keys(latest.levels).length}地域観測`; document.getElementById(‘pollen-comment’).textContent = getPollenComment(maxLevel); } async function renderQuiz() { const data = await loadData(‘https://lp.bousai-navi.com/data/quiz_history.json’); if (!data || !data.posted) return; const count = data.posted.length; const latest = data.posted[count – 1]; document.getElementById(‘quiz-value’).textContent = `Q.${count}`; document.getElementById(‘quiz-meta’).innerHTML = `${latest.hashtag}
累計 ${count} 問出題`; document.getElementById(‘quiz-comment’).textContent = ‘今日のクイズにチャレンジしてみてね!’; const heroBadgeQuiz = document.getElementById(‘hero-quiz-badge’); if (heroBadgeQuiz) heroBadgeQuiz.textContent = `✅ 累計 ${count} 問`; } async function renderTips() { const data = await loadData(‘https://lp.bousai-navi.com/data/tips_history.json’); if (!data || !data.posted || data.posted.length === 0) return; const latest = data.posted[data.posted.length – 1]; const d = new Date(latest.timestamp); const dateStr = `${d.getFullYear()}年${d.getMonth()+1}月${d.getDate()}日`; document.getElementById(‘tips-date’).textContent = `📅 ${dateStr}の豆知識`; document.getElementById(‘tips-title’).textContent = latest.hashtag.replace(‘#’, ”); document.getElementById(‘tips-body’).textContent = `今日のテーマは「${latest.hashtag.replace(‘#’, ”)}」です。日頃の備えが、いざというとき大きな差になります。`; document.getElementById(‘tips-speech’).textContent = `「${latest.wisdom}」— まもりより`; } document.addEventListener(‘DOMContentLoaded’, () => { renderEarthquake(); renderWeather(); renderPollen(); renderQuiz(); renderTips(); });




