{"id":26117,"date":"2025-07-21T14:09:39","date_gmt":"2025-07-21T05:09:39","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26117"},"modified":"2025-07-21T14:09:41","modified_gmt":"2025-07-21T05:09:41","slug":"verse-%e6%ac%a1%e4%b8%96%e4%bb%a3%e3%82%bd%e3%83%bc%e3%82%b7%e3%83%a3%e3%83%ab%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=26117","title":{"rendered":"Verse &#8211; \u6b21\u4e16\u4ee3\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>\n&lt;!DOCTYPE html>\n&lt;html lang=\"ja\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    &lt;title>Verse - \u6b21\u4e16\u4ee3\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af&lt;\/title>\n &lt;!-- SVG \u30d5\u30a1\u30d3\u30b3\u30f3\u3092\u6307\u5b9a -->\n   &lt;link rel=\"shortcut icon\" href=\"favicon.ico\">\n  &lt;!-- PNG\u7248 -->\n  &lt;link rel=\"icon\" type=\"image\/png\" href=\"favicon.png\">\n  &lt;!-- SVG\u7248 -->\n  &lt;link rel=\"icon\" type=\"image\/svg+xml\" href=\"favicon.svg\">\n\n\n\n    &lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/tailwindcss@2.2.19\/dist\/tailwind.min.css\" rel=\"stylesheet\">\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/@fortawesome\/fontawesome-free@6.4.0\/css\/all.min.css\">\n    &lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/rita@3.0.0\/dist\/rita.min.js\">&lt;\/script>\n    &lt;style>\n        body { \n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; \n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n            min-height: 100vh;\n        }\n        .glass-effect { \n            background: rgba(255,255,255,0.25); \n            backdrop-filter: blur(10px); \n            border-radius: 10px; \n            border: 1px solid rgba(255,255,255,0.18);\n        }\n        .card-hover { transition: all 0.3s ease; }\n        .card-hover:hover { \n            transform: translateY(-5px); \n            box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);\n        }\n        .gradient-text { \n            background: linear-gradient(45deg, #667eea, #764ba2); \n            -webkit-background-clip: text; \n            -webkit-text-fill-color: transparent; \n            background-clip: text;\n        }\n        .timeline-post { \n            background: white; \n            border-radius: 15px; \n            box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); \n            transition: all 0.3s ease; \n            border-left: 4px solid #667eea;\n        }\n        .timeline-post:hover { \n            transform: translateX(5px); \n            box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n        }\n        .profile-avatar { \n            width: 100px; \n            height: 100px; \n            border-radius: 50%; \n            object-fit: cover; \n            border: 4px solid white; \n            box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n        }\n        .btn-primary { \n            background: linear-gradient(45deg, #667eea, #764ba2); \n            border: none; \n            transition: all 0.3s ease;\n        }\n        .btn-primary:hover { \n            transform: translateY(-2px); \n            box-shadow: 0 7px 14px rgba(0,0,0,0.18);\n        }\n        .section-divider { \n            height: 3px; \n            background: linear-gradient(90deg, #667eea, #764ba2); \n            border-radius: 2px; \n            margin: 2rem 0;\n        }\n        .username-badge { \n            background: linear-gradient(45deg, #667eea, #764ba2); \n            color: white; \n            padding: 0.2rem 0.5rem; \n            border-radius: 1rem; \n            font-size: 0.75rem; \n            font-weight: 600; \n            display: inline-block; \n            margin-left: 0.5rem;\n        }\n        .share-menu { \n            position: absolute; \n            z-index: 50; \n            min-width: 180px; \n            right: 0; \n            top: 110%; \n            background: white; \n            border-radius: 10px; \n            box-shadow: 0 8px 24px rgba(0,0,0,0.13);\n        }\n        .share-menu button { \n            width: 100%; \n            text-align: left; \n            padding: 10px 20px; \n            border: none; \n            background: none; \n            cursor: pointer; \n            font-size: 0.95rem;\n        }\n        .share-menu button:hover { background: #f0f4ff; }\n        .status-indicator { \n            display: inline-block; \n            width: 8px; \n            height: 8px; \n            border-radius: 50%; \n            margin-right: 5px;\n        }\n        .status-active { \n            background-color: #10b981; \n            animation: pulse 2s infinite;\n        }\n        .status-inactive { background-color: #6b7280; }\n        .log-container { \n            max-height: 150px; \n            overflow-y: auto; \n            background: rgba(255,255,255,0.1); \n            border-radius: 5px; \n            padding: 10px; \n            margin-top: 10px; \n            font-size: 0.8rem;\n            font-family: monospace;\n        }\n        .rss-item { \n            background: rgba(255,255,255,0.1); \n            border-radius: 5px; \n            padding: 8px; \n            margin: 5px 0; \n            font-size: 0.8rem;\n        }\n        .error-message { \n            color: #ef4444; \n            background: rgba(239, 68, 68, 0.1); \n            padding: 8px; \n            border-radius: 5px; \n            margin: 5px 0;\n        }\n        .success-message { \n            color: #10b981; \n            background: rgba(16, 185, 129, 0.1); \n            padding: 8px; \n            border-radius: 5px; \n            margin: 5px 0;\n        }\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.5; }\n        }\n        .dark .glass-effect { \n            background: rgba(0,0,0,0.3); \n            backdrop-filter: blur(10px); \n            border: 1px solid rgba(255,255,255,0.1);\n        }\n        .dark .timeline-post { \n            background: #374151; \n            color: #f9fafb;\n        }\n        @media print { \n            body { background: white !important; -webkit-print-color-adjust: exact; } \n            .glass-effect { background: white !important; backdrop-filter: none !important; border: 1px solid #e5e7eb !important; }\n        }\n    &lt;\/style>\n&lt;\/head>\n&lt;body>\n&lt;header class=\"glass-effect mx-4 mt-4 p-6\">\n    &lt;div class=\"text-center\">\n        &lt;h1 class=\"text-4xl font-bold text-white mb-2\">\n            &lt;i class=\"fas fa-comments mr-3\">&lt;\/i>Verse\n            &lt;span class=\"text-sm opacity-75 ml-2\">v2.0 \u5b8c\u5168\u4fee\u6b63\u7248&lt;\/span>\n        &lt;\/h1>\n        &lt;p class=\"text-white text-lg opacity-90\">\u6b21\u4e16\u4ee3\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af&lt;\/p>\n        &lt;div class=\"mt-4 flex justify-center items-center space-x-4\">\n            &lt;div class=\"flex items-center\">\n                &lt;img id=\"header-profile-icon\" class=\"profile-avatar\" src=\"https:\/\/via.placeholder.com\/100\" alt=\"\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\">\n                &lt;div class=\"ml-3 text-white\">\n                    &lt;div class=\"font-semibold text-lg\" id=\"header-username\">\u672a\u8a2d\u5b9a&lt;\/div>\n                    &lt;div class=\"text-sm opacity-75\">\u30e6\u30fc\u30b6\u30fc&lt;\/div>\n                &lt;\/div>\n            &lt;\/div>\n            &lt;button onclick=\"toggleDarkMode()\" class=\"btn-primary px-4 py-2 rounded-full text-white\">\n                &lt;i class=\"fas fa-moon mr-2\">&lt;\/i>\u30c0\u30fc\u30af\u30e2\u30fc\u30c9\n            &lt;\/button>\n            &lt;button onclick=\"showSystemStatus()\" class=\"btn-primary px-4 py-2 rounded-full text-white\">\n                &lt;i class=\"fas fa-info-circle mr-2\">&lt;\/i>\u30b9\u30c6\u30fc\u30bf\u30b9\n            &lt;\/button>\n        &lt;\/div>\n    &lt;\/div>\n&lt;\/header>\n\n&lt;div class=\"max-w-6xl mx-auto px-4 py-6\">\n    &lt;div class=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n        &lt;!-- \u5de6\u5074\u30ab\u30e9\u30e0 -->\n        &lt;div class=\"lg:col-span-1 space-y-6\">\n            &lt;!-- \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb -->\n            &lt;div class=\"glass-effect p-6 card-hover\">\n                &lt;h3 class=\"text-2xl font-bold gradient-text mb-4\">\n                    &lt;i class=\"fas fa-user-circle mr-2\">&lt;\/i>\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\n                &lt;\/h3>\n                &lt;div class=\"text-center mb-6\">\n                    &lt;img id=\"profile-icon\" class=\"profile-avatar mx-auto mb-4\" src=\"https:\/\/via.placeholder.com\/100\" alt=\"\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\">\n                    &lt;input type=\"file\" id=\"profile-upload\" accept=\"image\/*\" onchange=\"uploadProfileIcon(event)\" class=\"hidden\">\n                    &lt;button onclick=\"document.getElementById('profile-upload').click()\" class=\"btn-primary px-4 py-2 rounded-full text-white\">\n                        &lt;i class=\"fas fa-camera mr-2\">&lt;\/i>\u753b\u50cf\u5909\u66f4\n                    &lt;\/button>\n                &lt;\/div>\n                &lt;div class=\"space-y-4\">\n                    &lt;div>\n                        &lt;label class=\"block text-white font-semibold mb-2\">\u30e6\u30fc\u30b6\u30fc\u540d&lt;\/label>\n                        &lt;input type=\"text\" id=\"username\" class=\"w-full p-3 border rounded-lg bg-white bg-opacity-90\" placeholder=\"\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\" maxlength=\"20\">\n                    &lt;\/div>\n                    &lt;div>\n                        &lt;label class=\"block text-white font-semibold mb-2\">\u81ea\u5df1\u7d39\u4ecb&lt;\/label>\n                        &lt;textarea id=\"self-intro\" class=\"w-full p-3 border rounded-lg bg-white bg-opacity-90\" rows=\"4\" placeholder=\"\u81ea\u5df1\u7d39\u4ecb\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\">&lt;\/textarea>\n                    &lt;\/div>\n                    &lt;button onclick=\"saveProfile()\" class=\"btn-primary w-full py-2 rounded-lg text-white\">\n                        &lt;i class=\"fas fa-save mr-2\">&lt;\/i>\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u4fdd\u5b58\n                    &lt;\/button>\n                    &lt;div class=\"p-3 bg-white bg-opacity-80 rounded-lg\">\n                        &lt;h5 class=\"font-semibold text-gray-800 mb-2\">\u30d7\u30ec\u30d3\u30e5\u30fc:&lt;\/h5>\n                        &lt;div class=\"text-gray-700\">\n                            &lt;div class=\"font-semibold mb-1\" id=\"username-preview\">\u672a\u8a2d\u5b9a&lt;\/div>\n                            &lt;div id=\"self-intro-preview\" class=\"text-sm whitespace-pre-line min-h-8\">\u307e\u3060\u81ea\u5df1\u7d39\u4ecb\u304c\u3042\u308a\u307e\u305b\u3093&lt;\/div>\n                        &lt;\/div>\n                    &lt;\/div>\n                &lt;\/div>\n            &lt;\/div>\n\n            &lt;!-- BOT\u6a5f\u80fd -->\n            &lt;div class=\"glass-effect p-6 card-hover\">\n                &lt;h3 class=\"text-xl font-bold text-white mb-4\">\n                    &lt;i class=\"fas fa-robot mr-2\">&lt;\/i>BOT\u6a5f\u80fd\n                    &lt;span class=\"status-indicator\" id=\"bot-status\">&lt;\/span>\n                    &lt;span id=\"bot-status-text\" class=\"text-xs opacity-75\">\u505c\u6b62\u4e2d&lt;\/span>\n                &lt;\/h3>\n                &lt;div class=\"space-y-4\">\n                    &lt;div>\n                        &lt;textarea id=\"botContent\" class=\"w-full p-3 border rounded-lg bg-white bg-opacity-90\" rows=\"3\" placeholder=\"BOT\u6295\u7a3f\u5185\u5bb9\">&lt;\/textarea>\n                        &lt;button onclick=\"postBotMessage()\" class=\"btn-primary w-full mt-2 py-2 rounded-lg text-white\">\n                            &lt;i class=\"fas fa-robot mr-2\">&lt;\/i>BOT\u6295\u7a3f\n                        &lt;\/button>\n                    &lt;\/div>\n                    &lt;div>\n                        &lt;input type=\"number\" id=\"botIntervalSec\" class=\"w-full p-2 border rounded-lg bg-white bg-opacity-90\" placeholder=\"\u30de\u30eb\u30b3\u30d5\u81ea\u52d5\u6295\u7a3f\u9593\u9694(\u79d2)\" min=\"10\" max=\"3600\" value=\"60\">\n                        &lt;div class=\"flex space-x-2 mt-2\">\n                            &lt;button onclick=\"postMarkovBot()\" class=\"btn-primary flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-dice mr-2\">&lt;\/i>\u30de\u30eb\u30b3\u30d5\u751f\u6210\n                            &lt;\/button>\n                            &lt;button onclick=\"startBotAutoPost()\" class=\"btn-primary flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-play mr-2\">&lt;\/i>\u81ea\u52d5\u958b\u59cb\n                            &lt;\/button>\n                            &lt;button onclick=\"stopBotAutoPost()\" class=\"bg-red-500 hover:bg-red-600 flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-stop mr-2\">&lt;\/i>\u505c\u6b62\n                            &lt;\/button>\n                        &lt;\/div>\n                    &lt;\/div>\n                    &lt;div class=\"text-white text-xs opacity-75\">\n                        &lt;i class=\"fas fa-info-circle mr-1\">&lt;\/i>\u30de\u30eb\u30b3\u30d5\u9023\u9396\u3067\u306f\u904e\u53bb\u306e\u6295\u7a3f\u304b\u3089\u30e9\u30f3\u30c0\u30e0\u306a\u6587\u7ae0\u3092\u751f\u6210\u3057\u307e\u3059\n                    &lt;\/div>\n                    &lt;div id=\"bot-log\" class=\"log-container text-white text-xs\">&lt;\/div>\n                &lt;\/div>\n            &lt;\/div>\n\n            &lt;!-- RSS\u6a5f\u80fd -->\n            &lt;div class=\"glass-effect p-6 card-hover\">\n                &lt;h3 class=\"text-xl font-bold text-white mb-4\">\n                    &lt;i class=\"fas fa-rss mr-2\">&lt;\/i>RSS\u6a5f\u80fd\n                    &lt;span class=\"status-indicator\" id=\"rss-status\">&lt;\/span>\n                    &lt;span id=\"rss-status-text\" class=\"text-xs opacity-75\">\u505c\u6b62\u4e2d&lt;\/span>\n                &lt;\/h3>\n                &lt;div class=\"space-y-4\">\n                    &lt;div>\n                        &lt;input type=\"text\" id=\"feedUrl\" class=\"w-full p-3 border rounded-lg bg-white bg-opacity-90\" placeholder=\"RSS URL\">\n                        &lt;button onclick=\"registerFeedUrl()\" class=\"btn-primary w-full mt-2 py-2 rounded-lg text-white\">\n                            &lt;i class=\"fas fa-plus mr-2\">&lt;\/i>\u30d5\u30a3\u30fc\u30c9\u767b\u9332\n                        &lt;\/button>\n                    &lt;\/div>\n                    &lt;div>\n                        &lt;input type=\"number\" id=\"feedIntervalSec\" class=\"w-full p-2 border rounded-lg bg-white bg-opacity-90\" placeholder=\"RSS\u81ea\u52d5\u53d6\u5f97\u9593\u9694(\u79d2)\" min=\"60\" max=\"3600\" value=\"180\">\n                        &lt;div class=\"flex space-x-2 mt-2\">\n                            &lt;button onclick=\"fetchAllFeeds()\" class=\"btn-primary flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-download mr-2\">&lt;\/i>\u624b\u52d5\u53d6\u5f97\n                            &lt;\/button>\n                            &lt;button onclick=\"startRSSAutoPost()\" class=\"btn-primary flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-play mr-2\">&lt;\/i>\u81ea\u52d5\u958b\u59cb\n                            &lt;\/button>\n                            &lt;button onclick=\"stopRSSAutoPost()\" class=\"bg-red-500 hover:bg-red-600 flex-1 py-2 rounded-lg text-white\">\n                                &lt;i class=\"fas fa-stop mr-2\">&lt;\/i>\u505c\u6b62\n                            &lt;\/button>\n                        &lt;\/div>\n                    &lt;\/div>\n                    &lt;div class=\"bg-white bg-opacity-80 rounded-lg p-3\">\n                        &lt;div class=\"flex justify-between items-center mb-2\">\n                            &lt;h5 class=\"font-semibold text-gray-800\">\u767b\u9332\u6e08\u307f\u30d5\u30a3\u30fc\u30c9:&lt;\/h5>\n                            &lt;button onclick=\"addDefaultFeeds()\" class=\"text-xs bg-blue-500 text-white px-2 py-1 rounded\">\n                                \u30c7\u30d5\u30a9\u30eb\u30c8\u8ffd\u52a0\n                            &lt;\/button>\n                        &lt;\/div>\n                        &lt;div id=\"feed-list\" class=\"text-sm text-gray-700\">&lt;\/div>\n                    &lt;\/div>\n                    &lt;div id=\"rss-log\" class=\"log-container text-white text-xs\">&lt;\/div>\n                &lt;\/div>\n            &lt;\/div>\n        &lt;\/div>\n\n        &lt;!-- \u53f3\u5074\u30ab\u30e9\u30e0 -->\n        &lt;div class=\"lg:col-span-2 space-y-6\">\n            &lt;!-- \u65b0\u898f\u6295\u7a3f -->\n            &lt;div class=\"glass-effect p-6 card-hover\">\n                &lt;h3 class=\"text-2xl font-bold gradient-text mb-4\">\n                    &lt;i class=\"fas fa-edit mr-2\">&lt;\/i>\u65b0\u898f\u6295\u7a3f\n                &lt;\/h3>\n                &lt;div>\n                    &lt;textarea id=\"postContent\" class=\"w-full p-4 border rounded-lg bg-white bg-opacity-90\" rows=\"4\" placeholder=\"\u4eca\u4f55\u3092\u8003\u3048\u3066\u3044\u307e\u3059\u304b\uff1f\" maxlength=\"500\">&lt;\/textarea>\n                    &lt;div class=\"mt-4 flex justify-between items-center\">\n                        &lt;div class=\"text-white text-sm opacity-75\">\n                            &lt;i class=\"fas fa-info-circle mr-1\">&lt;\/i>\u3042\u306a\u305f\u306e\u601d\u3044\u3092\u5171\u6709\u3057\u307e\u3057\u3087\u3046 \n                            &lt;span id=\"char-count\" class=\"ml-2\">(0\/500)&lt;\/span>\n                        &lt;\/div>\n                        &lt;button onclick=\"createUserPost()\" class=\"btn-primary px-6 py-3 rounded-lg text-white font-semibold\">\n                            &lt;i class=\"fas fa-paper-plane mr-2\">&lt;\/i>\u6295\u7a3f\u3059\u308b\n                        &lt;\/button>\n                    &lt;\/div>\n                &lt;\/div>\n            &lt;\/div>\n\n            &lt;div class=\"section-divider\">&lt;\/div>\n\n            &lt;!-- \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 -->\n            &lt;div class=\"glass-effect p-6\">\n                &lt;div class=\"flex justify-between items-center mb-6\">\n                    &lt;h3 class=\"text-2xl font-bold text-white\">\n                        &lt;i class=\"fas fa-stream mr-2\">&lt;\/i>\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3 \n                        &lt;span id=\"post-count\" class=\"text-sm font-normal opacity-75 ml-2\">(0\u4ef6\u306e\u6295\u7a3f)&lt;\/span>\n                    &lt;\/h3>\n                    &lt;div class=\"flex space-x-2\">\n                        &lt;button onclick=\"clearAllPosts()\" class=\"bg-red-500 hover:bg-red-600 px-3 py-1 rounded text-white text-sm\">\n                            &lt;i class=\"fas fa-trash mr-1\">&lt;\/i>\u5168\u524a\u9664\n                        &lt;\/button>\n                        &lt;button onclick=\"exportData()\" class=\"bg-green-500 hover:bg-green-600 px-3 py-1 rounded text-white text-sm\">\n                            &lt;i class=\"fas fa-download mr-1\">&lt;\/i>\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\n                        &lt;\/button>\n                    &lt;\/div>\n                &lt;\/div>\n                &lt;div id=\"timeline\" class=\"space-y-4\">&lt;\/div>\n                &lt;div id=\"empty-timeline\" class=\"text-center py-12 text-white opacity-75\">\n                    &lt;i class=\"fas fa-comments text-4xl mb-4\">&lt;\/i>\n                    &lt;p class=\"text-lg\">\u307e\u3060\u6295\u7a3f\u304c\u3042\u308a\u307e\u305b\u3093&lt;\/p>\n                    &lt;p class=\"text-sm\">\u6700\u521d\u306e\u6295\u7a3f\u3092\u3057\u3066\u3001\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u59cb\u3081\u307e\u3057\u3087\u3046\uff01&lt;\/p>\n                &lt;\/div>\n            &lt;\/div>\n        &lt;\/div>\n    &lt;\/div>\n&lt;\/div>\n\n&lt;footer class=\"glass-effect mx-4 mb-4 p-4 text-center\">\n    &lt;p class=\"text-white opacity-75\">\n        &lt;i class=\"fas fa-copyright mr-2\">&lt;\/i>2025 Verse - \u6b21\u4e16\u4ee3\u30bd\u30fc\u30b7\u30e3\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af v2.0\n        &lt;span class=\"ml-4\">\n            &lt;i class=\"fas fa-bug mr-1\">&lt;\/i>RSS\u81ea\u52d5\u6295\u7a3f\u5b8c\u5168\u4fee\u6b63\u7248\n        &lt;\/span>\n    &lt;\/p>\n&lt;\/footer>\n\n&lt;script>\n\/\/ === \u8a2d\u5b9a\u3068\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570 ===\nconst DEFAULT_FEEDS = &#91;\n    \"https:\/\/feeds.feedburner.com\/hatena\/b\/hotentry\",\n    \"https:\/\/gigazine.net\/news\/rss_2.0\/\",\n    \"https:\/\/rss.cnn.com\/rss\/edition.rss\",\n    \"https:\/\/feeds.bbci.co.uk\/news\/rss.xml\",\n    \"https:\/\/www.reddit.com\/r\/worldnews\/.rss\"\n];\n\nconst RSS_APIS = &#91;\n    'https:\/\/api.rss2json.com\/v1\/api.json',\n    'https:\/\/cors-anywhere.herokuapp.com\/',\n    'https:\/\/api.allorigins.win\/get'\n];\n\n\/\/ \u30b0\u30ed\u30fc\u30d0\u30eb\u72b6\u614b\nlet posts = JSON.parse(localStorage.getItem('verse_posts') || '&#91;]');\nlet feedUrls = JSON.parse(localStorage.getItem('verse_feeds') || '&#91;]');\nlet profile = JSON.parse(localStorage.getItem('verse_profile') || '{}');\nlet processedItems = new Set(JSON.parse(localStorage.getItem('verse_processed') || '&#91;]'));\n\n\/\/ \u30bf\u30a4\u30de\u30fc\u3068\u30b9\u30c6\u30fc\u30bf\u30b9\nlet botInterval = null;\nlet rssInterval = null;\nlet isDarkMode = localStorage.getItem('verse_darkMode') === 'true';\nlet markovChain = null;\nlet isInitialized = false;\n\n\/\/ \u7d71\u8a08\u60c5\u5831\nlet stats = {\n    totalPosts: 0,\n    rssSuccess: 0,\n    rssErrors: 0,\n    botPosts: 0,\n    lastRSSUpdate: null,\n    lastBotPost: null\n};\n\n\/\/ === \u521d\u671f\u5316\u51e6\u7406 ===\nfunction initializeApp() {\n    if (isInitialized) return;\n    \n    \/\/ \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u521d\u671f\u5316\n    if (!profile.icon) profile.icon = 'https:\/\/via.placeholder.com\/100';\n    if (!profile.username) profile.username = '\u30b2\u30b9\u30c8\u30e6\u30fc\u30b6\u30fc';\n    if (!profile.selfIntro) profile.selfIntro = '';\n    \n    \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u30d5\u30a3\u30fc\u30c9\u8a2d\u5b9a\n    if (feedUrls.length === 0) {\n        feedUrls = &#91;...DEFAULT_FEEDS];\n        saveData();\n        addLog('rss-log', '\u30c7\u30d5\u30a9\u30eb\u30c8RSS\u30d5\u30a3\u30fc\u30c9\u3092\u767b\u9332\u3057\u307e\u3057\u305f', 'success');\n    }\n    \n    \/\/ UI\u521d\u671f\u5316\n    updateAllUI();\n    updateStatusIndicators();\n    \n    \/\/ \u30c0\u30fc\u30af\u30e2\u30fc\u30c9\u9069\u7528\n    if (isDarkMode) {\n        document.body.classList.add('dark');\n        document.body.style.background = 'linear-gradient(135deg, #1a202c 0%, #2d3748 100%)';\n    }\n    \n    isInitialized = true;\n    addLog('rss-log', '\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u521d\u671f\u5316\u5b8c\u4e86', 'success');\n    addLog('bot-log', 'BOT\u6a5f\u80fd\u521d\u671f\u5316\u5b8c\u4e86', 'success');\n    \n    \/\/ \u521d\u56deRSS\u53d6\u5f97\uff08\u9045\u5ef6\u5b9f\u884c\uff09\n    setTimeout(() => {\n        addLog('rss-log', '\u521d\u56deRSS\u53d6\u5f97\u3092\u958b\u59cb\u3057\u307e\u3059...', 'info');\n        fetchAllFeeds();\n    }, 3000);\n}\n\n\/\/ === \u30c7\u30fc\u30bf\u7ba1\u7406 ===\nfunction saveData() {\n    try {\n        localStorage.setItem('verse_posts', JSON.stringify(posts));\n        localStorage.setItem('verse_feeds', JSON.stringify(feedUrls));\n        localStorage.setItem('verse_profile', JSON.stringify(profile));\n        localStorage.setItem('verse_processed', JSON.stringify(&#91;...processedItems]));\n        localStorage.setItem('verse_darkMode', isDarkMode);\n        \n        stats.totalPosts = posts.length;\n    } catch (error) {\n        console.error('\u30c7\u30fc\u30bf\u4fdd\u5b58\u30a8\u30e9\u30fc:', error);\n        addLog('rss-log', `\u30c7\u30fc\u30bf\u4fdd\u5b58\u30a8\u30e9\u30fc: ${error.message}`, 'error');\n    }\n}\n\nfunction clearAllPosts() {\n    if (confirm('\u3059\u3079\u3066\u306e\u6295\u7a3f\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b\uff1f\\n\u3053\u306e\u64cd\u4f5c\u306f\u5143\u306b\u623b\u305b\u307e\u305b\u3093\u3002')) {\n        posts = &#91;];\n        processedItems.clear();\n        saveData();\n        renderTimeline();\n        addLog('rss-log', '\u3059\u3079\u3066\u306e\u6295\u7a3f\u3092\u524a\u9664\u3057\u307e\u3057\u305f', 'info');\n        addLog('bot-log', '\u3059\u3079\u3066\u306e\u6295\u7a3f\u3092\u524a\u9664\u3057\u307e\u3057\u305f', 'info');\n    }\n}\n\nfunction exportData() {\n    const exportData = {\n        posts: posts,\n        profile: profile,\n        feedUrls: feedUrls,\n        stats: stats,\n        exportDate: new Date().toISOString()\n    };\n    \n    const blob = new Blob(&#91;JSON.stringify(exportData, null, 2)], { type: 'application\/json' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = `verse_export_${new Date().toISOString().split('T')&#91;0]}.json`;\n    a.click();\n    URL.revokeObjectURL(url);\n    \n    addLog('rss-log', '\u30c7\u30fc\u30bf\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f', 'success');\n}\n\n\/\/ === \u30ed\u30b0\u6a5f\u80fd ===\nfunction addLog(elementId, message, type = 'info') {\n    const logElement = document.getElementById(elementId);\n    if (!logElement) return;\n    \n    const timestamp = new Date().toLocaleTimeString('ja-JP');\n    const logEntry = document.createElement('div');\n    \n    const typeClass = {\n        'error': 'error-message',\n        'success': 'success-message',\n        'info': 'text-white opacity-75'\n    }&#91;type] || 'text-white opacity-75';\n    \n    logEntry.className = typeClass;\n    logEntry.innerHTML = `&lt;span class=\"opacity-75\">&#91;${timestamp}]&lt;\/span> ${message}`;\n    \n    logElement.appendChild(logEntry);\n    logElement.scrollTop = logElement.scrollHeight;\n    \n    \/\/ \u30ed\u30b0\u6570\u5236\u9650\n    while (logElement.children.length > 50) {\n        logElement.removeChild(logElement.firstChild);\n    }\n}\n\n\/\/ === \u30b9\u30c6\u30fc\u30bf\u30b9\u7ba1\u7406 ===\nfunction updateStatusIndicators() {\n    const botIndicator = document.getElementById('bot-status');\n    const rssIndicator = document.getElementById('rss-status');\n    const botStatusText = document.getElementById('bot-status-text');\n    const rssStatusText = document.getElementById('rss-status-text');\n    \n    if (botIndicator &amp;&amp; botStatusText) {\n        const isActive = botInterval !== null;\n        botIndicator.className = `status-indicator ${isActive ? 'status-active' : 'status-inactive'}`;\n        botStatusText.textContent = isActive ? '\u52d5\u4f5c\u4e2d' : '\u505c\u6b62\u4e2d';\n    }\n    \n    if (rssIndicator &amp;&amp; rssStatusText) {\n        const isActive = rssInterval !== null;\n        rssIndicator.className = `status-indicator ${isActive ? 'status-active' : 'status-inactive'}`;\n        rssStatusText.textContent = isActive ? '\u52d5\u4f5c\u4e2d' : '\u505c\u6b62\u4e2d';\n    }\n}\n\nfunction showSystemStatus() {\n    const statusInfo = `\n=== Verse \u30b7\u30b9\u30c6\u30e0\u30b9\u30c6\u30fc\u30bf\u30b9 ===\n\u7dcf\u6295\u7a3f\u6570: ${stats.totalPosts}\nRSS\u6210\u529f: ${stats.rssSuccess}\nRSS\u30a8\u30e9\u30fc: ${stats.rssErrors}\nBOT\u6295\u7a3f\u6570: ${stats.botPosts}\n\u6700\u5f8c\u306eRSS\u66f4\u65b0: ${stats.lastRSSUpdate || '\u306a\u3057'}\n\u6700\u5f8c\u306eBOT\u6295\u7a3f: ${stats.lastBotPost || '\u306a\u3057'}\n\nRSS\u81ea\u52d5\u53d6\u5f97: ${rssInterval ? '\u52d5\u4f5c\u4e2d' : '\u505c\u6b62\u4e2d'}\nBOT\u81ea\u52d5\u6295\u7a3f: ${botInterval ? '\u52d5\u4f5c\u4e2d' : '\u505c\u6b62\u4e2d'}\n\u767b\u9332\u30d5\u30a3\u30fc\u30c9\u6570: ${feedUrls.length}\n\u51e6\u7406\u6e08\u307f\u30a2\u30a4\u30c6\u30e0: ${processedItems.size}\n    `;\n    alert(statusInfo);\n}\n\n\/\/ === \u6295\u7a3f\u7ba1\u7406 ===\nfunction createPost(content, type = 'user', username = null, icon = null) {\n    if (!content || !content.trim()) {\n        addLog('rss-log', '\u7a7a\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u6295\u7a3f\u3067\u304d\u307e\u305b\u3093', 'error');\n        return false;\n    }\n    \n    \/\/ RSS\u91cd\u8907\u30c1\u30a7\u30c3\u30af\n    if (type === 'feed') {\n        const urlMatch = content.match(\/href=\"(&#91;^\"]+)\"\/);\n        const url = urlMatch ? urlMatch&#91;1] : null;\n        \n        if (url &amp;&amp; processedItems.has(url)) {\n            addLog('rss-log', `\u91cd\u8907\u8a18\u4e8b\u3092\u30b9\u30ad\u30c3\u30d7: ${url.substring(0, 50)}...`, 'info');\n            return false;\n        }\n        \n        if (url) {\n            processedItems.add(url);\n        }\n    }\n    \n    const post = {\n        id: Date.now() + Math.random(),\n        content: content.trim(),\n        likes: 0,\n        timestamp: new Date().toLocaleString('ja-JP'),\n        type: type,\n        username: username || profile.username,\n        icon: icon || profile.icon\n    };\n    \n    posts.unshift(post);\n    \n    \/\/ \u7d71\u8a08\u66f4\u65b0\n    if (type === 'bot' || type === 'markov') {\n        stats.botPosts++;\n        stats.lastBotPost = post.timestamp;\n    }\n    if (type === 'feed') {\n        stats.rssSuccess++;\n        stats.lastRSSUpdate = post.timestamp;\n    }\n    \n    saveData();\n    renderTimeline();\n    return true;\n}\n\nfunction createUserPost() {\n    const content = document.getElementById('postContent').value.trim();\n    if (content) {\n        if (createPost(content, 'user')) {\n            document.getElementById('postContent').value = '';\n            updateCharCount();\n            addLog('bot-log', '\u30e6\u30fc\u30b6\u30fc\u6295\u7a3f\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f', 'success');\n        }\n    }\n}\n\nfunction likePost(id) {\n    const post = posts.find(p => p.id === id);\n    if (post) {\n        post.likes++;\n        saveData();\n        renderTimeline();\n    }\n}\n\nfunction deletePost(id) {\n    if (confirm('\u3053\u306e\u6295\u7a3f\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f')) {\n        const post = posts.find(p => p.id === id);\n        if (post &amp;&amp; post.type === 'feed') {\n            const urlMatch = post.content.match(\/href=\"(&#91;^\"]+)\"\/);\n            if (urlMatch) {\n                processedItems.delete(urlMatch&#91;1]);\n            }\n        }\n        \n        posts = posts.filter(p => p.id !== id);\n        saveData();\n        renderTimeline();\n    }\n}\n\n\/\/ === \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u8868\u793a ===\nfunction renderTimeline() {\n    const timeline = document.getElementById('timeline');\n    const emptyTimeline = document.getElementById('empty-timeline');\n    const postCount = document.getElementById('post-count');\n    \n    if (posts.length === 0) {\n        timeline.innerHTML = '';\n        emptyTimeline.style.display = 'block';\n        postCount.textContent = '(0\u4ef6\u306e\u6295\u7a3f)';\n        return;\n    }\n    \n    emptyTimeline.style.display = 'none';\n    postCount.textContent = `(${posts.length}\u4ef6\u306e\u6295\u7a3f)`;\n    \n    timeline.innerHTML = posts.map(post => {\n        const typeInfo = getPostTypeInfo(post.type);\n        return `\n            &lt;div class=\"timeline-post p-6\">\n                &lt;div class=\"flex justify-between items-start mb-4\">\n                    &lt;div class=\"flex items-center space-x-3\">\n                        &lt;img src=\"${post.icon}\" alt=\"\u30a2\u30d0\u30bf\u30fc\" class=\"w-10 h-10 rounded-full object-cover\">\n                        &lt;div>\n                            &lt;div class=\"flex items-center\">\n                                &lt;span class=\"font-semibold text-gray-800 dark:text-white\">${post.username}&lt;\/span>\n                                &lt;span class=\"username-badge\">${typeInfo.badge}&lt;\/span>\n                            &lt;\/div>\n                            &lt;div class=\"text-sm text-gray-500 dark:text-gray-400\">${post.timestamp}&lt;\/div>\n                        &lt;\/div>\n                    &lt;\/div>\n                &lt;\/div>\n                &lt;div class=\"text-gray-800 dark:text-gray-200 mb-4 leading-relaxed\">${post.content}&lt;\/div>\n                &lt;div class=\"flex items-center space-x-4 pt-4 border-t border-gray-100 dark:border-gray-600\">\n                    &lt;button onclick=\"likePost(${post.id})\" class=\"flex items-center space-x-2 text-gray-600 dark:text-gray-400 hover:text-red-500 transition-colors\">\n                        &lt;i class=\"fas fa-heart\">&lt;\/i>\n                        &lt;span>${post.likes}&lt;\/span>\n                    &lt;\/button>\n                    &lt;div class=\"relative\">\n                        &lt;button onclick=\"toggleShareMenu(${post.id})\" class=\"flex items-center space-x-2 text-gray-600 dark:text-gray-400 hover:text-blue-500 transition-colors\">\n                            &lt;i class=\"fas fa-share\">&lt;\/i>\n                            &lt;span>\u30b7\u30a7\u30a2&lt;\/span>\n                        &lt;\/button>\n                        &lt;div id=\"share-menu-${post.id}\" class=\"share-menu hidden\">\n                            &lt;button onclick=\"shareToX(${post.id})\">&lt;i class=\"fab fa-x-twitter text-blue-400 mr-2\">&lt;\/i>X\u3067\u30b7\u30a7\u30a2&lt;\/button>\n                            &lt;button onclick=\"shareToLine(${post.id})\">&lt;i class=\"fab fa-line text-green-400 mr-2\">&lt;\/i>LINE\u3067\u30b7\u30a7\u30a2&lt;\/button>\n                            &lt;button onclick=\"copyPost(${post.id})\">&lt;i class=\"fas fa-copy mr-2\">&lt;\/i>\u30b3\u30d4\u30fc&lt;\/button>\n                        &lt;\/div>\n                    &lt;\/div>\n                    &lt;button onclick=\"deletePost(${post.id})\" class=\"flex items-center space-x-2 text-gray-600 dark:text-gray-400 hover:text-red-500 transition-colors ml-auto\">\n                        &lt;i class=\"fas fa-trash\">&lt;\/i>\n                        &lt;span>\u524a\u9664&lt;\/span>\n                    &lt;\/button>\n                &lt;\/div>\n            &lt;\/div>\n        `;\n    }).join('');\n}\n\nfunction getPostTypeInfo(type) {\n    const typeMap = {\n        'bot': { badge: '\ud83e\udd16 BOT' },\n        'markov': { badge: '\ud83c\udfb2 MarkovBOT' },\n        'feed': { badge: '\ud83d\udce1 RSS Feed' },\n        'user': { badge: '\ud83d\udc64 \u30e6\u30fc\u30b6\u30fc' }\n    };\n    return typeMap&#91;type] || typeMap&#91;'user'];\n}\n\n\/\/ === \u30b7\u30a7\u30a2\u6a5f\u80fd ===\nfunction getPostContentText(id) {\n    const post = posts.find(p => p.id === id);\n    if (!post) return '';\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = post.content;\n    return tempDiv.textContent || tempDiv.innerText || '';\n}\n\nfunction toggleShareMenu(id) {\n    document.querySelectorAll('&#91;id^=\"share-menu-\"]').forEach(el => el.classList.add('hidden'));\n    const menu = document.getElementById('share-menu-' + id);\n    if (menu) {\n        menu.classList.toggle('hidden');\n        setTimeout(() => {\n            const closeMenu = (e) => {\n                if (!menu.contains(e.target)) {\n                    menu.classList.add('hidden');\n                    document.removeEventListener('mousedown', closeMenu);\n                }\n            };\n            document.addEventListener('mousedown', closeMenu);\n        }, 100);\n    }\n}\n\nfunction shareToX(id) {\n    const text = encodeURIComponent(getPostContentText(id));\n    const url = encodeURIComponent(location.href);\n    window.open(`https:\/\/twitter.com\/intent\/tweet?text=${text}&amp;url=${url}`, '_blank');\n}\n\nfunction shareToLine(id) {\n    const text = encodeURIComponent(getPostContentText(id) + ' ' + location.href);\n    window.open(`https:\/\/social-plugins.line.me\/lineit\/share?url=${text}`, '_blank');\n}\n\nfunction copyPost(id) {\n    const text = getPostContentText(id);\n    navigator.clipboard.writeText(text).then(() => {\n        alert('\u6295\u7a3f\u5185\u5bb9\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01');\n    }).catch(() => {\n        const textarea = document.createElement('textarea');\n        textarea.value = text;\n        document.body.appendChild(textarea);\n        textarea.select();\n        document.execCommand('copy');\n        document.body.removeChild(textarea);\n        alert('\u6295\u7a3f\u5185\u5bb9\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01');\n    });\n}\n\n\/\/ === BOT\u6a5f\u80fd ===\nfunction postBotMessage() {\n    const content = document.getElementById('botContent').value.trim();\n    if (content) {\n        if (createPost(content, 'bot', 'BOT')) {\n            document.getElementById('botContent').value = '';\n            addLog('bot-log', `BOT\u6295\u7a3f: \"${content.substring(0, 30)}...\"`, 'success');\n        }\n    }\n}\n\n\/\/ === \u30de\u30eb\u30b3\u30d5\u9023\u9396\u6a5f\u80fd\uff08\u5f37\u5316\u7248\uff09 ===\nfunction initializeMarkovChain() {\n    try {\n        if (typeof RiTa === 'undefined') {\n            addLog('bot-log', 'RiTa\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u672a\u8aad\u307f\u8fbc\u307f\u3067\u3059', 'error');\n            return false;\n        }\n        \n        markovChain = new RiTa.Markov(3);\n        \n        const userPosts = posts.filter(p => \n            (p.type === 'user' || p.type === 'bot') &amp;&amp; \n            p.content.length > 20 &amp;&amp;\n            !p.content.includes('&lt;div') &amp;&amp;\n            !p.content.includes('href=')\n        );\n        \n        if (userPosts.length &lt; 5) {\n            addLog('bot-log', `\u5b66\u7fd2\u30c7\u30fc\u30bf\u4e0d\u8db3 (${userPosts.length}\u4ef6) - 5\u4ef6\u4ee5\u4e0a\u5fc5\u8981`, 'error');\n            return false;\n        }\n        \n        const textData = userPosts\n            .map(p => cleanTextForMarkov(p.content))\n            .filter(text => text.length > 15)\n            .join('\\n');\n            \n        if (textData.length &lt; 200) {\n            addLog('bot-log', '\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u304c\u4e0d\u5341\u5206\u3067\u3059', 'error');\n            return false;\n        }\n        \n        markovChain.addText(textData);\n        addLog('bot-log', `\u30de\u30eb\u30b3\u30d5\u9023\u9396\u5b66\u7fd2\u5b8c\u4e86 (${userPosts.length}\u4ef6\u306e\u6295\u7a3f\u3092\u5b66\u7fd2)`, 'success');\n        return true;\n        \n    } catch (error) {\n        addLog('bot-log', `\u30de\u30eb\u30b3\u30d5\u521d\u671f\u5316\u30a8\u30e9\u30fc: ${error.message}`, 'error');\n        return false;\n    }\n}\n\nfunction cleanTextForMarkov(text) {\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = text;\n    let cleanText = tempDiv.textContent || tempDiv.innerText || '';\n    \n    cleanText = cleanText\n        .replace(\/https?:\\\/\\\/&#91;^\\s]+\/g, '')\n        .replace(\/&#91;^\\u3040-\\u309F\\u30A0-\\u30FF\\u4E00-\\u9FAF\\u3400-\\u4DBFa-zA-Z0-9\\s\uff01\uff1f\u3002\u3001.,!?\\n]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .replace(\/&#91;\u3002\uff01\uff1f]{2,}\/g, '\u3002')\n        .trim();\n        \n    return cleanText;\n}\n\nfunction generateMarkovText() {\n    try {\n        if (!initializeMarkovChain()) {\n            const fallbackMessages = &#91;\n                \"\u4eca\u65e5\u306f\u3044\u3044\u5929\u6c17\u3067\u3059\u306d\uff01\u3069\u306e\u3088\u3046\u306b\u904e\u3054\u3055\u308c\u3066\u3044\u307e\u3059\u304b\uff1f\",\n                \"\u6700\u8fd1\u9762\u767d\u3044\u30cb\u30e5\u30fc\u30b9\u3042\u308a\u307e\u3057\u305f\u304b\uff1f\",\n                \"\u65b0\u3057\u3044\u30a2\u30a4\u30c7\u30a2\u304c\u6d6e\u304b\u3093\u3067\u304d\u307e\u3057\u305f\u3002\",\n                \"\u7686\u3055\u3093\u306f\u3069\u3046\u601d\u3044\u307e\u3059\u304b\uff1f\",\n                \"\u4eca\u65e5\u3082\u4e00\u65e5\u9811\u5f35\u308a\u307e\u3057\u3087\u3046\uff01\"\n            ];\n            return fallbackMessages&#91;Math.floor(Math.random() * fallbackMessages.length)];\n        }\n        \n        let bestText = '';\n        const maxAttempts = 15;\n        \n        for (let i = 0; i &lt; maxAttempts; i++) {\n            try {\n                const options = {\n                    maxLength: 120,\n                    minLength: 20,\n                    count: Math.floor(Math.random() * 2) + 1\n                };\n                \n                const sentences = markovChain.generate(options);\n                \n                if (sentences &amp;&amp; sentences.length > 0) {\n                    let generatedText = sentences.join(' ').trim();\n                    \n                    \/\/ \u6587\u7ae0\u306e\u81ea\u7136\u306a\u7d42\u7aef\u51e6\u7406\n                    if (generatedText.length > 150) {\n                        const endMarkers = &#91;'\u3002', '\uff01', '\uff1f'];\n                        let bestEnd = -1;\n                        \n                        endMarkers.forEach(marker => {\n                            const pos = generatedText.lastIndexOf(marker, 130);\n                            if (pos > 30) bestEnd = Math.max(bestEnd, pos);\n                        });\n                        \n                        if (bestEnd > -1) {\n                            generatedText = generatedText.substring(0, bestEnd + 1);\n                        }\n                    }\n                    \n                    \/\/ \u54c1\u8cea\u30c1\u30a7\u30c3\u30af\n                    if (generatedText.length >= 20 &amp;&amp; \n                        generatedText.length &lt;= 200 &amp;&amp;\n                        !generatedText.includes('undefined') &amp;&amp;\n                        generatedText.length > bestText.length) {\n                        bestText = generatedText;\n                    }\n                }\n            } catch (genError) {\n                continue;\n            }\n        }\n        \n        if (!bestText || bestText.length &lt; 10) {\n            bestText = \"\u65b0\u3057\u3044\u30a2\u30a4\u30c7\u30a2\u306b\u3064\u3044\u3066\u8003\u3048\u3066\u3044\u307e\u3059\u3002\u7686\u3055\u3093\u306e\u610f\u898b\u3082\u805e\u304d\u305f\u3044\u3067\u3059\u306d\u3002\";\n        }\n        \n        return bestText;\n        \n    } catch (error) {\n        addLog('bot-log', `\u30de\u30eb\u30b3\u30d5\u751f\u6210\u30a8\u30e9\u30fc: ${error.message}`, 'error');\n        return \"\u30de\u30eb\u30b3\u30d5\u9023\u9396\u3067\u81ea\u7136\u306a\u6587\u7ae0\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059\u3002\";\n    }\n}\n\nfunction postMarkovBot() {\n    const content = generateMarkovText();\n    if (createPost(content, 'markov', 'MarkovBOT')) {\n        addLog('bot-log', `\u30de\u30eb\u30b3\u30d5\u6295\u7a3f: \"${content.substring(0, 40)}...\"`, 'success');\n    }\n}\n\nfunction startBotAutoPost() {\n    const interval = parseInt(document.getElementById('botIntervalSec').value) || 60;\n    if (interval &lt; 10) {\n        alert('\u9593\u9694\u306f10\u79d2\u4ee5\u4e0a\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        return;\n    }\n    \n    stopBotAutoPost();\n    \n    \/\/ \u521d\u56de\u6295\u7a3f\n    setTimeout(postMarkovBot, 2000);\n    \n    botInterval = setInterval(() => {\n        postMarkovBot();\n    }, interval * 1000);\n    \n    updateStatusIndicators();\n    addLog('bot-log', `\u30de\u30eb\u30b3\u30d5BOT\u81ea\u52d5\u6295\u7a3f\u958b\u59cb (${interval}\u79d2\u9593\u9694)`, 'success');\n}\n\nfunction stopBotAutoPost() {\n    if (botInterval) {\n        clearInterval(botInterval);\n        botInterval = null;\n        updateStatusIndicators();\n        addLog('bot-log', '\u30de\u30eb\u30b3\u30d5BOT\u81ea\u52d5\u6295\u7a3f\u3092\u505c\u6b62\u3057\u307e\u3057\u305f', 'info');\n    }\n}\n\n\/\/ === RSS\u6a5f\u80fd\uff08\u5b8c\u5168\u4fee\u6b63\u7248\uff09 ===\nfunction addDefaultFeeds() {\n    let addedCount = 0;\n    DEFAULT_FEEDS.forEach(url => {\n        if (!feedUrls.includes(url)) {\n            feedUrls.push(url);\n            addedCount++;\n        }\n    });\n    \n    if (addedCount > 0) {\n        saveData();\n        renderFeedList();\n        addLog('rss-log', `${addedCount}\u4ef6\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30d5\u30a3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f`, 'success');\n    } else {\n        addLog('rss-log', '\u3059\u3079\u3066\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30d5\u30a3\u30fc\u30c9\u306f\u65e2\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u307e\u3059', 'info');\n    }\n}\n\nfunction registerFeedUrl() {\n    const url = document.getElementById('feedUrl').value.trim();\n    if (!url) {\n        alert('URL\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        return;\n    }\n    \n    if (!url.startsWith('http')) {\n        alert('\u6709\u52b9\u306aURL\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\uff08http:\/\/\u307e\u305f\u306fhttps:\/\/\u3067\u958b\u59cb\uff09\u3002');\n        return;\n    }\n    \n    if (feedUrls.includes(url)) {\n        alert('\u3053\u306e\u30d5\u30a3\u30fc\u30c9\u306f\u65e2\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u307e\u3059\u3002');\n        return;\n    }\n    \n    feedUrls.push(url);\n    saveData();\n    renderFeedList();\n    document.getElementById('feedUrl').value = '';\n    addLog('rss-log', `\u30d5\u30a3\u30fc\u30c9\u767b\u9332: ${url}`, 'success');\n}\n\nfunction removeFeedUrl(index) {\n    if (confirm('\u3053\u306e\u30d5\u30a3\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f')) {\n        const removedUrl = feedUrls&#91;index];\n        feedUrls.splice(index, 1);\n        saveData();\n        renderFeedList();\n        addLog('rss-log', `\u30d5\u30a3\u30fc\u30c9\u524a\u9664: ${removedUrl}`, 'info');\n    }\n}\n\nfunction renderFeedList() {\n    const feedList = document.getElementById('feed-list');\n    if (feedUrls.length === 0) {\n        feedList.innerHTML = '&lt;div class=\"text-gray-500\">\u767b\u9332\u3055\u308c\u305f\u30d5\u30a3\u30fc\u30c9\u306f\u3042\u308a\u307e\u305b\u3093&lt;\/div>';\n        return;\n    }\n    \n    feedList.innerHTML = feedUrls.map((url, index) => `\n        &lt;div class=\"rss-item flex items-center justify-between\">\n            &lt;span class=\"text-xs truncate flex-1\" title=\"${url}\">${url}&lt;\/span>\n            &lt;button onclick=\"removeFeedUrl(${index})\" class=\"text-red-500 hover:text-red-700 ml-2 text-xs\">\n                &lt;i class=\"fas fa-times\">&lt;\/i>\n            &lt;\/button>\n        &lt;\/div>\n    `).join('');\n}\n\n\/\/ \u6539\u826f\u3055\u308c\u305fRSS\u53d6\u5f97\u6a5f\u80fd\nasync function fetchAllFeeds() {\n    if (feedUrls.length === 0) {\n        addLog('rss-log', 'RSS\u30d5\u30a3\u30fc\u30c9\u304c\u767b\u9332\u3055\u308c\u3066\u3044\u307e\u305b\u3093', 'error');\n        return;\n    }\n    \n    addLog('rss-log', `RSS\u53d6\u5f97\u958b\u59cb (${feedUrls.length}\u4ef6\u306e\u30d5\u30a3\u30fc\u30c9)`, 'info');\n    let successCount = 0;\n    let errorCount = 0;\n    \n    for (let i = 0; i &lt; feedUrls.length; i++) {\n        const url = feedUrls&#91;i];\n        \n        try {\n            addLog('rss-log', `&#91;${i + 1}\/${feedUrls.length}] \u53d6\u5f97\u4e2d: ${url.substring(0, 50)}...`, 'info');\n            \n            const success = await fetchSingleFeed(url);\n            if (success) {\n                successCount++;\n                addLog('rss-log', `\u2713 \u6210\u529f: ${url.substring(0, 50)}...`, 'success');\n            } else {\n                errorCount++;\n                addLog('rss-log', `\u2717 \u5931\u6557: ${url.substring(0, 50)}...`, 'error');\n            }\n            \n        } catch (error) {\n            errorCount++;\n            addLog('rss-log', `\u2717 \u30a8\u30e9\u30fc: ${error.message}`, 'error');\n        }\n        \n        \/\/ \u30ec\u30fc\u30c8\u5236\u9650\u5bfe\u7b56\uff08\u30d5\u30a3\u30fc\u30c9\u9593\u306b\u5f85\u6a5f\u6642\u9593\uff09\n        if (i &lt; feedUrls.length - 1) {\n            await sleep(2000);\n        }\n    }\n    \n    stats.rssSuccess += successCount;\n    stats.rssErrors += errorCount;\n    \n    const resultMsg = `RSS\u53d6\u5f97\u5b8c\u4e86: \u6210\u529f ${successCount}\u4ef6 \/ \u30a8\u30e9\u30fc ${errorCount}\u4ef6`;\n    addLog('rss-log', resultMsg, successCount > 0 ? 'success' : 'error');\n    \n    if (successCount > 0) {\n        saveData();\n    }\n}\n\nasync function fetchSingleFeed(feedUrl) {\n    const apis = &#91;\n        \/\/ API 1: rss2json\n        async () => {\n            const response = await fetchWithTimeout(\n                `https:\/\/api.rss2json.com\/v1\/api.json?rss_url=${encodeURIComponent(feedUrl)}&amp;count=5`,\n                10000\n            );\n            const data = await response.json();\n            \n            if (data.status !== 'ok') {\n                throw new Error(data.message || 'RSS API error');\n            }\n            \n            return data.items || &#91;];\n        },\n        \n        \/\/ API 2: allorigins\n        async () => {\n            const response = await fetchWithTimeout(\n                `https:\/\/api.allorigins.win\/get?url=${encodeURIComponent(feedUrl)}`,\n                10000\n            );\n            const data = await response.json();\n            \n            if (!data.contents) {\n                throw new Error('No contents returned');\n            }\n            \n            return parseRSSContent(data.contents);\n        }\n    ];\n    \n    for (const api of apis) {\n        try {\n            const items = await api();\n            return await processRSSItems(items, feedUrl);\n        } catch (error) {\n            continue;\n        }\n    }\n    \n    return false;\n}\n\nasync function processRSSItems(items, feedUrl) {\n    if (!items || items.length === 0) {\n        return false;\n    }\n    \n    let processedCount = 0;\n    \n    for (const item of items.slice(0, 3)) { \/\/ \u6700\u59273\u4ef6\u307e\u3067\n        if (!item.title || !item.link) continue;\n        \n        \/\/ \u91cd\u8907\u30c1\u30a7\u30c3\u30af\n        if (processedItems.has(item.link)) {\n            continue;\n        }\n        \n        const cleanTitle = cleanHTML(item.title).substring(0, 100);\n        const cleanDescription = item.description \n            ? cleanHTML(item.description).substring(0, 150) \n            : '';\n        \n        const content = createRSSPostContent(cleanTitle, cleanDescription, item.link, feedUrl);\n        \n        if (createPost(content, 'feed', 'RSS Feed')) {\n            processedCount++;\n            processedItems.add(item.link);\n            \n            \/\/ \u6295\u7a3f\u9593\u306e\u9593\u9694\n            if (processedCount &lt; 3) {\n                await sleep(1000);\n            }\n        }\n    }\n    \n    return processedCount > 0;\n}\n\nfunction createRSSPostContent(title, description, link, feedUrl) {\n    const feedDomain = new URL(feedUrl).hostname;\n    \n    return `\n        &lt;div class=\"border-l-4 border-blue-500 pl-4 bg-gray-50 dark:bg-gray-700 rounded-r-lg p-3\">\n            &lt;h4 class=\"font-semibold mb-2 text-gray-900 dark:text-white\">${title}&lt;\/h4>\n            ${description ? `&lt;p class=\"text-sm text-gray-600 dark:text-gray-300 mb-3\">${description}${description.length >= 150 ? '...' : ''}&lt;\/p>` : ''}\n            &lt;div class=\"flex items-center justify-between\">\n                &lt;span class=\"text-xs text-gray-500 dark:text-gray-400\">\n                    &lt;i class=\"fas fa-globe mr-1\">&lt;\/i>${feedDomain}\n                &lt;\/span>\n                &lt;a href=\"${link}\" target=\"_blank\" class=\"text-blue-600 hover:text-blue-800 dark:text-blue-400 text-sm font-medium\">\n                    &lt;i class=\"fas fa-external-link-alt mr-1\">&lt;\/i>\u8a18\u4e8b\u3092\u8aad\u3080\n                &lt;\/a>\n            &lt;\/div>\n        &lt;\/div>\n    `;\n}\n\nfunction parseRSSContent(xmlContent) {\n    \/\/ \u7c21\u6613XML\u30d1\u30fc\u30b9\uff08\u5b9f\u88c5\u3092\u7c21\u7565\u5316\uff09\n    const items = &#91;];\n    const parser = new DOMParser();\n    const doc = parser.parseFromString(xmlContent, 'text\/xml');\n    \n    const rssItems = doc.querySelectorAll('item');\n    rssItems.forEach(item => {\n        const title = item.querySelector('title')?.textContent;\n        const link = item.querySelector('link')?.textContent;\n        const description = item.querySelector('description')?.textContent;\n        \n        if (title &amp;&amp; link) {\n            items.push({ title, link, description });\n        }\n    });\n    \n    return items;\n}\n\nfunction cleanHTML(text) {\n    if (!text) return '';\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = text;\n    return (tempDiv.textContent || tempDiv.innerText || '').trim();\n}\n\nasync function fetchWithTimeout(url, timeout = 10000) {\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n    \n    try {\n        const response = await fetch(url, {\n            signal: controller.signal,\n            headers: {\n                'Accept': 'application\/json',\n                'User-Agent': 'Verse RSS Reader 2.0'\n            }\n        });\n        \n        if (!response.ok) {\n            throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n        }\n        \n        return response;\n    } finally {\n        clearTimeout(timeoutId);\n    }\n}\n\nfunction sleep(ms) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction startRSSAutoPost() {\n    const interval = parseInt(document.getElementById('feedIntervalSec').value) || 180;\n    if (interval &lt; 60) {\n        alert('\u9593\u9694\u306f60\u79d2\u4ee5\u4e0a\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        return;\n    }\n    \n    stopRSSAutoPost();\n    \n    \/\/ \u521d\u56de\u5b9f\u884c\uff08\u5c11\u3057\u9045\u5ef6\uff09\n    setTimeout(() => {\n        addLog('rss-log', '\u81ea\u52d5RSS\u53d6\u5f97\u306e\u521d\u56de\u5b9f\u884c\u3092\u958b\u59cb...', 'info');\n        fetchAllFeeds();\n    }, 5000);\n    \n    rssInterval = setInterval(() => {\n        addLog('rss-log', '\u5b9a\u671fRSS\u53d6\u5f97\u3092\u5b9f\u884c\u4e2d...', 'info');\n        fetchAllFeeds();\n    }, interval * 1000);\n    \n    updateStatusIndicators();\n    addLog('rss-log', `RSS\u81ea\u52d5\u53d6\u5f97\u958b\u59cb (${interval}\u79d2\u9593\u9694)`, 'success');\n}\n\nfunction stopRSSAutoPost() {\n    if (rssInterval) {\n        clearInterval(rssInterval);\n        rssInterval = null;\n        updateStatusIndicators();\n        addLog('rss-log', 'RSS\u81ea\u52d5\u53d6\u5f97\u3092\u505c\u6b62\u3057\u307e\u3057\u305f', 'info');\n    }\n}\n\n\/\/ === \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u6a5f\u80fd ===\nfunction uploadProfileIcon(event) {\n    const file = event.target.files&#91;0];\n    if (!file) return;\n    \n    if (file.size > 5 * 1024 * 1024) {\n        alert('\u753b\u50cf\u30b5\u30a4\u30ba\u306f5MB\u4ee5\u4e0b\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        return;\n    }\n    \n    const reader = new FileReader();\n    reader.onload = function(e) {\n        profile.icon = e.target.result;\n        updateAllUI();\n        saveData();\n        alert('\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u753b\u50cf\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f\uff01');\n    };\n    reader.readAsDataURL(file);\n}\n\nfunction saveProfile() {\n    const username = document.getElementById('username').value.trim();\n    const selfIntro = document.getElementById('self-intro').value.trim();\n    \n    if (username &amp;&amp; username.length > 20) {\n        alert('\u30e6\u30fc\u30b6\u30fc\u540d\u306f20\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        return;\n    }\n    \n    profile.username = username || '\u30b2\u30b9\u30c8\u30e6\u30fc\u30b6\u30fc';\n    profile.selfIntro = selfIntro;\n    \n    updateAllUI();\n    saveData();\n    alert('\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3092\u4fdd\u5b58\u3057\u307e\u3057\u305f\uff01');\n}\n\n\/\/ === UI\u66f4\u65b0 ===\nfunction updateAllUI() {\n    \/\/ \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u753b\u50cf\u66f4\u65b0\n    const profileIcon = document.getElementById('profile-icon');\n    const headerIcon = document.getElementById('header-profile-icon');\n    if (profileIcon) profileIcon.src = profile.icon;\n    if (headerIcon) headerIcon.src = profile.icon;\n    \n    \/\/ \u30e6\u30fc\u30b6\u30fc\u540d\u66f4\u65b0\n    const usernameElements = &#91;'username-preview', 'header-username'];\n    usernameElements.forEach(id => {\n        const element = document.getElementById(id);\n        if (element) element.textContent = profile.username;\n    });\n    \n    \/\/ \u81ea\u5df1\u7d39\u4ecb\u66f4\u65b0\n    const selfIntroPreview = document.getElementById('self-intro-preview');\n    if (selfIntroPreview) {\n        selfIntroPreview.textContent = profile.selfIntro || '\u307e\u3060\u81ea\u5df1\u7d39\u4ecb\u304c\u3042\u308a\u307e\u305b\u3093';\n    }\n    \n    \/\/ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u518d\u63cf\u753b\n    renderTimeline();\n    renderFeedList();\n}\n\nfunction updateCharCount() {\n    const postContent = document.getElementById('postContent');\n    const charCount = document.getElementById('char-count');\n    if (postContent &amp;&amp; charCount) {\n        const length = postContent.value.length;\n        charCount.textContent = `(${length}\/500)`;\n        charCount.style.color = length > 450 ? '#ef4444' : '';\n    }\n}\n\nfunction toggleDarkMode() {\n    isDarkMode = !isDarkMode;\n    if (isDarkMode) {\n        document.body.classList.add('dark');\n        document.body.style.background = 'linear-gradient(135deg, #1a202c 0%, #2d3748 100%)';\n    } else {\n        document.body.classList.remove('dark');\n        document.body.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';\n    }\n    saveData();\n}\n\n\/\/ === \u30a4\u30d9\u30f3\u30c8\u30ea\u30b9\u30ca\u30fc ===\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ \u6587\u5b57\u6570\u30ab\u30a6\u30f3\u30bf\u30fc\n    const postContent = document.getElementById('postContent');\n    if (postContent) {\n        postContent.addEventListener('input', updateCharCount);\n    }\n    \n    \/\/ \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u5165\u529b\u306e\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u66f4\u65b0\n    const usernameInput = document.getElementById('username');\n    const selfIntroInput = document.getElementById('self-intro');\n    \n    if (usernameInput) {\n        usernameInput.addEventListener('input', function() {\n            const username = this.value.trim() || '\u30b2\u30b9\u30c8\u30e6\u30fc\u30b6\u30fc';\n            document.getElementById('username-preview').textContent = username;\n            document.getElementById('header-username').textContent = username;\n        });\n    }\n    \n    if (selfIntroInput) {\n        selfIntroInput.addEventListener('input', function() {\n            const selfIntro = this.value.trim() || '\u307e\u3060\u81ea\u5df1\u7d39\u4ecb\u304c\u3042\u308a\u307e\u305b\u3093';\n            document.getElementById('self-intro-preview').textContent = selfIntro;\n        });\n    }\n});\n\n\/\/ === \u521d\u671f\u5316\u5b9f\u884c ===\nwindow.addEventListener('load', function() {\n    \/\/ \u30a2\u30d7\u30ea\u521d\u671f\u5316\n    initializeApp();\n    \n    \/\/ \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u60c5\u5831\u3092\u5165\u529b\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u8a2d\u5b9a\n    document.getElementById('username').value = profile.username || '';\n    document.getElementById('self-intro').value = profile.selfIntro || '';\n    \n    \/\/ \u30da\u30fc\u30b8\u7d42\u4e86\u6642\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\n    window.addEventListener('beforeunload', function() {\n        stopBotAutoPost();\n        stopRSSAutoPost();\n        saveData();\n    });\n});\n&lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[80,6,87],"tags":[3],"class_list":{"0":"post-26117","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-html","7":"category-web","9":"tag-programming"},"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26117"}],"version-history":[{"count":2,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26117\/revisions"}],"predecessor-version":[{"id":26119,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/26117\/revisions\/26119"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26117"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}